java Web jsp

作者: n油炸小朋友 | 来源:发表于2018-06-07 15:26 被阅读0次

    jsp是java web 的动态网页开发技术,jsp可以嵌套java代码,Tomcat在获得jsp后会把它转为servlet。

    tomcat在客户端第一次请求的时候编译jsp,tomcat可以自动检查jsp是否被改动,要是有改动,在下一次客户端请求页面的时候再次编译它。

    jsp本质上是servlet,所以生命周期和servlet一样。不同的是jsp是先部署后编译,servlet是先编译后部署。

    jsp被转为一个继承了org.apache.jasper.runtime.HttpJspBase类、实现了org.apache.jasper.runtime.JspSourceDependent接口的类。

    HttpJspBase的源码:
    HttpJspBase是HttpServlet的子类,

    1 /*
     2  * Licensed to the Apache Software Foundation (ASF) under one or more
     3  * contributor license agreements.  See the NOTICE file distributed with
     4  * this work for additional information regarding copyright ownership.
     5  * The ASF licenses this file to You under the Apache License, Version 2.0
     6  * (the "License"); you may not use this file except in compliance with
     7  * the License.  You may obtain a copy of the License at
     8  * 
     9  *      http://www.apache.org/licenses/LICENSE-2.0
    10  * 
    11  * Unless required by applicable law or agreed to in writing, software
    12  * distributed under the License is distributed on an "AS IS" BASIS,
    13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  * See the License for the specific language governing permissions and
    15  * limitations under the License.
    16  */
    17 
    18 package org.apache.jasper.runtime;
    19 
    20 import java.io.IOException;
    21 
    22 import javax.servlet.ServletConfig;
    23 import javax.servlet.ServletException;
    24 import javax.servlet.http.HttpServlet;
    25 import javax.servlet.http.HttpServletRequest;
    26 import javax.servlet.http.HttpServletResponse;
    27 import javax.servlet.jsp.HttpJspPage;
    28 
    29 import org.apache.jasper.compiler.Localizer;
    30 
    31 /**
    32  * This is the super class of all JSP-generated servlets.
    33  *
    34  * @author Anil K. Vijendran
    35  */
    36 public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {
    37     
    38     private static final long serialVersionUID = 1L;
    39 
    40     protected HttpJspBase() {
    41     }
    42 
    43     @Override
    44     public final void init(ServletConfig config) 
    45         throws ServletException 
    46     {
    47         super.init(config);
    48         jspInit();
    49         _jspInit();
    50     }
    51     
    52     @Override
    53     public String getServletInfo() {
    54         return Localizer.getMessage("jsp.engine.info");
    55     }
    56 
    57     @Override
    58     public final void destroy() {
    59         jspDestroy();
    60         _jspDestroy();
    61     }
    62 
    63     /**
    64      * Entry point into service.
    65      */
    66     @Override
    67     public final void service(HttpServletRequest request, HttpServletResponse response) 
    68         throws ServletException, IOException 
    69     {
    70         _jspService(request, response);
    71     }
    72     
    73     @Override
    74     public void jspInit() {
    75     }
    76 
    77     public void _jspInit() {
    78     }
    79 
    80     @Override
    81     public void jspDestroy() {
    82     }
    83 
    84     protected void _jspDestroy() {
    85     }
    86 
    87     @Override
    88     public abstract void _jspService(HttpServletRequest request, 
    89                                      HttpServletResponse response) 
    90         throws ServletException, IOException;
    91 }
    

    我们在jsp中写的html,都会在_jspService()方法中用out.write()方法写:


    image.png

    jsp的语法

    包括脚本(javascript、java代码)、指令、标签。

    jsp脚本
    1. javascript方式
      • <script></script>标签
      • 引入js的wenjian
    2. java代码方式
      • 在<% %>内部写java代码
      • 用<%= %>来输出结果
      • 在<%! %>中声明全局属性和全局方法
      • 注释:
    <%-- --%>  :jsp注释,
    //  :java单行注释
    /*  */  :Java多行注释
    <!-- -->   :这个注释,会发送到浏览器端的源码中显示
    
    jsp指令

    jsp指令是声明一些文档编码方式、文件类型等等。

    • JSP指令格式:
      <%@ directive {attribute=value}* %>
      derective:指令名称
      attribute=value:属性=值
      *:表示可以写多个
    1. directive :

      • page指令:
        用来声明JSP页面的属性等。
        (ps:page允许的指令在下面介绍)。

      • include指令
        <%@ include file="relativeURL"%>include指令会将包含页面的源代码添加到使用include指令的页面中来,然后编译成class文件,是静态包含。

      • taglib指令
        用来指明JSP页面内使用的JSP标签库,taglib指令有两个属性,uri为类库的地址,prefix为标签的前缀。
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

    2. 当指令为page时,可支持的属性
      如<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>这样

      • language 
        解释该JSP文件时采用的语言,一般为java语言,默认为java

      • extends 
        该JSP文件继承哪个类,需要实现Servlet的init、destroy等方法

      • import
        引入该JSP中用到的类、包等,import是唯一可以声明多次的page指令属性,一个import可以引用多个类,中间用英文逗号隔开

      • session
        取值为TRUE或FALSE,默认为TRUE,如果为true,则内置Session对象,可直接使用,否则反之

      • autoFlush
        是否运行缓存,默认为true;如果为true,则用out.println()等方法输出的字符串并不是立刻到达客户端服务器的,而是暂时存到缓存里,缓存满了或者程序执行完毕或者执行out.flush()操作时才到客户端

      • buffer
        取值为none或XXXkb,指定缓存大小,当autoFlush设为true时有效,例如<%@ page buffer=10kb%>

      • isThreadSafe
        是否线程安全,默认为false;如果为true,则运行多个线程同时运行该jsp程序,否则只运行一个线程,其余线程等待

      • isErrorPage 
        默认为false,指定该页面是否为错误显示页面;如果为true,则该JSP内置有一个Exception对象exception,可直接使用,否则没有

      • errorPage
        指明一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面。errorPage指定的页面通常isErrorPage属性为true,且内置的exception对象为未捕捉的异常

      • contentType
        客户端浏览器根据该属性判断文档类型,例如 HTML格式为text/html、纯文本格式为text/plain、JPG图像为image/jpeg、GIF图像为image/gif、WORD文档为application/msword,该属性常跟charset设置编码一起,作用是通知服务器和浏览器都使用同一个码表

      • pageEncoding
        指定一张码表来对该JSP页面进行编码

    jsp行为

    jsp的标签包括JSP自带内置的标签、通过taglib指令得到的JSP标签库的标签和自定义标签。其中jsp内置的标签就被称为jsp行为。

    格式:
    <jsp:elements {attribute="value"}* />

    jsp:标签的前缀,说明是jsp内置的标签,
    
    elements:行为的名称,
    
    attribute=value:使用键值对来编写属性
    
    *:能指定0个或多个属性对
    
    1. <jsp:include />行为
      这个行为将包含的jsp运行的结果包含进来,是动态包含。
      include指令是将包含的jsp代码包含进来一起编译,是静态包含。

    2. Java bean行为
      这是一组与Java Bean 相关的行为,包括useBean行为、setProperty行为、getProperty行为等。
      2.1 useBean行为
      <jsp:useBean id="beanObject" class="className" scope="Value">  作用:在jsp中定义一个java bean对象

    id:指明Java Bean对象的名称,JSP中可以使用该名称引用该Java Bean对象,相当于给new出来的对象取一个变量名,
    
    class:Java Bean类的全名
    
    scope:该java bean对象的作用范围,可以写的就四个,也就是JSP的四大作用域,page、request、session、application
    
      page:只能在当前JSP页面使用,如果不在JSP页面,那么就会失效
    
      request:这个前面学过,A页面请求转发到B页面,那么使用的是同一个request,那么A,B页面都算是request的作用域,也就是通过请求转发的页面都是其作用域
    
      session:该作用域在一个web项目下任何位置应该读访问的到,只要cookie不关闭,并且cookie设置的访问路径为"/",
    
      application:其实就是Servlet中的servletContext,服务器下的所有项目都能访问到。
    

    2.2 setProperty行为
    <jsp:setProperty name="beanName" property="propertyName" value="">
    作用:对bean对象的属性进行设置。
    2.3 getProperty行为
    <jsp:getProperty name="beanName" property="propertyName" />
    作用:获取JavaBean对象的某个属性值

    1. <jsp:forward />行为
      作用:请求转发
      格式:
    
    <jsp:forward page="someServlet">
    
       <jsp:param name="param1" value="value1"/>
    
       <jsp:param name="param2" value="value2"/>
    
    </jsp:forward>
    
    
    1. <jsp:directive/>行为
      相当于JSP指令,比如<jsp:directive.page/>相当于<%@ page %>指令

    jsp九大内置对象

    jsp内置了九个隐藏的对象,可以直接用。

    1. page:
      表示当前JSP页面,是当前JSP编译后的Servlet类的对象,相当于this
    2. config:
      标识Servlet配置,跟Servlet中的ServletConfig对象是一样的,能获取该servlet的一些配置信息,能够获取ServletContext
    3. application:
      标识web应用上下文,有共享数据、初始化全局参数、获取资源路径、获得指定路径下的所有内容的作用,相当于ServletContext
    4. request:
      请求对象
    5. response:
      响应对象
    6. session:
      表示一次会话,在服务器端记录用户状信息的技术
    7. out:
      输出响应体 类型:JspWriter
    8. exception :
      表示发生异常对象,类型 Throwable,isErrorPage属性设为true才有exception对象
    9. pageContext:
      表示 jsp页面上下文(jsp管理者) 类型:PageContext
    jsp四大作用域

    page、request、session、application

    pageContext对象的使用
    1. 获得其它八大内置对象 getXxx()
    2. 对作用域的属性进行操作(四大作用域)
    pageContext.getAttribute(name);  //获得page作用域数据
    
    pageContext.getAttribute(name,scope);  //获得 指定作用域中的数据
    
    pageContext.setAttribute(name,value);  //给page作用域设置内容
    
    pageContext.setAttribute(name,value, scope);//给指定作用域设置内容
    
    pageContext.removeAttribute(name);  //给page作用域移除内容
    
    pageContext.removeAttribute(name ,scope)  //移除指定作用域的内容
    //(page/request/session/application)
    
    1. 提供作用域常量

    PageContext.PAGE_SCOPE  page

    PageContext.REQUEST_SCOPE  request

    PageContext.SESSION_SCOPE  response

    PageContext.APPLICATION_SCOPE  application

    1. 一次获得指定名称内容
    findAttribute(name);  //依次从page、request、session、application 获得内容
    

    el表达式底层用的就是 findAttribute(name);
    如${user.username}就是依次从page、request、session、application作用域查找user对象,直到找到为止

    相关文章

      网友评论

        本文标题:java Web jsp

        本文链接:https://www.haomeiwen.com/subject/zjlgsftx.html