【JSP】JSP基础学习记录(三)—— JSP的9个内置对象

时间:2023-03-08 19:22:22
【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对象。

 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
     pageEncoding="ISO-8859-1"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>application</title>
 </head>
 <body>
     <%
         int i = application.getAttribute("i") != null ? (int) application.getAttribute("i") : 0;
         application.setAttribute("i", ++i);
     %>
     <p>
         i=<%=application.getAttribute("i")%></p>
 </body>
 </html>

  【JSP】JSP基础学习记录(三)—— JSP的9个内置对象

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

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

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

  【JSP】JSP基础学习记录(三)—— JSP的9个内置对象

 3.2、config对象:

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

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

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Config</title>
 </head>
 <body>
     <P>ServletName:<%=config.getServletName() %></P>
     <p>Name:<%=config.getInitParameter("name") %></p>
     <p>Age:<%=config.getInitParameter("age") %></p>
 </body>
 </html>
 <?xml version="1.0" encoding="GBK"?>
 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
     http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
     version="3.1">
     <!-- 设置项目起始页列表 -->
     <welcome-file-list>
         <welcome-file>/pages/index.jsp</welcome-file>
     </welcome-file-list>
     <context-param>
         <param-name>user</param-name>
         <param-value>sa</param-value>
     </context-param>
     <context-param>
         <param-name>pwd</param-name>
         <param-value>123456</param-value>
     </context-param>

     <servlet>
         <!-- 置顶Servlet名称 -->
         <servlet-name>config</servlet-name>
         <jsp-file>/pages/3/3_2_1.jsp</jsp-file>
         <init-param>
             <param-name>name</param-name>
             <param-value>Clown</param-value>
         </init-param>
         <init-param>
             <param-name>age</param-name>
             <param-value>1024</param-value>
         </init-param>
     </servlet>
     <servlet>
         <!-- 置顶Servlet名称 -->
         <servlet-name>config2</servlet-name>
         <jsp-file>/pages/3/3_2_2.jsp</jsp-file>
         <init-param>
             <param-name>name</param-name>
             <param-value>Clown</param-value>
         </init-param>
         <init-param>
             <param-name>age</param-name>
             <param-value>1024</param-value>
         </init-param>
     </servlet>
     <servlet-mapping>
         <servlet-name>config</servlet-name>
         <url-pattern>/config</url-pattern>
     </servlet-mapping>
     <servlet-mapping>
         <servlet-name>config2</servlet-name>
         <url-pattern>/config2</url-pattern>
     </servlet-mapping>
 </web-app>

  【JSP】JSP基础学习记录(三)—— JSP的9个内置对象

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

 3.3、exception对象:

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

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

  

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

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

  【JSP】JSP基础学习记录(三)—— JSP的9个内置对象

 3.4、out对象:

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

  

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>config</title>
 </head>
 <body>
     <table style="border: 1px solid #ccc;">
         <%
             for (int i = 0; i < 10; i++) {
                 out.println("<tr>");
                 out.println("<td>");
                 out.println(i);
                 out.println("</td>");
                 out.println("</tr>");
             }
         %>
     </table>
 </body>
 </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对象。

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>pageContext</title>
 </head>
 <body>
     <%
         // 用其他内置对象设置各范围内的值
         pageContext.setAttribute("pageName", "pageValue");
         request.setAttribute("requestName", "requestValue");
         session.setAttribute("sessionName", "sessionValue");
         application.setAttribute("applicationName", "applicationValue");

         // 用pageContext对象分别设置各范围内的值
         pageContext.setAttribute("pageContextPageName", "pageContextPageValue", pageContext.PAGE_SCOPE);
         pageContext.setAttribute("pageContextRequestName", "pageContextRepuestValue", pageContext.REQUEST_SCOPE);
         pageContext.setAttribute("pageContextSessionName", "pageContextSessionValue", pageContext.SESSION_SCOPE);
         pageContext.setAttribute("pageContextApplicationName", "pageContextApplicationValue",
                 pageContext.APPLICATION_SCOPE);
     %>
     <h4>用pageContext对象获取其他范围的值</h4>
     <p>pageName=<%=pageContext.getAttribute("pageName") %></p>
     <p>requestName=<%=pageContext.getAttribute("requestName",pageContext.REQUEST_SCOPE) %></p>
     <p>sessionName=<%=pageContext.getAttribute("sessionName",pageContext.SESSION_SCOPE) %></p>
     <p>applicationName=<%=pageContext.getAttribute("applicationName",pageContext.APPLICATION_SCOPE) %></p>
     </br>
     <h4>用其他内置对象获取pageContext设置在此范围内的值</h4>
     <p>pageContextPageName=<%=pageContext.getAttribute("pageContextPageName") %></p>
     <p>pageContextRequestName=<%=request.getAttribute("pageContextRequestName") %></p>
     <p>pageContextSessionName=<%=session.getAttribute("pageContextSessionName") %></p>
     <p>pageContextApplicationName=<%=application.getAttribute("pageContextApplicationName") %></p>
 </body>
 </html>

  【JSP】JSP基础学习记录(三)—— JSP的9个内置对象

 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请求参数的值,当该请求参数有多个值时,该方法将返回多个值所组成的数组。

 <%@page import="java.util.Enumeration"%>
 <%@page import="java.util.Map"%>
 <%@page import="java.util.HashMap"%>
 <%@page import="javax.swing.ListModel"%>
 <%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>request</title>
 </head>
 <body>
     <p>
         page=<%=request.getParameter("page")%></p>
     <h4>获取所有请求参数</h4>
     <%
         request.setCharacterEncoding("UTF-8"); // 如果POST请求参数涵盖中文则需要设置编码
         Enumeration<String> enumer = request.getParameterNames();
         if (enumer != null) {
             while (enumer.hasMoreElements()) {
                 String e = enumer.nextElement();
                 out.println(e + "=" + request.getParameter(e) + "<br/>");
             }
         }
     %>
     <h4>获取请求头</h4>
     <%
         Enumeration<String> heads = request.getHeaderNames();
         while (heads.hasMoreElements()) {
             String h = heads.nextElement();
             out.println(h + "-->" + request.getHeader(h) + "<br/>");
         }
     %>
 </body>
 </html>

  【JSP】JSP基础学习记录(三)—— JSP的9个内置对象

  注:请注意浏览器地址栏,上面的例子为了省事所以使用的都是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。

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

  【JSP】JSP基础学习记录(三)—— JSP的9个内置对象

  注:当第一次执行时需把注释处的代码执行一下,用于向客户端写入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。很多东西东西都不敢轻易总结,且又感觉这本书中讲的很微妙。很容易就可以理解,所以大部分内容摘自书中的总结。小部分自己的总结与代码的编写。如果有兴趣的园友可以考虑这本书(希望尊重知识产权、倡导购买正版)。