JSP的内置对象

来源:互联网 发布:cf手游抢红包软件 编辑:程序博客网 时间:2024/05/16 17:01

本文是慕课网JAVA遇见HTML-JSP篇课程学习笔记。

在介绍JSP的内置对象之前,先看看web应用程序的请求响应模式。


上图就是web应用程序的请求与响应模式,由客户向web服务器发送HTTP请求(request),告知服务器请求的内容与关于客户的具体信息,然后web服务器向客户发送请求的内容即响应(response),这样,就构成了客户与服务器之间的会话。

以一个用户登录的例子来看,用户输入用户名和密码,然后向web服务器发送一个登录的请求,web服务器判断用户名和密码是否合法,如果合法就向客户发送一个响应,告知庸碌登录成功。

JSP的内置对象:

JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。


例如上面的代码,out对象并没有显示声明也可以使用,说明out是一个JSP内置对象。

JSP支持九大内置对象:


其中,request、response、out、session、和application这5个内置对象是比较常用的。

下面介绍这些内置对象。

1、out对象

out对象是jspWriter类的实例,是向客户端输出内容常用的对象。

out对象有如下几个常用函数:

  1. void println() 向客户端打印字符串;
  2. void clear() 清除缓冲区的内容,如果在flush之后调用会抛出异常;
  3. void clearBuffer() 清除缓冲区的内容,如果在flush之后调用不会抛出异常;
  4. void flush() 将缓冲区内容输出到客户端;
  5. int getBufferSize() 返回缓冲区的大小,以字节为单位,如果不设置则返回0;
  6. int getRemaining() 返回缓冲区剩余空间的字节数;
  7. boolean isAutoFlush() 返回当缓冲区已满时,是自动清空还是抛出异常;
  8. void close() 关闭输出流;
下面以一个具体的例子演示一下out对象的使用。
新建一个web项目,在index.jsp页面上添加如下代码:
  <body>    <h1>out内置对象</h1><hr>    <%    out.println("<h2>柴鹿</h2>");    out.println("空山不见人,<br>");    out.println("但闻人语响。<br>");    out.println("返影入深林,<br>");    out.println("复照青苔上。<br>");    %>缓冲区大小:<%=out.getBufferSize() %>bytes<br>缓冲区剩余大小:<%=out.getRemaining() %>bytes<br>是否自动清空缓冲区:<%=out.isAutoFlush() %><br>  </body>
这里向页面打印一首唐诗,然后输出缓冲区的大小和剩余缓冲区的大小以及是否自动清空缓冲区。运行结果如下:

然后,试试flush方法,在打印两句诗后调用out对象的flush方法:
<body>    <h1>out内置对象</h1><hr>    <%    out.println("<h2>柴鹿</h2>");    out.println("空山不见人,<br>");    out.println("但闻人语响。<br>");    out.flush();    out.println("返影入深林,<br>");    out.println("复照青苔上。<br>");    %>缓冲区大小:<%=out.getBufferSize() %>bytes<br>缓冲区剩余大小:<%=out.getRemaining() %>bytes<br>是否自动清空缓冲区:<%=out.isAutoFlush() %><br>  </body>
结果如下:

可以看到,和上面没有调用flush时效果一样,不同的是缓冲区的剩余大小,调用flush之后的剩余大小比没调用时大,这是因为flush方法将缓冲区的内容打印到页面上,使缓冲区剩余的空间变大。
之后,在flush之后调用clear方法:
<%    out.println("<h2>柴鹿</h2>");    out.println("空山不见人,<br>");    out.println("但闻人语响。<br>");    out.flush();    out.clear();    out.println("返影入深林,<br>");    out.println("复照青苔上。<br>");    %>
结果:

只打印出两句诗,原因是clear在后台抛出了一个异常:

使用clearBuffer方法则不会抛出异常,这里不再演示。
2、request对象
request对象是HttpServletRequest类的实例。客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出相应。request对象具有请求与,即完成客户端的请求之前,该对象一直有效。常用方法如下:
  1. String getParameter(String name) 返回name指定参数的参数值;
  2. String[] getParameterValues(String name) 返回包含参数name的所有值的数组;
  3. void setAttribute(String,Object) 存储此请求中的属性;
  4. object getAttribute(String name) 返回指定属性的属性值;
  5. String getContentType() 得到请求题的MIME类型;
  6. String getProtocol() 返回请求用的协议类型及版本号;
  7. String getServerName() 返回接受请求的服务器主机名;
  8. int getServerPort() 返回服务器接受此请求所用的端口号;
  9. String getCharacterEncoding() 返回字符的编码方式;
  10. void setCharacterEncoding() 设置请求的字节编码方式;
  11. int getContentLength() 返回请求体的长度(以字节数);
  12. String getRemoveAddr()返回发送此请求的客户端IP地址;
  13. String getRealPath(String path) 返回一虚拟路径的真实路径;
  14. String request.getContextPath() 返回上下文路径;
下面通过一个具体的例子演示一下request对象的使用。
新建一个web项目,由于要使用request对象,所以为了演示创建一个reg.jsp页面来模拟用户注册,然后提交数据交给request对象处理。在reg.jsp页面中,添加如下代码:
<form name="regForm" action="request.jsp" method="post">    <table>      <tr>        <td>用户名:</td>        <td><input type="text" name="username"/></td>      </tr>      <tr>        <td>爱好:</td>        <td>           <input type="checkbox" name="favorite" value="read">读书           <input type="checkbox" name="favorite" value="music">音乐           <input type="checkbox" name="favorite" value="movie">电影           <input type="checkbox" name="favorite" value="internet">上网        </td>      </tr>      <tr>         <td colspan="2"><input type="submit" value="提交"/></td>      </tr>    </table>    </form>
在这里,用户输入用户名,并添加爱好(为了演示getParameterValues方法),然后使用post方式提交,使用request.jsp页面进行处理。在request.jsp页面中,加入如下代码:
<body>  <h1>request内置对象</h1><hr>      用户名:<%=request.getParameter("username") %>      爱好:<%      String[] favorites=request.getParameterValues("favorite");      for(int i=0;i<favorites.length;i++)      {      out.println(favorites[i]+"  ");      }      %>  </body>
在上面代码中,request对象使用getParameter方法获得用户名username,注意getParameter方法中的参数要和reg.jsp表单中的input的name(即username)相同,然后使用getParameterValues方法获得爱好,在打印出来。结果如下:
首先在reg.jsp页面中输入信息:

点击提交后,由request.jsp页面处理:

可以看到,request对象成功地获得了username和favorite的值。
然后,如果用户名是中文看看会怎么样:
用户名输入“张三”后,出现了乱码:

这是由于Tomcat在提交表单的时候默认的是使用ISO8859-1编码方式,最简单的方式就是在request对象获得值之前设置编码方式,将编码方式设置为表单的编码方式:
<%  request.setCharacterEncoding("utf-8");  %>
结果如下:

同时,还可以使用URL来传递参数,下面演示使用URL传递参数交给request对象来处置。

在reg.jsp页面中添加如下代码:

<br>    <br>    <a href="request.jsp?username=lisi">URL传递参数</a>
在request.jsp页面中添加判断:
 爱好:<%      String[] favorites=request.getParameterValues("favorite");      if(favorites!=null)    {      for(int i=0;i<favorites.length;i++)      {      out.println(favorites[i]+"  ");      }    }
在reg.jsp中效果如下:


点击超链接后,request.jsp中处理结果如下:

可以在URL地址中看见username=lisi。如果传递中文看如何:


出现中文乱码,这种通过URL传递参数引起的中文乱码问题,request对象的setCharacterEncoding方法就不能解决了。需要修改Tomcat的配置信息,在Tomcat安装目录中的conf目录下,打开server.xml文件,在Connector中添加如下内如:URIEncoding="utf-8",如下所示:


然后重启服务器,再次运行结果如下:


这样就解决了中文乱码问题。

对于剩下的其它的函数,这里就不演示了,函数很简单。

3、response对象

response对象包含了相应客户端七牛的的有关信息,不过在JSP中很少直接用到它。它是HttpServletResponse类的实例。response对象具有页面作用域,也就是说访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效。

response对象有如下常用方法:

  1. String getCharacterEncoding() 返回响应使用的是哪种字符编码;
  2. void setContentType(String type) 设置相应的MIME类型;
  3. PrintWriter getWriter() 返回可以向客户端输出字符的一个对象(与out内置对象有区别);
  4. sendRedirect(String location) 重新定向客户端的请求;
接下来演示response对象的使用。
在response.jsp页面中添加如下代码:
<%@ page language="java" import="java.util.*,java.io.*" contentType="text/html; charset=utf-8"%><%    response.setContentType("text/html;charset=utf-8");        out.println("<h1>response内置对象</h1>");    out.println("<hr>");        PrintWriter outer = response.getWriter(); //获得输出流对象    outer.println("我是response对象生成的输出流outer对象");%>
其中,这里没有常见的html标签,通过setContentType()来设置MIME类型。然后使用out内置对象在页面上打印内容,之后调用getWriter函数获得一个可以向客户端写内容的PrintWriter对象outer,使用outer向页面打印一句话。结果如下:

可以看到,使用outer对象打印的内容在使用out对象打印的内容之前,这就是通过getWriter()获得的PrintWriter对象和内置的out对象之间的区别,即response通过getWriter获得的PrintWriter对象输出的内容总是在内置的out对象之前。

如果想使out对象打印的内容在outer之前,可以在out.println()之后使用out对象的flush方法清空缓冲区,同时还会降缓冲区的内容强制写入页面中。如下:

out.println("<h1>response内置对象</h1>");    out.println("<hr>");    out.flush();
结果如下:


sendRedeirect(String location)是请求重定向,可以将客户端的响应重定向到参数指定的location处。

4、session对象

首先应该知道,什么是session?

session

(1)session表示客户端与服务器之间的一次会话;

(2)web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的时间,也就是说用户浏览这个网站所花费的时间;

(3)也就是说,session实际上是一个特定的时间概念;

当具体到生活中的实例时,可以拿网上购物来看,购物时需要登录,进入商品页面挑选商品,选择商品然后付款完成,整个流程属于一个session。

还有就是,session保存在服务器的内存中,服务器在内存中为每一个用户保存一个session,如下图:


然后看一下JSP中的session内置对象:

  • session对象是一个JSP内置对象;
  • session对象在第一个JSP页面被装载时自动创建,完成会话期管理;
  • 从一个客户打开浏览器并链接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话;
  • 当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象;
  • session对象是HttpSession类的实例;
session对象有如下常用方法:
  1. long getCreationTime() 返回session的创建时间(单位是毫秒);
  2. public String getId() 返回session创建时JSP引擎为它设置的唯一的ID号;
  3. public Object setAttribute(String name,Object value) 使用指定名称将对象绑定到此会话;
  4. public Object getAttribute(String name) 返回与此会话中指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null;
  5. String[] getValueNames() 返回一个包含次session所有可用属性的数组;
  6. int getMaxInactiveInterval() 返回两次请求间隔多长时间次session被取消(以秒为单位);
  7. setMaxInactiveInterval(int arg0) 设置多长时间内没有请求会取消session(单位是秒);
下面的例子演示了session对象的用法。
在一个web项目中新建两个jsp页面:session_page1.jsp和session_page2.jsp,代码如下:
session_page1.jsp:
<body>    <h1>session内置对象</h1>    <hr>    <%       SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");      Date d = new Date(session.getCreationTime());      session.setAttribute("username", "admin");       session.setAttribute("password", "123456");      session.setAttribute("age", 20);    %>    Session创建时间:<%=sdf.format(d)%><br>        Session的ID编号:<%=session.getId()%><BR>         从Session中获取用户名:<%=session.getAttribute("username") %><br>             <a href="session_page2.jsp" target="_blank">跳转到Session_page2.jsp</a>               </body>
session_page2.jsp:
<body>    <h1>session内置对象</h1>    <hr>            Session的ID编号:<%=session.getId()%><BR>         从Session中获取用户名:<%=session.getAttribute("username") %><br>    Session中保存的属性有:<%                      String[] names =session.getValueNames();                     for(int i=0;i<names.length;i++)                     {                        out.println(names[i]+"  ");                     }        %> <br>      </body>
在session_page1.jsp中,可以得到session的创建时间,通过setAttribute设置属性,通过getAttribute获得属性。因为session表示一个会话,在通过URL链接到session_page2.jsp时,sessionID应该一样,同时在session_page2.jsp中也能获得保存的属性:
          

虽然session表示一个会话,如果浏览器不关闭的话session会保存在服务器的内存中,不过session也有一个期限,可以使用getMaxInactiveInterval()获得这个期限,也可以使用setMaxInactiveInterval()来设置这个期限。在session_page1.jsp中来设置期限:

<%       SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");      Date d = new Date(session.getCreationTime());      session.setAttribute("username", "admin");       session.setAttribute("password", "123456");      session.setAttribute("age", 20);            //设置当前session最大生成期限单位是秒      session.setMaxInactiveInterval(10);//10秒钟          %>
设置最大生存期限为10秒,结果如下:

             

可以看到,在两个页面中的sessionID不同,说明是两个不同的session,第一个页面创建的session由于过了生存期限被取消了,在第二个页面中新建了一个session,而且第一个session保存的属性也不存在了。

session的生命周期

session的生命周期有如下几个阶段:

(1)创建阶段

在创建阶段,当客户端第一次访问某个jsp页面或者servlet时,服务器就会为当前会话创建一个sessionID,每次客户端向服务器发送请求时,都会携带此sessionID,服务器会对这个sessionID进行校验,来判断是否属于同一个会话;

(2)活动阶段

在活动阶段中有如下几种情况,

  • 某次会话当中通过超链接打开的新页面属于同一次会话;
  • 只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话;
  • 除非本次会话的所有页面都关闭后再重新访问某个jsp或servlet将会创建新的会话;
同时,当创建新的会话时,旧的sessionID还在服务器中,直到生存期限到达后销毁。
(3)销毁阶段
有三种方式可以销毁session:
  • 调用session.invalidate()方法;
  • session过期(超时);
  • 服务器重启(会销毁所有的session);
可以有两种方法来设置session的超时时间:
  • 调用session.setMaxInactiveInterval(int arg0),单位是秒;
  • 配置web.xml,添加下面的内容:
<session-config>        <session-timeout>1</session-timtout></session-config>
单位是分钟。

5、application对象

application对象是javax.servlet.ServletContex接口的实例,是实现了用户间数据的共享,可存放全局变量,相当于Java中的静态变量,不属于某一个实例而属于整个类,application也是不属于某个用户而属于整个服务器。它开始于服务器的叮咚,终止于服务器的关闭。在用户的前后连接或不同用户的连接中,可以对application对象的同一属性进行操作,而这种操作会影响其他用户对此的访问。

application对象有如下几种方法:

  1. public void setAttribute(String name,Object value) 使用指定名称将对象绑定到此会话;
  2. public Object getAttribute(String name) 返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null;
  3. Enumeration getAttributeNames() 返回所有可用属性名的枚举;
  4. String getServerInfo() 返回JSP(Servlet)引擎名及版本号;

6、page对象

page对象就是指向当前JSP页面本身,就像类中的this指针,它是java.lang.Object类的实例,常用方法也就是说Object类的常用方法。


7、pageContext对象

pageContext对象是pageContext类的实例,提供了对JSP页面内所有的对象及名字空间的访问,不但可以访问到本页面所在的session,也可以获得本页面所在的application中的某一个属性值。所以pageContext的功能很大。

pageContext对象的常用方法如下:

  1. JspWriter getOut() 返回当前页面的out对象;
  2. HttpSession getSession() 返回当前页面的session对象;
  3. Object getPage() 返回当前页面的page对象;
  4. ServletRequest getRequest() 返回当前页面的request对象;
  5. ServletResponse getResponse() 返回当前页面的response对象;
  6. void setAttribute(String name,Object attribute) 设置属性及属性值;
  7. Object getAttribute(String name,int scope) 在指定范围内取属性的值;
  8. int getAttributeScope(String name) 返回某属性的作用范围;
  9. void forward(String relativeUrlPath) 使当前页面重导到另一页面;
  10. void include(String relativeUrlPath) 在当前位置包含另一文件;

8、config对象

config对象是在一个servlet初始化时,JSP引擎向它传递信息用的,此信息包括servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象),常用方法如下:

  1. ServletContext getServletContext() 返回凡有服务器相关信息的ServletContext对象;
  2. String getInitParameter(String name) 返回初始化参数的值;
  3. Enumeration getInitParameterNames() 返回servlet初始化所需所有参数的枚举;
9、exception对象

exception对象是java.lang.Throwable的实例,是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。常用方法如下:

  1. String getMessage() 返回描述异常的消息;
  2. String toString() 返回关于异常的尖端描述消息;
  3. void printStackTrace() 显示异常及其栈轨迹;
  4. Throwable FillInStackTrace() 重写异常的执行栈轨迹;
下面使用一个例子演示一下exception对象的使用。

由于要处理异常,首先要产生一个异常,最简单的就是除零,这是一个运行时错误,也叫算数错误。exception_test.jsp页面代码如下:

<body>    <h1>测试异常的页面</h1>    <hr>        <%       System.out.println(100/0);    %>  </body>
由于这个页面产生异常,需要指定一个页面来处理这个异常,需要在第一行添加如下内容:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" errorPage="exception.jsp"%>
后面的errorPage="exception.jsp"指定了exception.jsp页面来处理这个异常。

exception.jsp页面代码如下:

<body>    <h1>exception内置对象</h1>    <hr>            异常的消息是:<%=exception.getMessage()%><BR>        异常的字符串描述:<%=exception.toString()%><br>  </body>
需要在第一行添加如下内容:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" isErrorPage="true" %>
后面的isErrorPage="true"是必须的。

结果如下:

当访问exception_test.jsp页面时,产生异常,然后交给exception.jsp页面处理,打印出异常消息,同时可以看到,地址栏中的URL地址并没有变化。


以上就是9个内置对象的总结。

1 0