zoukankan      html  css  js  c++  java
  • JSP脚本中的9个内置对象

      JSP脚本中包含9个内置对象,这9个内置对象都是Servlet API接口的实例,只是JSP规范对它们进行了默认初始化(由JSP页面对应Servlet的_jspService()方法来创建这些实例)。

    •   application:javax.servlet.ServletContext的实例,该实例代表JSP所属的Web应用本身,可用于JSP页面,或者在Servlet之间交换信息,常用的方法有getAttribute(String attName)、setAttribute(String attName, String attValue) 和 getInitParameter(String paramName)等。
    •   config:javax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息。常用的方法有getInitParameter(String paramName)和getInitParameterNames()等方法。事实上,JSP页面通常无须配置,也就不存在配置信息,因此,该对象更多地在Servlet中有效。
    •   exception:java.lang.Throwable的实例,该实例代表其他页面中的异常和错误。只有当页面是错误处理页面时,该对象才可以使用。常用的方法有getMessage()和printStrackTrace()等。
    •   out:javax.servlet.jsp.JspWriter的实例,该实例代表JSP页面的输出流,用于输出内容,形成HTML页面。
    •   page:代表该页面本身,通常没有太大用处,也就是Servlet中的this,其类型就是生成的Servlet类,能用page的地方就能用this。
    •   pageContext:javax.servlet.jsp.PageContext的实例,该对象代表该JSP页面上下文,使用该对象可以访问页面中的共享数据。常用的方法有getServletContext()和getServletConfig()等。
    •   request:javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象里。获取客户端请求参数必须使用该对象,常用的方法有getParameter(String paramName)、getParameterValues(String paramName)、setAttribute(String attrName,Object attrValue)、getAttribute(String attrName)和setCharacterEncoding(String env)等。
    •   response:javax.servlet.http.HttpServletResponse的实例,代表服务器对客户端的响应。通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应。而response对象常用于重定向,常用的方法有getOutputStream()、sendRedirect(java.lang.String.location)等。
    •   session:javax.servlet.http.HttpSession的实例,该对象代表一次会话。当客户端浏览器与站点建立连接时,会话开始;当客户端关闭浏览器时,会话结束。常用的方法有:getAttribute(String attrName)、setAttribute(String attName, Object attrValue)等。

    详细说明:

      application对象代表web应用本身,因此使用application来操作web应用相关数据。application对象通常有如下两个作用:

    •   在整个web应用的多个JSP、Servlet之间共享数据。
      • 在JSP中设置和获取application中的变量的方法:applicatoin.setAttribute("demo","test"),application.getAttribute("demo");
      • 在Servlet中获取application中的变量:ServletContext sc = getServletConfig().getServletContext();sc.getAttribute("demo");
    •   访问web应用的配置参数。获取web.xml中的配置参数:application.getInitParameter("driver");。这些配置参数应该在web.xml文件中使用context-param元素配置,每个<context-param.../>元素配置一个参数,该元素有如下两个子元素。如:
    <context-param>
        <param-name>url</param-name>
        <param-value>www.baidu.com</param-value>
    </context-param>

      config对象代表当前JSP配置信息,但JSP页面通常无须配置,因此也就不存在配置信息。该对象在JSP页面中比较少用,但在Servlet中则用处相对较大,因为Servlet需要在web.xml文件中进行配置,可以指定配置参数。

      对所有的JSP页面,调用config.getServletName()返回的值都是jsp。也可以在web.xml文件中配置JSP(只是比较少用),这样就可以为JSP页面指定配置信息,并可为JSP页面另外配置一个URL。

      config对象是ServletConfig的实例,用于获取配置参数的方法是getInitParameter(String paramName)。配置JSP也是在web.xml文件中进行的,JSP被当成Servlet配置,如下:

    <servlet>
        <!--指定Servlet名字-->
        <servlet-name>config<servlet-name>
        <!-- 指定将哪个JSP页面配置成Servlet -->
        <jsp-file>/config.jsp</jsp-file>
        <!-- 配置名为name的参数,值为luxl -->
        <init-param>
            <param-name>name</param-name>
            <param-value>luxl</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <!-- 指定将config Servlet配置到/config路径 -->
        <servlet-name>config</servlet-name>
        <url-pattern>/config</url-pattern>
    </servlet-mapping>

      如果希望JSP页面可以获取web.xml配置文件中的配置信息,则必须通过为该JSP配置的路径来访问该页面,因为只有这也访问JSP页面才会让配置参数起作用。

      pageContext对象代表页面上下文,该对象主要用于访问JSP之间的共享数据。使用pageContext可以访问page、request、session、application范围的变量。

      它提供了两种方法访问page、request、session、application范围的变量。

    •   getAttribute(String name);取得page范围内的name属性。
    •   getAttribute(String name, int scope);取得指定范围内的name属性,其中scope可以是如下四个值:
      • PageContext.PAGE_SCOPE(=1):对应于page范围。
      • PageContext.REQUEST_SCOPE(=2):对应于request范围。
      • PageContext.SESSION_SCOPE(=3):对应于session范围。
      • PageContext.APPLICATION_SCOPE(=4):对应于application范围。

      与getAttribute()方法相对应的,PageContext也提供了2个对应的setAttribute()方法,用于将指定变量放入page、request、session、application范围内。

      pageContext还可用于获取其他内置对象:

    •   ServletRequest getRequest():获取request对象。
    •   ServletResponse getResponse():获取response对象。
    •   ServletConfig getServletConfig():获取config对象。
    •   ServletContext getServletContext():获取application对象。
    •   HttpSession getSession():获取session对象。

      request对象是JSP中重要的对象,所有的请求参数都被封装在request对象中,request课代表本次请求范围,因此还可用于操作request范围的属性。

      1)获取请求头/请求参数

        服务器端负责解析请求头/请求参数的就是JSP或Servlet,而JSP和Servlet获取请求参数的途径就是request,它提供了如下方法来获取请求参数:

    •     String getParameter(String paramName);获取paramName请求参数的值。
    •     Map getParameterMap();获取所有请求参数名和参数值所组成的Map对象。
    •     Enumeration getParameterNames();获取所有请求参数名所组成的Enumeration对象。
    •     String[] getParameterValues(String name);paramName请求参数的值,当该参数有多个值时,该方法将返回多个值所组成的数组。

        HttpServletRequest提供了如下方法访问请求头:

    •     String getHeader(String name);根据指定请求头的值。
    •     java.util.Enumeration<String> getHeaderNames();获取所有请求头的多个值)。
    •     java.utilEnumeration<String> getHeaders(String name);获取指定请求头的多个值。
    •     int getIntHeader(String name);获取指定请求头的值,并将该值转为整数值。

        请求有两种方式:GET和POST,GET请求传送的数据量较小,一般不能大于2KB,而POST请求参数的大小则往往取决于服务器的限制,但总比GET的数据量大,而且POST方式发送的请求参数以及对应的值放在HTML HEADER 中传输,用户不能在地址栏看到请求参数,安全性相对较高。一般提交数据都采用表单提交。

        提示,表单域和请求参数的关系遵循如下4点:

    •     每个有name属性的表单域对应一个请求参数。
    •     如果有多个表单域有相同的name属性,则多个表单域只生成一个请求参数,只是该参数有多个值。
    •     表单域的name属性指定请求参数名,value指定请求参数值。
    •     如果某个表单域设置disabled="disabled"属性,则该表单域不再生成请求参数。

        如果POST请求的请求参数里包含非西欧字符,则必须在获取请求参数之前先调用setCharacterEncoding()方法设置编码的字符集,并与请求时的编码格式一致。

        如果GET请求的请求参数里包含非西欧字符,调用setCharacterEncoding()是没有用的,需要采用URLDecoder.decode();解码才能正确解析请求参数,并且请求时的非西欧字符也要采用URLEncoder.encode();加密。还可以将请求参数转换为字节数组,在将字节数组重新解码成字符串,如下:

    byte[] rawBytes = rawName.getBytes("ISO-8859-1");
    String name = new String(rawBytes, "gb2312");

      2)执行forward或include

        HttpServletRequest类提供了一个getRequestDispatcher(String path)方法,其中path就是希望forward或者include的目标路径,该方法返回RequestDispatcher,该对象提供了如下两个方法:

    •     forward(ServletRequest request, ServletResponse response);执行forward。
    •     include(ServletRequest request, ServletResponse response);执行include。

        如下代码可以将a.jsp页面include到本页面中:

         getRequestDispatcher("/a.jsp").include(request,response);

        如下代码可以将请求forward到a.jsp页面:

         getRequestDispatcher("/a.jsp").forward(request,response);

        注:使用request的getRequestDispatcher(String path)方法,path字符串必须以斜线开头。

      response代表服务器对客户端的响应,大部分时候,程序无需使用response来响应客户端请求,因为有对象out,它更简单。但out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流,无法输出非字符内容。要想输出一个非字符流内容,必须使用response作为响应输出。还可以使用response来重定向请求,以及用于向客户端增加Cookie。

      重定向会丢失所有的请求参数,使用重定向的效果,与在地址栏里重新输入新地址再按回车键的效果完全一样,即发送了第二次请求。

      forward和redirect对比

    转发(forward)

    重定向(redirect)

    执行forward后依然是上一次请求

    执行redirect后生成第二次请求
    forward的目标页面可以访问原请求的请求参数,因为依然是同次请求,所有原请求的请求参数,request范围的属性全部存在

    redirect的目标页面不能访问原请求的请求参数,因为是第二次请求了,所有原请求的请求参数,request范围的属性全部丢失

    地址栏里请求的URL不会改变

    地址栏改为重定向的目标URL,相当于在浏览器地址栏里输入新的URL,后按回车键

      

      通过response还可以向客户端添加Cookie,通过response的如下方法:

        void addCookie(Cookie cookie);增加Cookie。

      增加Cookie的步骤如下:

    •     创建Cookie实例,Cookie的构造器为Cookie(String name, String value)。
    •     设置Cookie的生命期限,即该Cookie在多长时间内有效。
    •     向客户端写Cookie。

      访问客户端Cookie使用request对象,request对象提供了getCookies()方法,该方法返回客户端机器上所有Cookie组成的数组,遍历该数组的各个元素,找到希望访问的Cookie即可。

      示例代码:

    //获取本站在客户端上保留的所有Cookie
    Cookie[] cookies = request.getCookies();
    //遍历客户端上的每个Cookie
    for(Cookie c : cookies){
        //获取名为username的Cookie
        if(c.getName().equals("username")){
            out.println(c.getValue());
        }
    }

      注:使用Cookie对象必须设置其生存期限,否则Cookie将会随浏览器的关闭而自动消失。如果想要将中文字符设置到Cookie值,则需要将中文字符通过java.net.URLEncoder进行编码,然后赋给Cookie。

       session对象代表一次用户会话,一次用户会话的含义是:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止,这个过程就是一次会话。它通常用于跟踪用户的会话信息,如判断用户是否登录。session范围内的属性可以在多个页面的跳转之间共享,一旦关闭浏览器,session范围内的属性将全部消失。

      考虑session本身的目的,通常至应该把与用户会话状态相关的信息放入session范围内,不要仅仅为了页面之间的交换信息,就将信息放入session范围内。

      session的属性值可以是任何可序列化的Java对象。

  • 相关阅读:
    LiLicense server OR Activation code
    一个比喻讲明Docker是什么
    Linux 系统目录结构说明
    Sublime Text2支持Vue语法高亮显示
    javascript权威指南笔记[6-8]
    javascript权威指南笔记[1-5]
    使用chrome控制台调试js代码
    windows与linux下执行.class(包含main方法)
    linux 命令
    几种常见的编码格式
  • 原文地址:https://www.cnblogs.com/ScorchingSun/p/4011527.html
Copyright © 2011-2022 走看看