5第5章
JSP内置对象
【学习目标】
.熟练掌握JSP的9种内置对象及其常用方法。
.熟练使用request内置对象获取用户请求信息。
.熟练使用sesion内置对象实现购物车功能。
.熟练使用application内置对象实现网站计数器功能。
.了解Cookie的概念和用处,能使用Cookie对象实现自动登录功能。
5.内置对象概述
1
JSP提供了一些由容器实现和管理的内置对象,它们在JSP页面中可以直接使用,不需
要实例化。在JSP中一共提供了9种内置对象:out、request、response、sesion、application、
pageContext、config、page、exception。这些内置对象的类型如表5-1所示。
表5-
1
JSP内置对象
对象名类型对象说明
out javax.servlet.jsp.JspWriter HTML标准输出
request javax.servlet.htp.HtpServletRequest 封装请求信息
response javax.servlet.htp.HtpServletResponse 封装响应信息
sesion javax.servlet.htp.HtpSesion 封装会话信息
application javax.servlet.ServletContext 封装应用信息
pageContext javax.servlet.jsp.PageContext 封装当前JSP页面的上下文信息
exception java.lang.Throwable 封装异常处理信息
config javax.servlet.ServletConfig 封装JSP页面的Servlet配置信息
page java.lang.Object 如同Java中的this
78 Java Web开发技术教程(第三版)
5.2 out对象
out对象的主要作用是向浏览器输出数据信息,也可以通过out对象操作缓冲区。out
对象对应的实现类为javax.servlet.jsp.JspWriter。
当JSP容器将JSP页面转换成Servlet时,所有的模板元素会使用out.write()方法来输
出。但是,在JSP页面的Java脚本段中输出模板元素或数据时,一般会使用out.print()或
out.println()方法。
out对象的方法主要分为两大类:向浏览器输出数据的方法和操作缓冲区的方法。
5.2.1 向浏览器输出数据的方法
out对象向浏览器输出数据的方法如下。
(1)publicabstractvoidprint():显示各种类型的数据,该方法需要一个参数,参数类
型可以是整型、浮点型、字符型、对象类型等。
(2)publicabstractvoidprintln():分行显示各种类型的数据。该方法可以有一个参
数,参数类型可以是整型、浮点型、字符型、对象类型等,方法无参数时,输出一个换行符。
(3)publicabstractvoidnewline():输出一个换行符。
注意:
(1)out.print(expression)等价于<%=expression%>。
(2)out.println()或out.newLine()的换行效果是出现在页面源代码中,而不是页面中。
页面的换行仍要使用
标签。
下面通过例子来进一步掌握out对象向浏览器输出数据的常用方法。
【例5-1】 table.jsp,使用out对象输出行变色表格。
<%@ page contentType="text/html;charset=utf-8" %>
使用out 对象输出行变色表格
<%
int i=0;
while(i<10){
i++;
if(i%2==0) {
out.println("");
}else{
out.println("
");
}
第5章 JSP内置对象 79
out.println("当前行数:"+i+" | ");
out.println("
");
}
%>
在浏览器地址栏中输入URL:http://localhost:8080/ch05/out/table.jsp,得到的运行
结果如图5-1所示。
图5-1 使用out对象输出行变色表格
5.2.2 操作缓冲区的方法
out对象操作缓冲区的方法如下。
(1)publicabstractvoidclear():清空缓冲区中的内容,如果缓冲区中的数据已经被刷
新到客户端,则会引发IO 异常。
(2)publicabstractvoidclearBuffer():清空缓冲区中的内容,即使缓冲区中的数据已
经被刷新到客户端,也不会引发IO 异常。
(3)publicabstractvoidflush():刷新缓冲区中的数据到客户端。
(4)publicabstractvoidclose():刷新缓冲区,并关闭输出流。
(5)publicintgetBuffersize():返回缓冲区的大小,单位为字节。
(6)publicabstractintgetRemaining():返回缓冲区剩余空间的大小,单位为字节。
(7)publicbooleanisAutoFlush():返回autoFlush的取值。
下面通过例子来进一步掌握out对象操作缓冲区的常用方法。
【例5-2】 out.jsp,使用out对象输出数据并操作缓冲区。
<%@ page contentType="text/html;charset=utf-8" buffer="2kb" autoFlush="false"%>
<%
out.println("你好!");
80 Java Web开发技术教程(第三版)
out.clear();
%>
使用out 对象输出数据并操作缓冲区
<%
out.println("再次说你好!"+"
");
out.println("out 对象的缓冲区大小为:"+out.getBufferSize()+"字节
");
out.println("缓冲区剩余大小为:"+out.getRemaining()+"字节
");
out.flush();
for(int i=0;i<2000;i++){
out.print("A");
}
out.println("
"+out.isAutoFlush());
%>
在浏览器地址栏中输入URL:“http://localhost:8080/ch05/out/out.jsp”,得到的运行
结果如图5-2所示。
图5-2 使用out对象输出数据并操作缓冲区
5.3 request对象
request对象封装了浏览器的请求信息,通过request对象的各种方法可以获取客户端
以及用户提交的各项请求信息。请求信息包括请求的头部信息、请求方式、请求的参数名称
和参数值等。此外,request对象还提供了获取cookie和session等对象的方法。request对
象对应的接口为javax.servlet.http.HttpServletRequest。
5.3.1 获取请求头部信息的方法
request对象获取请求头部信息的方法如下:
第5章 JSP内置对象 81
(1)StringgetHeader(Stringname):返回指定头部名称的字符串类型的信息值。
(2)Enumeration getHeaderNames():返回所有头部信息的名称。
(3)EnumerationgetHeaders(Stringname):返回指定头部名称的所有信息值。
(4)intgetIntHeader(Stringname):返回指定头部名称的整型信息值。
(5)longgetDateHeader(Stringname):返回指定头部名称的代表日期对象的长整型
信息值。
下面通过例子来进一步掌握request对象获取请求头部信息的常用方法。
【例5-3】 header.jsp,使用request对象获取并显示全部请求头部信息。
<%@ page contentType="text/html;charset=utf-8" import="java.util.*"%>
使用request 对象获取并显示全部请求头部信息
客户端发送的HTTP 请求头包含如下信息:
<%
Enumeration headers = request.getHeaderNames();
while (headers.hasMoreElements()) {
String headerName = headers.nextElement();
String headerValue = request.getHeader(headerName);
%>
<%= headerName %>:<%= headerValue %>
<%
}
%>
在浏览器地址栏中输入URL:“http://localhost:8080/ch05/request/header.jsp”,得到
的运行结果如图5-3所示。
图5-3 使用request对象获取全部请求头部信息
82 Java Web开发技术教程(第三版)
5.3.2 获取请求参数信息的方法
request对象获取请求参数的方法如下:
(1)StringgetParameter(Stringname):获取请求参数name的值,并以字符串形式返
回,如果参数name不存在则返回null。
例如,获取名为name的参数值:
String name=request.getParameter("name");
(2)String[]getParameterValues(Stringname):获取请求参数name的所有参数值,
返回字符串数组,如果参数name不存在则返回null。
例如,获取名为mybox的复选框的所有取值:
String[] mybox=request.getParameterValues("mybox");
if(mybox!=null) {
for(int i=0;i getParameterNames():获取请求中所有参数的名称。
例如:
String value=null;
Enumeration names=request.getParameterNames();
while(names.hasMoreElements() ){
value=names.nextElement();
out.println(name+"="+request.getParameter(name));
out.println("
");
}
(4)Map getParameterMap():以Map类型返回请求的所有参
数,其中参数名作为Map的key。Map的value是这个参数名对应的所有参数值的字符串
数组。
5.3.3 其他方法
request对象的其他常用方法如下:
(1)ObjectgetAttribute(Stringname):返回指定名称的属性值,如果指定的属性不存
在,则返回null。
(2)voidsetAttribute(Stringname,Objecto):在请求对象中存储名称为name、值为o
的属性。
(3)voidremoveAttribute(Stringname):删除指定名称的属性。
(4)StringgetContextPath():返回请求URI中表示请求上下文的部分。
第5章 JSP内置对象 83
(5)Cookie[]getCookies():以数组形式返回客户端发送的所有Cookie对象。
(6)StringgetMethod():获取HTTP请求的方式,例如GET、POST或PUT。
(7)HttpSessiongetSession():获取Session对象。
(8)voidsetCharacterEncoding(Stringencoding):设置请求体的字符编码方式,用来解
决传递非英文字符所出现的乱码问题。
注意:Tomcat服务器默认按照ISO-8859-1进行URL编码,因此,对于以GET方式提
交的请求参数,仅使用setCharacterEncoding()方法设置请求体的编码方式是无效的。常见
的解决方法是在tomcat的server.xml下的 标签中增加
useBodyEncodingForURI="true"。
5.3.4 项目1:读取用户的注册信息
1.项目构思
使用request对象的相关方法实现在reg.jsp页面获取并显示3.1.5节项目1中用户在
reg.html页面填写的注册信息。
2.项目设计
(1)注册页面reg.html使用的是3.1.5节项目1中的reg.html,更改
文件名:reg.jsp
<%@ page pageEncoding="utf-8"%>
<%
request.setCharacterEncoding("utf-8");
%>
您的姓名是:<%=request.getParameter("name")%>
您的密码是:<%=request.getParameter("pw")%>
您的职业是:<%=request.getParameter("career")%>
您的电话号码:<%=request.getParameter("telephone")%>
您的电子邮箱:<%=request.getParameter("email")%>
<%
String[] fav = request.getParameterValues("fav");
if(fav!=null){
out.print("您的兴趣爱好有:");
第5章 JSP内置对象 85
for(String f:fav)
{
out.print(f);
}
out.println("
");
}
%>
您的自我简介:<%=request.getParameter("intro")%>
4.项目运行
在浏览器地址栏中输入URL:“http://localhost:8080/ch05/request/reg.html”,得到
的运行结果如图5-4所示。
图5-4 用户注册页面
单击“注册”按钮后,表单信息提交到reg.jsp页面,结果如图5-5所示。
图5-5 使用request对象读取并显示用户注册信息
86 Java Web开发技术教程(第三版)
5.4 response对象
response对象与request对象相对应,代表服务器对客户端的响应。response对象对应
的接口为javax.servlet.http.HttpServletResponse。
当客户端访问服务器的JSP页面时,会发送一个HTTP请求。服务器收到该请求后,
会建立一个response对象,这个对象封装服务器端处理请求时生成的响应信息,请求处理完
成后,服务器将其返回给客户端。response对象返回给客户端的信息包括响应头信息、响应
的本体(HTML内容)以及服务端的状态码等。
5.4.1 与响应头信息相关的方法
response对象与响应头信息相关的方法如下:
(1)voidaddDateHeader(Stringname,longdate):通过指定的名字和值,新增date类
型的响应头信息。
(2)voidaddHeader(Stringname,Stringvalue):通过指定的名字和值,新增String类
型的响应头信息。
(3)voidaddIntHeader(Stringname,intvalue):通过指定的名字和值,新增int类型
的响应头信息。
(4)voidsetDateHeader(Stringname,longdate):通过指定的名字和值,设置date类
型的响应头信息。
(5)voidsetHeader(Stringname,Stringvalue):通过指定的名字和值,设置String类
型的响应头信息。
(6)voidsetIntHeader(Stringname,intvalue):通过指定的名字和值,设置int类型的
响应头信息。
(7)StringgetHeader(Stringname):返回指定头部名称的字符串类型的响应头信息,
如果name指定的响应头信息未被设置,则返回null。
(8)Collection getHeaderNames():返回所有响应头部名称的集合。
(9)Collection getHeaders(Stringname):返回指定头部名称的所有响应头
信息的集合。
浏览器通常会将刚刚浏览过的网页内容保存在缓存中,当再次请求同一个页面时,浏览
器会直接从缓存中取出缓存的内容进行显示。使用response对象的setHeader()方法可以
设置浏览器不缓存页面,语句如下:
response.setHeader("Cache-Control", "no-cache");
除此之外,response对象的setHeader()方法还可以设置页面的自动刷新频率。例如,
每隔60s重新加载本页面的语句如下:
response.setIntHeader("Refresh", 60);