JSP——基本知识说明

JSP页面其实是一个Servlet。
JSP页面是在JSP容器种运行的。Servlet容器一般也是JSP容器。Tomcat就是一个Servlet/JSP容器。
第一次请求一个JSP页面时,Servlet/JSP容器要做两件事:
    1.将JSP页面转换成为一个JSP页面实现类,这是一个实现javax.servlet.jsp.JspPage接口或其子接口javax.servlet.jsp.HttpjspPage的Java类。JspPage是javax.servlet.Servlet的子接口,这样会使每个JSP页面都成为一个Servlet。
    2.如果转换成功,Servlet/JSP容器将会编译Servlet类。之后,容器加载和实例化Java字节码,并执行它通常对Servlet所做的生命周期操作。
对于同一个JSP页面的后续请求,Servlet/JSP容器会查看这个JSP页面自从最后一次转换以来是否修改过,如果修改过,就要重新转换编译并执行,如果没有,则执行内存中已存在的JSP Servlet。
在Tomcat中第一次调用完JSP页面后,就被转换为一个JSP Servlet。可以在Tomcat的work目录的子目录下查看所生成的Servlet文件。这个Servlet继承了org.apache.jasper.runtime.HttpJspBase,这是一个继承javax.servlet.http.HttpServlet并实现javax.servlet.jsp.HttpJspPage的抽象类。在转换成类名XXX_jsp的Servlet类中,JSP页面的主体被转换成为一个_jspService方法。这个方法在HttpJspPage中定义,并通过HttpJspBase中的service方法实现调用。
隐式对象
    Servlet容器将几个对象传给它所运行的Servlet。例如,在Servlet的service方法中获得HttpServletRequest和HttpServletResponse,并在init方法中获得ServletConfig。此外,还可以通过在HttpServletRequest对象中调用getSession获得HttpSession。
    在JSP中,可以通过使用隐式对象来获取哪些对象。例如,隐式对象request表示由Servlet/JSP容器传给Servlet的service方法的HttpServletRequest。可以像使用HttpServletRequest的变量一样使用request。
    pageContext是指为页面创建的javax.servlet.jsp.PageContext。它提供了有用的context信息,并通过一些名如其义的方法来访问与Servlet有关的各种对象,例如:getRequest、getResponse、getServletContext、getServletConfig和getSession。但他们所返回的对象可以通过隐式对象request、response、session及application直接访问。
    JSP隐式对象: request      javax.servlet.http.HttpServletRequest
                  response     javax.servlet.http.HttpServletResponse
                  out          javax.servlet.jsp.JspWriter
                  session      javax.servlet.http.HttpSession
                  application  javax.servlet.ServletContext
                  config       javax.servlet.ServletConfig
                  pageContext  javax.servlet.jsp.PageContext
                  page         javax.servlet.jsp.HttpJspPage
                  exception    javax.lang.Throwable
    PageContext中getAttribute和setAttribute方法进行存取属性。属性可以保存在以下4种范围种:page、request、session和application。
   
指令
    指令是第一种JSP句法元素,其指示JSP转换器应该如何将某个JSP页面转换成Servlet的命令。
    指令:page、include、taglib、tag、attribute和variable。
    page指令可以出现在页面的任何位置,当它包含contentType或者pageEncoding属性时,必须放到最前边。page指令可以多次出现,除import属性效果可以累积外,其它属性多次出现值必须唯一。
    include指令可以将另一个文件的内容放到当前JSP页面中。<%@include file="url"%>当url以“/”开头则为绝对路径,不以“/”开头则是相对于当前JSP页面的路径。
   
脚本元素
    Scriptlet是一个Java代码块,以<%开头,以%>结束。
    <%
        代码块,在一个Scriptlet中定义变量,在它后边的其它Scritplet中是可见的。
    %>
   
表达式
    表达式的运算结果会被填入隐式对象out的print方法中。表达式以<%开头,以%>结束。
    <%=java.util.Calendar.getInstance().getTime()%>注意表达式后边不需要用分号。
   
声明
    声明可以在JSP页面中定义变量和方法。声明要用<%!和%>包含。
    可以利用声明jspInit方法和jspDestroy方法覆盖实现类中的init和destroy方法。
    jspInit。该方法与javax.servlet.Servlet中的init方法类似,JSP页面被初始化时,就会调用jspInit。jspInit方法不带参数。
    jspDestroy。该方法与Servlet中的destroy方法相似,当JSP页面要被销毁时,就会调用它。
   
关闭脚本元素
    随着JSP2.0中EL的发展,建议做法是利用EL来访问服务器端的对象,而不是在JSP中编写Java代码。原本JSP2.0开启的脚本元素需要关闭。
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <scripting-invalid>true</scripting-invalid>
    </jsp-property-group>
   
动作
    useBean(现在很少使用)
        将创建一个与某个Java对象相关的脚本变量。它是将表现逻辑与业务逻辑分隔开来的最容易的方法之一。
        例:<body>
            <jsp:useBean id="today" class="java.util.Date"/>
            <%=today%>
            </body>
    setProperty和getProperty
        setProperty:在一个Java对象中保存一个属性
        getProperty:获取一个Java对象的属性
        例:<body>
            <jsp:useBean id="employee" class="app03a.Employee"/>
            <jsp:setProperty name="employee" property="firstName" value="Abigail"/>
            First Name: <jsp:getProperty name="employee" property="firstName"/>
            </body>
    include
        include用于包含另一个资源,可以是另一个JSP页面、一个Servlet或者一个静态的HTML页面。
        例:<body>
            <jsp:include page="jspf/menu.jsp">
                <jsp:param name="text" value="How are you?"/>
            </jsp:include>
            </body>
        使用include动作时,文件扩展名必须为jsp,以便它能够作为一个JSP页面进行处理。
    forward
        forward动作用于当前页面跳转到另一个不同的资源。
        例:<jsp:forward page="jspf/login.jsp">
                <jsp:param name="text" value="Please login"/>
            </jsp:forward>
    错误处理
        利用page指令的isErrorPage属性,把一个JSP页面变成一个错误处理页面。该属性值必须为true。
        例:errorHandler.jsp页面
             <%@page isErrorPage="true"%>
             <html>
             <head><title>Error</title></head>
             <body>
             An error has occurred. <br/>
             Error message :
             <%
             out println(exception.tostring());
             %>
             </body>
             </html>
        在其它页面引用该错误处理页面:<%@page errorPage="errorHandler.jsp"%>
        这样如果JSP页面抛异常,将会看到errorHandler.jsp页面信息。
posted @ 2019-08-12 14:25  !O0O!  阅读(238)  评论(0)    收藏  举报