zoukankan      html  css  js  c++  java
  • 【JSP】JSP基础学习记录(三)—— 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的配置信息。常用的方法有getIniParameter(String paramName)和getInitParameternames()等方法。事实上,JSP页面通常无需配置,也就不存在配置信息。因此,该对象更多地在Servlet中有效。

      exception:java.lang.Throwable的实例,该实例代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令page的isError属性为true时,该对象才可以使用。常用的方法有getMessage()和printStackTrace()等。

      out:javax.servlet.jsp.JspWriter的实例,该实例代表JSP页面的输出流,用于输出内容,形成HTML页面。

      page:代表该页面本身,通常没有太大用处。也就是Servlet中的this,其类型就是生成的Servalet,能用page的地方就可用this。

      pageContext:javax.servlet.jsp.PageContext的实例,该对象代表该JSP页面上下文,使用该对象可以访问页面中的共享数据。常用的方法有getServletContext()和getS而vletConfig()等。

      request:javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象里。这是一个常用的对象,获取客户端请求参数必须使用该对象。常用的方法有getParameter(String paramName)、getParameterValues(String paramName)、setAttribute(String attName,Object attrValue)、getAttribute(String attName)和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 attrName,Object attrValue)等。

     3.1、application对象:

      application对于整个Web应用有效,一旦JSP、Servlet将数据放入application中,该数据将可以被该应用下其他所有的JSP、Servlet访问。

      下面新建一个页面,在页面用声明一个变量并自加1后存入application对象后输出。通过不同的浏览器(墨迹多台终端)访问。则会发现变量是不断累加的,由此可以说明整个Web应用共享一个application对象。

     1 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
     2     pageEncoding="ISO-8859-1"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
     7 <title>application</title>
     8 </head>
     9 <body>
    10     <%
    11         int i = application.getAttribute("i") != null ? (int) application.getAttribute("i") : 0;
    12         application.setAttribute("i", ++i);
    13     %>
    14     <p>
    15         i=<%=application.getAttribute("i")%></p>
    16 </body>
    17 </html>

      

      分别用Chrome、Firefox、QQ浏览器打开此页面,则会发现i变量是以次自增的。

      application还有一个重要用处:可用于获得Web应用的配置参数。web.config一般放在WEB-INF文件夹下,配置信息都存放在这里。如果项目中没有自动生成这个文件则自己新建一个。

     1 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
     2     pageEncoding="ISO-8859-1"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
     7 <title>application getInitParameter</title>
     8 </head>
     9 <body>
    10     <p>User Name=<%=application.getInitParameter("user") %></p>
    11     <p>PassWord=<%=application.getInitParameter("pwd") %></p>
    12 </body>
    13 </html>
     1 <?xml version="1.0" encoding="GBK"?>
     2 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     4     http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
     5     version="3.1">
     6     <!-- 设置项目起始页列表 -->
     7     <welcome-file-list>
     8         <welcome-file>/pages/index.jsp</welcome-file>
     9     </welcome-file-list>
    10     <context-param>
    11         <param-name>user</param-name>
    12         <param-value>sa</param-value>
    13     </context-param>    
    14     <context-param>
    15         <param-name>pwd</param-name>
    16         <param-value>123456</param-value>
    17     </context-param>
    18 </web-app>

      

     3.2、config对象:

      config对象代表当前JSP的配置信息,由于JSP不需要配置所以也很少使用该对象。

      配置JSP也是在web.xml文件中进行的,JSP被当成Servlet配置,为Servlet配置参数使用init-param元素,该元素可以接受param-name和param-value两个子元素,分别指定参数名和参数值。

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
     7 <title>Config</title>
     8 </head>
     9 <body>
    10     <P>ServletName:<%=config.getServletName() %></P>
    11     <p>Name:<%=config.getInitParameter("name") %></p>
    12     <p>Age:<%=config.getInitParameter("age") %></p>
    13 </body>
    14 </html>
     1 <?xml version="1.0" encoding="GBK"?>
     2 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     4     http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
     5     version="3.1">
     6     <!-- 设置项目起始页列表 -->
     7     <welcome-file-list>
     8         <welcome-file>/pages/index.jsp</welcome-file>
     9     </welcome-file-list>
    10     <context-param>
    11         <param-name>user</param-name>
    12         <param-value>sa</param-value>
    13     </context-param>    
    14     <context-param>
    15         <param-name>pwd</param-name>
    16         <param-value>123456</param-value>
    17     </context-param>
    18     
    19     <servlet>
    20         <!-- 置顶Servlet名称 -->
    21         <servlet-name>config</servlet-name>
    22         <jsp-file>/pages/3/3_2_1.jsp</jsp-file>
    23         <init-param>
    24             <param-name>name</param-name>
    25             <param-value>Clown</param-value>
    26         </init-param>
    27         <init-param>
    28             <param-name>age</param-name>
    29             <param-value>1024</param-value>
    30         </init-param>
    31     </servlet>
    32     <servlet>
    33         <!-- 置顶Servlet名称 -->
    34         <servlet-name>config2</servlet-name>
    35         <jsp-file>/pages/3/3_2_2.jsp</jsp-file>
    36         <init-param>
    37             <param-name>name</param-name>
    38             <param-value>Clown</param-value>
    39         </init-param>
    40         <init-param>
    41             <param-name>age</param-name>
    42             <param-value>1024</param-value>
    43         </init-param>
    44     </servlet>
    45     <servlet-mapping>
    46         <servlet-name>config</servlet-name>
    47         <url-pattern>/config</url-pattern>
    48     </servlet-mapping>
    49     <servlet-mapping>
    50         <servlet-name>config2</servlet-name>
    51         <url-pattern>/config2</url-pattern>
    52     </servlet-mapping>
    53 </web-app>

      

      通过上面这张截图可以发现,如果直接访问原地址是得不到配置文件中的信息的。若想得到web.xml中配置信息则需要访问配置中的路径。

     3.3、exception对象:

      exception对象是Throwable的实例,代表JSP脚本中产生的错误和异常,是JSP页面异常机制的一部分。

      exception对象仅在异常处理页面中有效,通过前面的异常处理结构,读者可以非常清晰地看出这点。

      

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8" errorPage="3_3_2.jsp"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
     7 <title>exception</title>
     8 </head>
     9 <body>
    10     <%
    11         int a = 1, b = 0;
    12         int c = a / b; // 此处故意执行一个错误
    13     %>
    14 </body>
    15 </html>
     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8" isErrorPage="true"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
     7 <title>Error Page</title>
     8 </head>
     9 <body>
    10     <p>异常类型是:<%=exception.getClass() %></p>
    11     <p>异常信息是:<%=exception.getMessage() %></p>
    12 </body>
    13 </html>

      注:3_3_1中page编译指令的errorPage属性指定当方法错误时跳转到3_3_2.jsp页面。并在3_3_2的page编译指令的isErrorPage属性设置为true。当访问3_3_1页面时则会得到如下这张截图。

      

     3.4、out对象:

      out对象代表一个页面输出流,通常用于在页面上输出变量值及常量。一般在使用输出表达式的地方,都可以使用out对象来达到同样效果。

      

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
     7 <title>config</title>
     8 </head>
     9 <body>
    10     <table style="border: 1px solid #ccc;">
    11         <%
    12             for (int i = 0; i < 10; i++) {
    13                 out.println("<tr>");
    14                 out.println("<td>");
    15                 out.println(i);
    16                 out.println("</td>");
    17                 out.println("</tr>");
    18             }
    19         %>
    20     </table>
    21 </body>
    22 </html>

     3.5、pageContext对象:

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

      getAttribute(String name):取得page范围内的name属性。

      getAttribute(String name,int scope):取得置顶范围内的name属性,其中scope可以是如下4个值。

        PageContext.PAGE_SCOPE:对应于page范围。

        PageContext.REQUEST_SCOPE:对应request范围。

        PageContext.SESSION_SCOPE:对应session范围。

        PageContext.APPLICATION_SCOPE:对应application范围。

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

      不仅如此、pageContext还可以获取到其他内置对象

        ServletRequest getRequest():获取request对象。

        ServletResponse getResponse():获取response对象。

        ServletConfig getServletConfig():获取config对象。

        ServletContext getServletContext():获取application对象。

        HttpSession getSession():获取session对象。

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
     7 <title>pageContext</title>
     8 </head>
     9 <body>
    10     <%
    11         // 用其他内置对象设置各范围内的值
    12         pageContext.setAttribute("pageName", "pageValue");
    13         request.setAttribute("requestName", "requestValue");
    14         session.setAttribute("sessionName", "sessionValue");
    15         application.setAttribute("applicationName", "applicationValue");
    16 
    17         // 用pageContext对象分别设置各范围内的值
    18         pageContext.setAttribute("pageContextPageName", "pageContextPageValue", pageContext.PAGE_SCOPE);
    19         pageContext.setAttribute("pageContextRequestName", "pageContextRepuestValue", pageContext.REQUEST_SCOPE);
    20         pageContext.setAttribute("pageContextSessionName", "pageContextSessionValue", pageContext.SESSION_SCOPE);
    21         pageContext.setAttribute("pageContextApplicationName", "pageContextApplicationValue",
    22                 pageContext.APPLICATION_SCOPE);
    23     %>
    24     <h4>用pageContext对象获取其他范围的值</h4>
    25     <p>pageName=<%=pageContext.getAttribute("pageName") %></p>
    26     <p>requestName=<%=pageContext.getAttribute("requestName",pageContext.REQUEST_SCOPE) %></p>
    27     <p>sessionName=<%=pageContext.getAttribute("sessionName",pageContext.SESSION_SCOPE) %></p>
    28     <p>applicationName=<%=pageContext.getAttribute("applicationName",pageContext.APPLICATION_SCOPE) %></p>
    29     </br>
    30     <h4>用其他内置对象获取pageContext设置在此范围内的值</h4>
    31     <p>pageContextPageName=<%=pageContext.getAttribute("pageContextPageName") %></p>
    32     <p>pageContextRequestName=<%=request.getAttribute("pageContextRequestName") %></p>
    33     <p>pageContextSessionName=<%=session.getAttribute("pageContextSessionName") %></p>
    34     <p>pageContextApplicationName=<%=application.getAttribute("pageContextApplicationName") %></p>
    35 </body>
    36 </html>

      

     3.6、request对象:

      request对象是JSP中重要的对象,每个request对象封装着以次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径。除此之外,request课代表本次请求范围,所以还可用于操作request范围的属性。

      

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

        String getParameter(String paramName):获取paramName请求参数的值。

        Map getParameterMap():获取所有请求参数名和参数值所组成的Map对象。

        Enumeration getParameterNames():获取所有请求参数名所组成的Enumeration对象。

        String[] getParameterValues(String name):paramName请求参数的值,当该请求参数有多个值时,该方法将返回多个值所组成的数组。

     1 <%@page import="java.util.Enumeration"%>
     2 <%@page import="java.util.Map"%>
     3 <%@page import="java.util.HashMap"%>
     4 <%@page import="javax.swing.ListModel"%>
     5 <%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
     6 <%@ page language="java" contentType="text/html; charset=UTF-8"
     7     pageEncoding="UTF-8"%>
     8 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     9 <html>
    10 <head>
    11 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    12 <title>request</title>
    13 </head>
    14 <body>
    15     <p>
    16         page=<%=request.getParameter("page")%></p>
    17     <h4>获取所有请求参数</h4>
    18     <%
    19         request.setCharacterEncoding("UTF-8"); // 如果POST请求参数涵盖中文则需要设置编码
    20         Enumeration<String> enumer = request.getParameterNames();
    21         if (enumer != null) {
    22             while (enumer.hasMoreElements()) {
    23                 String e = enumer.nextElement();
    24                 out.println(e + "=" + request.getParameter(e) + "<br/>");
    25             }
    26         }
    27     %>
    28     <h4>获取请求头</h4>
    29     <%
    30         Enumeration<String> heads = request.getHeaderNames();
    31         while (heads.hasMoreElements()) {
    32             String h = heads.nextElement();
    33             out.println(h + "-->" + request.getHeader(h) + "<br/>");
    34         }
    35     %>
    36 </body>
    37 </html>

      

      注:请注意浏览器地址栏,上面的例子为了省事所以使用的都是GET请求。如果GET请求参数包含非西欧字符的话自需要在“接收后”用java.net.URLDecoder.decode(String str,String stringCode);如果是POST请求则需要在“接收前”调用request.setCharacterEncoding(String stringCode);用来转换成正确的字符格式。

      request获取范围内的参数则可以使用getAttribute(String attName)设置则用setAttribute(String attName,Object attValue);用法与上文pageContext类似且多出说道则不在演示(懒... ...)。

     3.7、response对象:

      response代表服务器对客户端的响应。大部分时间,程序无须使用response来响应客户端请求。

      

      对于需要生成非字符响应的情况,就应该使用response来响应客户端请求。(例如:动态图片验证码)

      重定向是response的另外一个用处,与forward不同的是重定向会丢失所有的请求参数和request范围的属性,因为重定向将生成第二次请求(sendRedirect(String path))。

      Cookie通常用于网站记录客户的某些信息,例如用户名等不敏感的信息。Cookie是记录在用户磁盘上的,当在用户下一次访问该站且Cookie没过期的情况下则可以读取到历史设置的Cookie信息。创建一个Cookie的步骤:

        1、创建Cookie实例,Cookie的构造器为Cookie(String name,String value)。

        2、设置Cookie的生命周期,即该Cookie在多长时间内有效。否则当用户关闭浏览器后Cookie则失效。

        3、向客户端写入Cookie。

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
     7 <title>Cookie</title>
     8 </head>
     9 <body>
    10     <h4>设置Cookie</h4>
    11     <%
    12         // 第二次执行的时候注销掉这三行代码
    13         // Cookie ck = new Cookie("user", "Clown");
    14         // ck.setMaxAge(24 * 3600); // 一天内有效
    15         // response.addCookie(ck);
    16         Cookie[] cks = request.getCookies();
    17         for (Cookie ck : cks) {
    18             if (ck.getName().equals("user")) {
    19                 out.println("<input type='text' value='" + ck.getValue() + "'/>");
    20             }
    21         }
    22     %>
    23 </body>
    24 </html>

      

      注:当第一次执行时需把注释处的代码执行一下,用于向客户端写入Cookie。Cookie不允许出现中文字符,如果需要值为中文内容的Cookie可以借助于java.net.URLEncoder先对中文字符编码,取值后则反编码。

      

     3.8、session对象:

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

      注:考虑session本身的目的,通常只应该把与用户会化妆台相关的信息放入session范围内。不要仅仅为了两个页面之间交换信息,就将该信息放入session范围内。如果仅仅为了两个页面交换信息,可以将该信息放入request范围内,然后forward请求即可。

      session几只通常用于保存客户端的状态信息,这些状态信息需要保存到Web服务器的硬盘上,所以session里的属性值必须是可序列化的,否则将会引发不可序列化的错误。所以session的属性值可以是任何可序列化的Java对象。

     尾:

      由于现实工作中出现了一些问题,这些日子都在忙着解决,所以这篇草稿存了很久才写完。确切的说是抄李刚老师《轻量级Java EE 企业应用实战(第4版)——Struts2 + Spring4 + Hibernate》这本书,因为初学Java Web。很多东西东西都不敢轻易总结,且又感觉这本书中讲的很微妙。很容易就可以理解,所以大部分内容摘自书中的总结。小部分自己的总结与代码的编写。如果有兴趣的园友可以考虑这本书(希望尊重知识产权、倡导购买正版)。

  • 相关阅读:
    STM32 变量无法赋值问题
    ROS 多台计算机联网控制机器人
    Content-Disposition
    Arrays.asList()与toArray()
    length与size()
    computeIfAbsent
    共享锁、排他锁与意向锁
    行锁、页面锁与表锁
    classpath是什么
    start、run、join
  • 原文地址:https://www.cnblogs.com/MangoCai/p/4951704.html
Copyright © 2011-2022 走看看