zoukankan      html  css  js  c++  java
  • 重温JSP技术的使用

    1、前言

           大家应该都很清楚,JSP也是一种古老的技术了,在实际的项目中现在基本不用了,或许在很老的项目中可以看到。而现在 在前后端分离的时代,后端只需要返回JSON给前端就可以了,页面完全不需要后端管。那我们还需要学习JSP吗?要呀!尤其对于新手来说,JSP肯定要学习的,但是可以不用深入的学习JSP的各种内容,但至少再看到JSP的时候,你能知道什么是JSP,能看懂JSP的代码。而且对于新手来说,刚刚开始学习JavaWeb的时候,前端页面更多使用的是JSP。所以不要求JSP很精通,但起码看到要会使用吧。虽然现在市面上有许多代替JSP的产品了,如常见的模板引擎如:freemarker、Thymeleaf、Velocity等。它的用法跟JSP差不太多,但JSP出现的最早,它是大哥,所以我们还是跟着大哥一步一步的走吧。

    9150e4e5ly1fjp7o0p8lag206o06ojrq

    2、JSP技术的简介

           JSP是Java Server Pages的简称,即Java服务器页面。它是由Sun公司倡导的一种用于开发动态网页的技术标准。其特点就是在传统的网页HTML文件(*.htm、*.html)中插入Java程序段(Scriptlet)和JSP标记(Tag)。从而形成JSP文件(*.jsp)。其中HTML提供静态的数据,而JSP技术允许在页面中嵌套Java代码,所以它提供动态数据,不过一般不会在JSP页面中编写Java代码,只是在JSP页面中动态获取数据。

           其实JSP本身就是一种Servlet。因为JSP在被访问后会被编译为一个Java类,该类继承了HttpJspBase,而HttpJspBase类又继承了HttpServlet。所以我们访问JSP时,其实不是在访问JSP,而是在访问JSP编译过后的那个Servlet。因为Servlet输出HTML非常困难,所以JSP就是替代Servlet输出HTML的。

           我们随便找一个JSP页面(注意:如果Tomcat没有配置全局变量的话,Tomcat编译jsp产生的java和class文件默认存储在C盘tomcat的work目录下)

    image

        然后打开index_jsp.java文件查看:

    package org.apache.jsp;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.jsp.*;
    
    public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
        implements org.apache.jasper.runtime.JspSourceDependent,
                     org.apache.jasper.runtime.JspSourceImports {
    
      private static final javax.servlet.jsp.JspFactory _jspxFactory =
              javax.servlet.jsp.JspFactory.getDefaultFactory();
    
      private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
    
      private static final java.util.Set<java.lang.String> _jspx_imports_packages;
    
      private static final java.util.Set<java.lang.String> _jspx_imports_classes;
    
      static {
        _jspx_imports_packages = new java.util.HashSet<>();
        _jspx_imports_packages.add("javax.servlet");
        _jspx_imports_packages.add("javax.servlet.http");
        _jspx_imports_packages.add("javax.servlet.jsp");
        _jspx_imports_classes = null;
      }
    
      private volatile javax.el.ExpressionFactory _el_expressionfactory;
      private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
    
      public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
        return _jspx_dependants;
      }
    
      public java.util.Set<java.lang.String> getPackageImports() {
        return _jspx_imports_packages;
      }
    
      public java.util.Set<java.lang.String> getClassImports() {
        return _jspx_imports_classes;
      }
    
      public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
        if (_el_expressionfactory == null) {
          synchronized (this) {
            if (_el_expressionfactory == null) {
              _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
            }
          }
        }
        return _el_expressionfactory;
      }
    
      public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
        if (_jsp_instancemanager == null) {
          synchronized (this) {
            if (_jsp_instancemanager == null) {
              _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
            }
          }
        }
        return _jsp_instancemanager;
      }
    
      public void _jspInit() {
      }
    
      public void _jspDestroy() {
      }
    
      public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
          throws java.io.IOException, javax.servlet.ServletException {
    
        final java.lang.String _jspx_method = request.getMethod();
        if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
          response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS");
          return;
        }
    
        final javax.servlet.jsp.PageContext pageContext;
        javax.servlet.http.HttpSession session = null;
        final javax.servlet.ServletContext application;
        final javax.servlet.ServletConfig config;
        javax.servlet.jsp.JspWriter out = null;
        final java.lang.Object page = this;
        javax.servlet.jsp.JspWriter _jspx_out = null;
        javax.servlet.jsp.PageContext _jspx_page_context = null;
    
    
        try {
          response.setContentType("text/html;charset=UTF-8");
          pageContext = _jspxFactory.getPageContext(this, request, response,
          			null, true, 8192, true);
          _jspx_page_context = pageContext;
          application = pageContext.getServletContext();
          config = pageContext.getServletConfig();
          session = pageContext.getSession();
          out = pageContext.getOut();
          _jspx_out = out;
    
          out.write("
    ");
          out.write("<html>
    ");
          out.write("  <head>
    ");
          out.write("    <title>Hello</title>
    ");
          out.write("  </head>
    ");
          out.write("
    ");
          out.write("  <body>
    ");
          out.write("    Hell Word!
    ");
          out.write("    Hello Servlet!
    ");
          out.write("    Hello JSP!
    ");
          out.write("  </body>
    ");
          out.write("</html>
    ");
        } catch (java.lang.Throwable t) {
          if (!(t instanceof javax.servlet.jsp.SkipPageException)){
            out = _jspx_out;
            if (out != null && out.getBufferSize() != 0)
              try {
                if (response.isCommitted()) {
                  out.flush();
                } else {
                  out.clearBuffer();
                }
              } catch (java.io.IOException e) {}
            if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
            else throw new ServletException(t);
          }
        } finally {
          _jspxFactory.releasePageContext(_jspx_page_context);
        }
      }
    }
    
    jsp编译成的java文件

        从上面可以看出,index.jsp在运行被访问后解析成了一个Java类index_jsp.java。该类继承与于org.apache.jasper.runtime.HttpJspBase基类,而HttpJspBase又继承了HttpServlet类,所以说JSP本身就是一种Servlet。

        既然知道JSP会被编译成一个Java类,而且生成了许多方法,而这些方法关系到JSP如何初始化,返回数据,JSP的销毁,我们来看看吧。

        JSP的工作方式是请求/应答模式,客户端发出HTTP请求,JSP收到请求后进行处理,并返回处理结果。在一个JSP文件首次被请求时,JSP引擎首先把这个JSP文件转换成一个Servlet,而该引擎本身也是一个Servlet。运行过程如下:

    1. JSP引擎首先把该JSP文件转换成一个Java源文件(Servlet),在转换时,如果发现JSP文件中有任何语法错误,则中断转换过程,并向服务端和客户端输出错误信息。
    2. 如果转换成功,JSP引擎用javac把该Java源文件编译成相应的class文件。
    3. 创建一个Servlet(JSP页面的转换结果)实例,该Servlet的jspInit()方法被执行,jspInit()方法在Servlet生命周期中只调用一次。
    4. 用jspService()方法处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理。如果多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程来处理每个请求。由于该Servlet始终驻留与内存,所以可以非常迅速的响应客户端的请求。
    5. 如果JSP文件被修改了,服务器将根据设置决定是否对该文件重新编译,如果需要重新编译,则将以编译结果取代内存中的Servlet,并继续以上过程。
    6. 虽然JSP的效率很高,但首次调用时,由于需要转换和编译,会有一些轻微的延迟。此外,在任何时候,由于系统资源不足的原因,JSP引擎将以某种不确定的方式将Servlet中从内存中移去。在此情况下,jspDestroy()方法首先被调用,然后Servlet实例将被回收。

       JSP的执行过程可以用如下图表示:

    image


    JSP技术的特点:JSP技术所开发的web应用程序是基于Java的,它拥有Java跨平台的特性,以及业务代码分离,组建重用,基础Java Servlet功能和预编译功能。

    • 跨平台:由于JSP是基于Java语言的,因而它可以使用Java的API,所以也是跨平台的,可以应用在Windows、Linux、Mac和Solaris。
    • 业务代码分离:采用JSP开发的项目,通常使用HTML语言来设计和格式化静态页面内容,而使用JSP标签来实现动态部分,业务代码通常使用Servlet、Struts、Springmvc等业务控制层来处理,从而实现业务层和视图层分离,这样,JSP只负责显示数据即可,这样,修改业务代码不会影响JSP页面代码。
    • 组件重用:JSP中,可以使用JavaBean编写业务组件,也就是使用一个JavaBean封装业务处理代码或者作为一个数据处理模型,这个JavaBean可以重复使用,也可以应用到其他应用程序中。
    • 继承Java Servlet功能:JSP的本质是Servlet,因此说JSP拥有Servlet的所有功能。
    • 预编译:用户首次通过浏览器访问JSP页面时,服务器对JSP页面代码进行编译,并且仅执行一次编译,编译后被保存,下次访问时直接执行编译过的代码,节约了服务器资源,提升了客户端访问速度。

    3、JSP的基础语法

    ①、JSP的注释

    在JSP中常用的注释有两种:显示注释和隐式注释。

    显示注释:

    • HTML注释:<!- - 注释内容- ->

    隐式注释:

    • Java注释://单行注释 、/*…多行注释…*/
    • JSP专有注释:<%- - 注释内容- -%>

    其中HTML注释在浏览器中查看源文件的时候是可以看得到的。

    而JAVA注释和JSP注释在浏览器中查看源文件时是看不到注释的内容的。


    ②、JSP的指令元素

    JSP指令(Directives)主要用来提供整个JSP网页的信息,并用来设定JSP网页的相关属性,例如:设置网页的编码格式,语法,信息等。

    JSP指令的基本语法格式为<%@ 指令 属性名="值" %>

    如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写,如下所示:

    <%@ page contentType="text/html;charset=gb2312"%>
    <%@ page import="java.util.Date"%>

    也可以合并来设置,如下所示:

    <%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>
    

    在JSP 2.0规范中共定义了三个指令:

    • page指令
    • include指令
    • taglib指令

    每个指令都有自己的属性,下面来介绍这三种指令。

    (1)page指令

    我们通过page指令来设置JSP页面的属性,它作用整个JSP页面,所以为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。page指令一共有13个属性,下面介绍一下:

    属性 参数 描述
    language java 主要用来指定用何种语言来解释JSP网页,目前只能有Java来解释
    import {package.class | package.*}, ... 指定此JSP网页引入哪些Java API
    extends package.class 指定此JSP网页产生的Servlet所继承的类
    pageEncoding characterSet | ISO-8859-1 指定此JSP网页的编码属性
    session true | false 指定此JSP网页是否使用session(默认true)
    buffer none | 8kb | sizekb 指定此JSP输出流是否有缓冲区(默认有,大小8KB的缓冲区)
    autoFlush true | false 指定此JSP输出流的缓冲区是否自动清除(默认true)
    isThreadSafe true | false 已经不使用了(默认true)
    info text 表示此JSP的网页信息
    erroPage relative_url 如果网页发生异常错误,则会重定向到指定的URL地址,前提是isErrorPage为true
    isErrorPage true | false 指定此JSP能否在发生错误是转向另一个URL(默认true)
    contentType mimeType;charset=characterSet  | text/html;charset=ISO-8859-1 指定此JSP网页的编码方式
    isElIgnored true | false 表示此JSP在执行时是否忽略EL表示(默认true)

    例如:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ page import="java.util.*" pageEncoding="utf-8" %>

    注意:这些指令必须包含在<%@ key=value …… %>中,而且只有import实现可以重复设置,其余属性只能设置一次或者不设置


    还有一点就是page指令的errorPage属性。我们可以在web.xml文件中使用<error-page>元素为整个Web应用程序设置错误处理页面。

      <error-page>元素有3个子元素,<error-code>、<exception-type>、<location> :

    • <error-code>子元素指定错误的状态码,例如:<error-code>404</error-code>
    • <exception-type>子元素指定异常类的完全限定名,例如:<exception-type>java.lang.ArithmeticException</exception-type>
    • <location>子元素指定以“/”开头的错误处理页面的路径,例如:<location>/404Error.jsp</location>
        <!--处理404错误-->
        <error-page>
            <error-code>404</error-code>
            <location>/404Error.jsp</location>
        </error-page>
        <!--处理500错误-->
        <error-page>
            <error-code>500</error-code>
            <location>/500Error.jsp</location>
        </error-page>

    而如果你在某个JSP的页面设置了errorPage属性如:<%@ page errorPage="/error.jsp" %>,那么在web.xml文件中设置的错误处理将不对该页面起作用。



    (2)include指令

    这个指令听名字是包含的意思。没错,include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。

    语法:<%@ include file="relativeURL"%>,其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。被引入的文件可以使用任意的扩展名,即使其扩展名是html。

    include指令使用举例:

    创建main.jsp、head.jsp和foot.jsp页面,分别作为jsp页面主体、头部和尾部,存放于Web根目录下,代码如下:

    main.jsp:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>主网页</title>
    </head>
    <body>
        <%@ include file="head.jsp"%>
        <hr>
        <%@ include file="foot.jsp"%>
    </body>
    </html>
    
    main.jsp

    head.jsp:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>这是网页head</title>
    </head>
    <body>
        这是网页head
    </body>
    </html>
    
    head.jsp

    foot.jsp:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>网页foot</title>
    </head>
    <body>
        这是网页foot
    </body>
    </html>
    
    foot.jsp

    运行结果如下:

    image

    当然还有一种方式:jsp:include指令。功能与@include类似,后面会介绍。

    @include指令和jsp:include指令的在于:

    • @include只是把别的页面内容包含进来,属于静态包含。
    • jsp:include为动态包含,如果被包含的页面是JSP,则先处理之后再将结果包含,而如果包含的是非*.jsp文件,则只是把文件内容静态包含进来。


    (3)taglib指令

    在JSP中,可以直接使用JSP提供的元素来完成特定的功能,而通过使用taglib指令,我们就可以在页面中使用自定义的标签,将标签库描述符文件导入到JSP页面即可。

    taglib指令的使用格式如下:

    <%@ taglib uri="tigLibURL" 或 tagDir="tagDir" prefix="tagPrefix" %>

    参数说明:

    • uri属性:定位标签库描述符的位置。唯一标识和前缀相关的标签库描述符,可以使用绝对或相对URL。
    • tagDir属性:指示前缀将被用于标识在WEV-INF/tags目录下的标签文件。
    • prefix属性:标签的前缀,区分多个自定义标签。不可以使用保留前缀和空前缀,遵循XML命名空间的命名约定。

    例如后面需要使用JSTL的代码:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <c:set var="name" value="hellojsp" />

    上面就是通过<c:set />标签将"hellojsp”值赋给变量name。



    ③、JSP的表达式

    JSP表达式、小脚本、声明这三者统称为JSP脚本表达式(expression),它用于将程序数据输出到客户端。下面对JSP表达式先进行讲解。

    JSP表达式的语法:<%= Java表达式 %>

    例如输出当前系统时间:

     <%= new java.util.Date() %> 

    JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…) 将数据输给客户端。JSP脚本表达式中的变量或表达式后面不能有分号(;)。


    ④、JSP的小脚本

    JSP脚本元素(基本不用)用来插入Java代码,这些Java代码将会出现在由当前JSP页面生成的Servlet中。

    JSP小脚本的语法:<% 多行Java代码 %>

    我们可以在里面定义变量、编写语句,调用方法,但是不能定义方法。

    <%
      //声明变量
      int sum=0;
    
      /*编写语句*/
      for (int i=1;i<=100;i++){
        sum+=i;
      }
      out.println("<h1>sum="+sum+"</h1>");
    %>

    多个脚本片断中的代码可以相互访问。单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句,例如:

    <%
      //声明变量
      int sum=0;
      /*编写语句*/
      for (int i=1;i<=100;i++){
    %>
    <%
        sum+=i;
      }
      out.println("<h1>sum="+sum+"</h1>");
    %>


    ⑤、JSP的声明

    JSP的声明用来在JSP页面中声明变量和定义方法。

    JSP的声明语法:<%! Java代码 %>,简单举例:

    <%! String color[]={"red","yellow","blue"};
        String getColor(int i){
            return color[i];
        }
    %>


    ⑥、JSP的动作标签

    在JSP中的动作标签包括:<jsp:param>、<jsp:include>、<jsp:forward>、<jsp:UseBean>、<jsp:getProperty>、<jsp:setProperty>、<jsp:plugin>。下面只介绍<jsp:include>和<jsp:forward>这两个。

    <jsp:include>在前面提到过,它可以包含一个静态或动态的文件。格式:<jsp:include page=”URL”>

    <jsp:forward>表示重定向到一个静态的HTML/JSP文件。格式:<jsp:forward page=”URL”>

    4、JSP的9大内置对象

           JSP页面中一共内置了9个对象,分别为:out、session、response、request、config、page、application、pageContext、exception。在所有的JSP页面均可使用,但是必须在脚本元素的表达式或代码段中才可使用(<%=使用内置对象%>或<%使用内置对象%>)使用。

       而这9大内置对象又分为四类类型:

    • 输入输出对象:out、response、request。
    • 通信控制对象:pageContext、session、application。
    • Servlet对象:page、config。
    • 错误处理对象:exception。

    下面依次介绍这9个内置对象的使用:

    对象名 类型 描述
    out javax.servlet.jsp.JspWriter 向客客户端、浏览器输出数据。
    request javax.servlet.ServletRequest 封装了来自客户端、浏览器的各种信息。
    response javax.servlet.SrvletContext 封装了服务器的响应信息。
    session javax.servlet.http.HttpSession 用来保存每个用户的信息,以便跟踪每个用户的操作状态。
    application javax.servlet.ServletContext 代表了当前应用程序的上下文。可以在不同的用户之间共享信息。
    exception javax.lang.Throwable 封装了JSP程序执行过程中发生的异常和错误信息。
    config javax.servlet.ServletConfig 封装了应用程序的配置信息。
    page javax.lang.Object JSP实现类的实例,它是当前JSP程序本身,通过这个可以对它进行访问。
    pageContext javax.servlet.jsp.PageContext 为JSP页面包装页面的上下文。管理对属于JSP中特殊可见部分中己经命名对象的该问。


    ①、out对象

    out对象是输出流,能把结果输出到网页上。获取方法: PrintWriter out = response.getWriter();

    常用的方法有两个:print(Object obj)和println(Object obj)。两者的区别就是out.println(Object obj)会在输出后的末尾加上换行符,而print则不会。

    out对象常用的方法如下:

    1. void clear():清除缓冲区的内容
    2. void clearBuffer():清除缓冲区的当前内容
    3. void flush():将缓冲内容flush到客户端浏览器
    4. int getBufferSize():返回缓冲大小,单位KB
    5. int getRemaining():返回缓冲剩余大小,单位KB
    6. isAutoFlush():返回缓冲区满时,是自动清空还是抛出异常
    7. void close():关闭输出流


    ②、request对象

    request表示客户端的请求。它包含了客户端的信息以及请求的信息,如请求那个文件,附带的地址参数等。每次客户端的请求都会产生一个request实例。request对象的常用方法如下:

    1. object getAttribute(String name):返回指定属性的属性值
    2. Enumeration getAttributeNames():返回所有可用属性名的枚举
    3. String getCharacterEncoding():返回字符编码方式
    4. int getContentLength():返回请求体的长度(以字节数)
    5. String getContentType():得到请求体的MIME类型
    6. ServletInputStream getInputStream():得到请求体中一行的二进制流
    7. String getParameter(String name):返回name指定参数的参数值
    8. Enumeration getParameterNames():返回可用参数名的枚举
    9. String[] getparameterValues(String name):返回包含参数name的所有值的数组
    10. String getProtocol():返回请求用的协议类型及版本号
    11. String getScheme():返回请求用的计划名,如:http https及ftp等
    12. int getServerPort():返回服务器接受此请求所用的端口号
    13. String getServerName():返回接受请求的服务器主机名
    14. BufferedReader getReader():返回解码过了的请求体
    15. String getRemoteAddr():返回发送此请求的客户端IP地址
    16. String getRemoteHost():返回发送此请求的客户端主机名
    17. void setAttribute(String key Object obj):设置属性的属性值
    18. String getRealPath(String path):返回一虚拟路径的真实路径
    19. void setCharacterEncoding(“gb2312”):设置接受参数的字符集


    ③、response对象

    response对象代表客户端的响应。服务器端的任何输出都通过response对象发送到客户端浏览器。每次服务器端都会响应一个response实例。response对象的常用方法如下:

    1. String getCharacterEncoding():返回响应用的是何种字符编码
    2. ServletOutputStream getOutputStream():返回响应的一个二进制输出流
    3. PrintWriter getWriter():返回可以向客户端输出字符的一个对象
    4. void setContentLength(int len):设置响应头长度
    5. void setContentType(String type):设置响应的MIME类型
    6. sendRedirect(java.lang.String location):重新定向客户端的请求
    7. void setCharacterEncoding(“gb2312”):设置响应头的字符集


    ④、session对象

    session与cookie是记录客户访问信息的两种机制,session是用于服务器端保存用户信息,cookie用于在客户端保存用户信息。Servlet中通过request.getSession()来获取session对象,而JSP中可以直接使用。如果JSP中配置了<%@page session=”false”%>,则隐藏对象session不可用。每个用户对应一个session对象。session对象的常用方法如下:

    1. long getCreationTime():返回Session创建时间
    2. public String getId():返回Session创建时JSP引擎为它设的唯一ID号
    3. long getLastAccessedTime():返回此Session里客户端最近一次请求时间
    4. int getMaxInactiveInterval():返回两次请求间隔多长时间此Session被取消(ms)
    5. String[] getValueNames():返回一个包含此Session中所有可用属性的数组
    6. void invalidate():取消Session,使Session不可用
    7. boolean isNew():返回服务器创建的一个Session,客户端是否已经加入
    8. void removeValue(String name):删除Session中指定的属性
    9. void setAttribute(String key,Object obj):设置Session的属性
    10. Object getAttribute(String name):返回session中属性名为name的对象


    ⑤、application对象

    application封装JSP所在Web应用程序的信息,例如web.xml中国配置的全局的初始化信息。Servlet中application对象需要通过ServletConfig.getServletContext()来获取。整个Web应用程序对应一个application对象。application对象常用的方法如下:

    1. Object getAttribute(String name):返回application中属性为name的对象
    2. Enumeration getAttributeNames():返回application中的所有属性名
    3. void setAttribute(String name,Object value):设置application属性
    4. void removeAttribute(String name):移除application属性
    5. String getInitParameter(String name):返回全局初始话函数
    6. Enumeration getInitParameterNames():返回所有的全局初始话参数
    7. String getMimeType(String filename):返回文件的文档类型,例如getMimeType(“abc.html”)将返回“text.html”
    8. String getRealPath(String relativePath):返回Web应用程序内相对网址对应的绝对路径


    ⑥、exception对象

    exception封装了JSP中抛出的异常信息。要使用exception隐藏对象,需要设置<%@page isErrorPage”true”%>。隐藏对象exception通常被用来处理错误页面。


    ⑦、config对象

    隐藏对象config是javax.servlet.ServletConfig类的实例,ServletConfig封装了配置在web.xml中初始化JSP的参数。JSP中通过config获取这些参数。每个JSP文件中共有一个config对象。config对象的常用方法如表:

    1. String getInitParameter(String name):返回配置在web.xml中初始化参数
    2. Enumeration getInitParameterNames():返回所有的初始化参数名称
    3. ServletContext getServletContext():返回ServletContext对象
    4. String getServletName:返回Servlet对象


    ⑧、page对象

    page对象表示当前JSP页面,是当前JSP编译后的Servlet类的对象,想当于Java类中的关键字this。page对象在开发中几乎不用,了解一下即可。


    ⑨、pageContext对象

    隐藏对象pageContext为javax.servlet.jsp.PageContext类的实例。pageContext对象代表当前JSP页面编译后的内容。通过pageContext能够获取到JSP中的资源。pageContext常用方法如下:

    1. JspWriter getOut():返回out对象
    2. HttpSession getSession():返回Session对象(session)
    3. Object getPage():返回page对象
    4. ServletRequest getRequest():返回request对象
    5. ServletResponse getResponse():返回response对象
    6. void setAttribute(String name,Object attribute):设置属性及属性值 ,在page范围内有效
    7. void setAttribute(String name,Object obj,int scope):在指定范围内设置属性及属性值 ,int1=page,2=request,3=session,4=application
    8. public Object getAttribute(String name):取属性的值
    9. Object getAttribute(String name,int scope):在指定范围内取属性的值
    10. public Object findAttribute(String name):寻找一属性,返回起属性值或NULL
    11. void removeAttribute(String name):删除某属性
    12. void removeAttribute(String name,int scope):在指定范围删除某属性
    13. int getAttributeScope(String name):返回某属性的作用范围
    14. Enumeration getAttributeNamesInScope(int scope):返回指定范围内可用的属性名枚举
    15. void release():释放pageContext所占用的资源
    16. void forward(String relativeUrlPath):使当前页面重导到另一页面
    17. void include(String relativeUrlPath):在当前位置包含另一文件


    5、JSP的4种作用域

           JSP的4种作用域分别为:page域、request域、session域、application域。所谓的作用域就是通过setAttribute()设置一个属性之后,可以经过多少个其它页面后仍然可以通过getAttribute()获取到值的保存范围。所以我们在实际使用中,一定要区分内置对象的作用域。

       下面是JSP的4种作用域范围:

    1. page域:只在当前页面有效。
    2. request域:只在当前请求中有效。(也就是一次请求中有效,第二次请求就不能再获取到了)
    3. session域:在当前会话中有效,仅供单个用户使用。(也就是在此次打开的浏览器中有效,如果关闭浏览器再打开就失效了)
    4. application域:在整个服务器中保存数据,全部用户共享。(重启服务器后失效)


       JSP四种属性范围的使用场合:

    1. request:如果客户向服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域,像新闻数据,属于用户看完就没用的。
    2. session:如果客户向服务器发请求,产生的数据,用户用完了等一会儿还有用,像这样的数据就存在session域中,像购物数据,用户需要看到自己购物信息,并且等一会儿,还要用这个购物数据结帐。
    3. application(servletContext):如果客户向服务器发请求,产生的数据,用户用完了,还要给其它用户用,像这样的数据就存在application(servletContext)域中,像聊天数据。
  • 相关阅读:
    选择本地照片之后即显示在Img中(客户体验)
    解决JQuery.ajax.post乱码问题
    浅析MVC模式与三层架构的区别01
    照片上传(缩略图实现)
    基于Netty的聊天系统(三)协议定制----消息篇
    基于Netty的聊天系统(二)协议定制----登录篇
    基于Netty的聊天系统(一)通讯原理篇
    Centos6.5下配置SVN服务器
    FreeMarker-TemplateLoader
    移动UI自动化-Page Objects Pattern
  • 原文地址:https://www.cnblogs.com/tanghaorong/p/12771785.html
Copyright © 2011-2022 走看看