2.5 JSP的内置对象
内置对象也称内建对象、隐含对象,是不需要声明的、直接可以在JSP中使用的Java对象。JSP基于Java语言,面向对象也是它的一大特色。JSP的内置对象就是把最常用、最重要的几个对象直接创建然后内置,用户无须再显式地用代码声明。用好JSP内置对象是JSP编程的精髓。
JSP有以下9个内置对象:request、response、out、pageContext、session、application、config、page、exception。本节将分别讲述如何使用这些对象。
2.5.1 使用request对象获取请求
request是最常用的内置对象,表示javax.servlet.http.HttpServletRequest对象。request对象包含所有请求的信息,如请求的来源、标头、cookies和请求相关的参数值等。比较常用的方法:
1)Object getAttribute(String name):返回由name指定的属性值,该属性不存在时返回null。
2)void setAttribute(String name, Object value):在属性列表中添加/删除指定的属性。
3)String getParameter(String name):获取客户端发送给服务器端的参数值。
4)String[] getParameterValues( String name):获得请求中指定参数的所有值。
5)String getProtocol():返回请求使用的协议,可以是HTTP1.1或者HTTP1.0。
6)String RequestURI():返回发出请求的客户端地址,但是不包括请求的参数字符串。
7)String getRemoteAddr():获取发出请求的客户端IP地址。
8)HttpSession getSession():获取session。
修改一下前面提到的第一个JSP的代码,给用户提供更多的信息。修改后的代码见实例2-10,执行结果如图2.18所示。
【实例2-10】request对象实例welcome1.jsp
01 <html> 02 <head> 03 <title>欢迎</title> 04 </head> 05 <body> 06 欢迎您: <!--显示用户名--> 07 <%=request.getParameter("username")%> 08 <br> <!--显示协议--> 09 使用的协议:<%=request.getProtocol()%> 10 <br> <!--显示请求的地址-> 11 请求的地址:<%=request.getRequestURI()%> 12 <br> <!--显示地址-> 13 您的地址是:<%=request.getRemoteAddr()%> 14 </body> 15 </html>
图2.18 request对象的例子
【运行程序】浏览该页面,结果如图2.18所示。
【代码剖析】上面代码中首先在第7行获取参数username的值,然后在第9行获取请求页面使用的协议,最后在第11行获取请求页面的URI地址,同时在第13行获取请求页面的地址。
2.5.2 使用response对象做应答
response表示HttpServletResponse对象,并提供了几个用于设置返回浏览器的响应的方法。如比较常见的方法:
1)sendRedirect(URL):可以将用户重定向到一个不同的页面(URL)。
2)setContentType(String type):响应设置内容类型头。
3)addHeader(String name,String value):添加String类型的值到HTTP文件头。
这里需要说明一下response的sendRedirect方法是转到另一个网页,前文叙述过的JSP动作标签<forward>也是网页跳转。两者区别如下:
首先,forward重定向是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变,而sendRedirect方法可以重定向到任何URL。因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。
其次,forward重定向将原始的HTTP请求对象(request)从一个Servlet实例传递到另一个实例,而采用sendRedirect方式的两者不是同一个request,forward转移的时候会把前面的请求参数也都带上,而sendRedirect方式则不能。
2.5.3 在session对象中保存用户会话
session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存储用户的状态信息。session在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面,服务器应当通过某种办法(比如cookie)知道这是同一个客户,这就需要session对象。
session对象常用方法:
1)public String getId():获取session对象编号。
2)public void setAttribute(String key,Object obj):将参数Object指定的对象obj添加到session对象中,并为添加的对象指定一个索引关键字。
3)public Object getAttribute(String key):获取session对象中含有关键字的对象。
4)public Boolean isNew():判断是否是一个新的客户。
实例2-11展示了利用session对象计算当前用户是第几个访问此网站的用户。
【实例2-11】session对象示例sessionUser.jsp
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <%!int number = 0; <!--关于用户访问的数量--> 03 synchronized void countPeople() { 04 number++; 05 } 06 %> 07 <% 08 if (session.isNew()) { 09 countPeople(); 10 String str = String.valueOf(number); 11 session.setAttribute("count", str); 12 } 13 %> 14 <html> 15 <body> 16 <p> <!--关于显示用户访问的数量--> 17 您是第<%=(String) session.getAttribute("count")%>个访问本站的人。 18 </body> 19 </html>
图2.19 浏览结果
【运行程序】浏览该页面,结果如图2.19所示。
【代码剖析】上面代码中首先在第2行代码与第6行代码间定义表示访问该网站的人数的变量和实现计算访问量的方法countPeople();接着在第7行代码到第13行代码间利用JSP脚本实现每当创建一个session对象就调用countPeople()方法,然后把该方法修改后的变量number值存储到session对象中;最后在第17行通过脚本获取session对象中属性count的值。
2.5.4 application对象、pageContext对象和JSP的范围
服务器启动后就产生了这个application对象,当客户在所访问的网站的各个页面之间浏览时,这个application对象都是同一个,可以理解为,在一个应用中application对象是一个全局的Map。
pageContext与application对象类似,有setAttribute( )和getAttribute( )方法来保存对象,只是它的范围只限于本网页内。
这里提到JSP的范围(scope),分别为Page、Request、Session、Application。这4个范围分别有pageContext、request、session、application 4个内置对象对应用来保存对象,方法名都是setAttribute( )和getAttribute( )。范围的概念十分重要,很多配置都有范围这一属性。
❑Page指的是单单一页JSP Page的范围。
❑Request的范围是指在JSP网页发出请求到另一个JSP网页之间,随后这个属性就失效。设定Request的范围时可利用request对象中的setAttribute( )和getAttribute( )。
图2.20 JSP Scope图
❑ Session的作用范围为一段用户持续和服务器所连接的时间,但与服务器断线后,这个属性将无效。
❑ Application的作用范围在服务器一开始执行服务,到服务器关闭为止。Application的范围最大,停留的时间也最久,所以使用时要特别注意,不然可能会造成服务器负载越来越重的情况。
图2.20说明了JSP的4种范围关系。
2.5.5 使用out对象输出
out对象是javax.jsp.JspWriter的一个实例,是一个输出流,用来向客户端输出数据。out对象用于各种数据的输出。常用方法如下:
1)out.print():输出各种类型数据。
2)out.newLine():输出一个换行符。
3)out.close():关闭流。
实例2-12是一个用out输出的例子,输出当前的日期。
【实例2-12】out对象示例outTest.jsp
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <%@ page import="java.util.Date"%> 03 <html> 04 <head> 05 <body> 06 <% <!--定义了当前时间的小时、分、秒--> 07 Date Now = new Date(); 08 String hours = String.valueOf(Now.getHours()); 09 String mins = String.valueOf(Now.getMinutes()); 10 String secs = String.valueOf(Now.getSeconds()); 11 %> <!--显示了当前时间的小时、分、秒--> 12 <font> 现在是 <% 13 out.print(String.valueOf(Now.getHours())); 14 %> 小时 <% 15 out.print(String.valueOf(Now.getMinutes())); 16 %> 分 <% 17 out.print(String.valueOf(Now.getSeconds())); 18 %> 秒 </font> 19 </body> 20 </html>
图2.21 浏览结果
【运行程序】浏览该页面,结果如图2.21所示。
【代码剖析】上面代码中首先在第2行导入类Date,然后在第6行代码到第11行代码间通过JSP脚本获取关于当前时间的小时、分和秒的变量,最后在第13行、第15行和第17行代码通过内置对象out输出所定义的变量。
2.5.6 在exception对象中处理异常
exception对象用于处理JSP文件执行时发生的错误和异常,只有在错误页面里才可以使用,前提是:在页面指令里要有isErrorPage=true的属性。如:
<%@ page contentType="text/html;charset=GB2312" isErrorPage="true"%>
则在此页面中便可使用exception内置对象。用法如下:
<%=exception.getMessage()%>
常用方法如下:
❑ String getMessage():取得错误提示信息。
❑ void printStackTrace():异常的堆栈信息。
2.5.7 page对象和config对象
page表示从该页面产生的一个Servlet实例,相当于这个JSP产生Servlet类的this,可以通过page对象访问实例的属性和函数。
config表示一个javax.servlet.ServletConfig对象。该对象用于存取Servlet实例的初始化参数。常用方法如下:
1)String getInitParameter( String name ):返回名称为name的初始参数的值。
2)Enumeration getInitParameters():返回这个JSP所有的初始参数的名称集合。
3)ServletContext getContext():返回执行者的Servlet上下文。
4)String getServletName():返回Servlet的名称。