···························································· 第5 章 chapter5 JSP常用对象 本章要点 本章重点介绍了JSP编程时常见的8种内部对象,它们分别是request、response、 session、application、out、pageContext、config和exception,通过本章学习,读者可以掌握 JSP常见内部对象的语法、原理及使用方法,并结合案例加以练习,最终掌握基于JSP常 见内部对象的编程技术。 表5-1列出了JSP中常见的8种内部对象。 表5-1 JSP中常见的8种内部对象 内部对象名主要功能 request 封装用户提交的请求信息 response 封装响应用户请求的信息 session 在用户请求时期保存对象属性 application 提供存取servletclass环境信息的方法 out 向客户端输出信息 pageContext 存取JSP执行过程中需要用到的属性和方法 config 提供存取servletclass初始参数及Server环境信息 exception 在页面出错时产生无法控制的Throwable 5.1 request request对象的类型是一个执行javax.servlet.http.HttpServletRequest界面的类。 当客户端请求一个JSP网页时,客户端的请求信息将被JSP引擎封装在这个request对 象中。该对象调用相应的方法便可以获取用户提交的信息。下面介绍request对象中的 常用方法。 (1)getCookies():返回客户端的cookie对象,结果是一个cookie数组。 (2)getHeader(Stringname):获得HTTP协议定义的传送文件头信息,如request. getHeader("User-agent")返回客户端浏览器的版本号、类型等信息。 第◆5 章 JSP 常用对象9 7 (3)getAttribute(Stringname):返回name指定的属性值,若不存在指定的属性,就 返回空值(null)。 (4)getattributeNames():返回request对象所有属性的名字,结果集是一个Enumeration 类的实例。 (5)getHeaderNames():返回所有请求标头(requestheader)的名字,结果集是一个 Enumeration类的实例。 (6)getHeaders(Stringname):返回指定名字的请求标头的所有值,结果集是一个 Enumeration类的实例。 (7)getMethod():获得客户端向服务器端传送数据的方法(如GET、POST和PUT 等类型)。 (8)getParameter(Stringname):获得客户端传送给服务器端的参数值,该参数由 name指定。 (9)getparameterNames():获得客户端传送给服务器端的所有参数名,结果集是 一个Enumeration类的实例。 (10)getParameterValues(Stringname):获得参数name所包含的值(一个或多个)。 (11)getQueryString():获得由客户端以GET方式向服务器端传送的字符串。 (12)getRequestURI():获得发出请求字符串的客户端地址。 (13)getServletPath():获得客户端所请求的脚本文件的文件路径。 (14)setAttribute(Stringstrname,Java.lang.Objectobj):设定名字为strname的 request参数值,该值由Object类型的obj指定。 (15)getServerName():获得服务器的名字。 (16)getServerPort():获得服务器的端口号。 (17)getRemoteAddr():获得客户端的IP地址。 (18)getRemoteHost():获得客户端电脑的名字,若失败,则返回客户端电脑的IP 地址。 (19)getProtocol():获取客户端向服务器端传送数据所使用的协议名称(如http/1.1)。 通常用户向JSP页面提交信息是借助于表单来实现的。我们知道表单中包含文本 框、列表、按钮等输入标记。当用户在表单中输入完信息后,单击Submit按钮这些信息 将被提交。客户端可以使用post以及get两种方法实现提交。它们的区别是get方法提 交的信息会显示在IE浏览器的地址栏中,而post方法不会显示,提交后的信息就被封装 在request对象中。通常request对象调用getParameter()方法获取用户提交的信息。 下面我们给出利用request对象获取客户提交页面信息的例程ex5-1.jsp,其源程序如下。 ex5-1.jsp 源程序 <%@ page contentType="text/html;charset=GB2312"%> 示例5-1

9 8 ◆W eb 编程技术(第2 版)


请输入您的尊姓大名:



程序ex5-1.jsp通过表单向do51.jsp提交信息。do51.jsp通过request对象获取用户 提交页面的信息。do51.jsp的源程序如下。 do51.jsp 源程序 <%@ page contentType="text/html;charset=GB2312"%> <%@ page import="java.util.*"%>


<% out.println("客户协议: " + request.getProtocol()); out.println("
"); out.println("服务器名: " + request.getServerName()); out.println("
"); out.println("服务器端口号: " + request.getServerPort()); out.println("
"); out.println("客户端IP 地址: " + request.getRemoteAddr()); out.println("
"); out.println("客户机名: " + request.getRemoteHost()); out.println("
"); out.println("客户提交信息长度: " + request.getContentLength()); out.println("
"); out.println("客户提交信息类型: "+ request.getContentType()); out.println("
"); out.println("客户提交信息方式: " + request.getMethod()); out.println("
"); out.println("Path Info: " + request.getPathInfo()); out.println("
"); out.println("Query String: " + request.getQueryString()); out.println("
"); out.println("客户提交信息页面位置: " + request.getServletPath()); out.println("
"); 第◆5 章 JSP 常用对象9 9 out.println("HTTP 头文件中accept-encoding 的值: " + request.getHeader ("Accept-Encoding")); out.println("
"); out.println("HTTP 头文件中User-Agent 的值: " + request.getHeader("User- Agent")); out.println("
"); %>

您的名字是:

<% String username=request.getParameter("user"); %> <%=username%>

将ex5-1.jsp和do51.jsp保存到D:\Tomcat\webapps\ROOT 下面,然后在IE浏览 器的地址栏中输入“http://localhost:8080/ex5-1.jsp”,按Enter键后屏幕显示如图5-1 所示。 图5-1 ex5-1.jsp的运行结果 在文本框中输入名字后单击“我要提交”按钮,效果如图5-2所示。 1 00 ◆W eb 编程技术(第2 版) 图5-2 提交后ex5-1.jsp的运行结果 5.2 response response对象的类型为javax.servlet.http.HttpServletResponse类。当用户向服务 器端提交了HTTP请求后,服务器将会根据用户的请求建立一个默认的response对象, 然后传入JspService()函数中,给客户端提供响应的信息。下面介绍response对象中所 包含的方法。 (1)setContentType(Strings):该方法可以改变ContentType的属性值。当用户访 问一个ContentType属性值是“text/html”的JPS页面时,JPS引擎将按照ContentType 属性的值来响应客户的请求信息。response对象可以调用该方法来设置ContentType 的值,其中参数s可取“text/html”“application/x-msexcel”和“application/msword”等。 (2)sendRedirect(URL):该方法将实现客户的重定向。即在处理客户请求的过程 中,可能会根据不同事件将客户重新引导至另一个页面。其中参数URL的值为重定向 页面所在的相对路径。 (3)addCookie(Cookiecookie):该方法将实现添加1个Cookie对象。Cookie可以 保存客户端的用户信息。通过request对象调用getCookies()方法可获得这个Cookie。 (4)addHeader(Stringname,Stringvalue):该方法将实现添加HTTP文件头。该 Header将会传到客户端,若同名的Header存在,原来的Header会被覆盖。其中参数 name指定HTTP头的名字,参数value指定HTTP头的值。 第◆5 章 JSP 常用对象1 01 (5)containsHeader(Stringname):该方法判断参数name所指名字的HTTP文件 头是否存在,如果存在返回true,否则返回false。 (6)sendError(internum):该方法实现向客户端发送错误信息。其中参数ernum 表示错误代码。例如当ernum 为404时,表示网页找不到。 (7)setHeader(Stringname,Stringvalue):该方法将根据HTTP文件头的名字来 设定它的值。如果HTTP头原来有值,则它将会被新值覆盖。其中参数name表示HTTP 头的名字,参数value指定HTTP头的值。 下面我们给出利用response对象实现客户重定向的例程ex5-2.jsp和do52.jsp,源程 序如下。 ex5-2.jsp 源程序 <%@ page contentType="text/html;charset=GB2312"%> 示例5-2

音乐前沿网———用户注册

您的尊姓大名: < input type =" text " name =" user " size =" 20" >        您的密码:

您最喜欢的歌星: 刘德华 刘若英       您的性别:

请填写一条您最欣赏的歌词:



您的家庭所在地:

您最喜欢的小动物的图片:       1 02 ◆W eb 编程技术(第2 版)

do52.jsp 源程序 <%@ page contentType="text/html;charset=GB2312"%> <%@ page import="java.util.*"%>




<% String username=request.getParameter("user"); if(username==null) { username=""; } byte userbyte[]=username.getBytes("ISO-8859-1"); username=new String(userbyte); if(username.equals("")) { response.sendRedirect("ex5-2.jsp"); } else { out.println("
"); out.print("欢迎"); out.println(username); out.print("进入音乐前沿网站!"); out.println("
"); } %>

将ex5-2.jsp和do52.jsp保存到D:\Tomcat\webapps\ROOT 下面,然后在IE浏览 器的地址栏中输入“http://localhost:8080/ex5-2.jsp”,按Enter键后屏幕显示如图5-3 所示。 ◆ 第 5 章 JSP 常用对象103 图5- 3 ex5-2.sp的运行结果 j 当输入完信息(注意要输入用户名)单击“提交”按钮后,效果如图5-4所示。 图5- 4 提交后ex5-2.sp的运行结果 j 1 04 ◆W eb 编程技术(第2 版) 下面我们给出利用response对象实现自动刷新客户页面的例程ex5-3.jsp,源程序如下。 ex5-3.jsp 源程序 <%@ page language="java" %> <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.util.*"%> 示例5-3

本例将给大家演示该页面每隔1 秒的自动刷新过程






现在的时间是: <% response.setHeader("refresh","1"); out.println(new Date().toLocaleString()); %>

ex5-3.jsp的运行结果如图5-5所示。 图5-5 ex5-3.jsp的运行结果 第◆5 章 JSP 常用对象1 05 5.3 session session是会话的意思。其实它指的是当一个用户从在客户端打开IE浏览器并连接 到服务器端开始,一直到该用户关闭IE浏览器为止的这段时期。在这段时期内,该用户 会在这个服务器的不同页面之间跳转(按照经验,没有哪个用户登录网站后只锁定一个 页面),甚至会反复刷新服务器上的某一个页面。那么服务器用什么办法才能知道和当 前页面连接的用户是不是同一个用户呢? 服务器又是怎样获取用户在访问各个页面期 间所提交的信息的呢(连接一旦关闭,服务器是不会保留先前连接的信息的)? 要解决这 些问题就需要session对象。 session对象在第一个JSP页面被装载时自动创建,完成会话期管理。当用户第一次 登录网站时,服务器端的JSP引擎将为该用户生成一个独一无二的session对象,用以记 录该用户的个人信息,一旦该用户退出网站,那么属于他的session 对象将会注销。 session对象可以绑定若干人的信息或者Java对象。如果不同session对象内部定义了 相同的变量名,那么这些同名变量是不会相互干扰的。需要说明的是,session对象中所 保存和检索的信息不能是基本数据类型,必须是Java语言中相应的Object对象。下面 我们给大家介绍session对象中所包含的方法。 (1)setAttribute(Stringkey,Objectobj):该方法实现将参数obj所指定的对象添 加到session对象中,并为添加的对象指定一个索引关键字。索引关键字的值由参数key 确定。 (2)getAttribute(Stringname):该方法实现从session对象中提取由参数name指 定的对象。若该对象不存在,将返回null。 (3)getattributeNames():该方法返回session对象中存储的第一个对象,结果集是 一个Enumeration类的对象。我们可以使用nextElements()来遍历session中的全部 对象。 (4)getCreationTime():该方法将返回创建session对象的时间,以毫秒为单位,从 1970年1月1日起计数。 (5)getId():每生成一个session对象,服务器都会给其分配一个独一无二的编号, 该方法将返回当前session对象的编号。 (6)getLastAccessedTime():该方法将实现返回当前session对象最后一次被操作 的时间,即1970年1月1日起至今的毫秒数。 (7)getMaxInactiveInterval():该方法将获得session对象的生存时间,单位为秒。 (8)removeAttribute(Stringname):该方法将实现从session中删除由参数name 所指定的对象。 (9)isNew():该方法判断是不是一个新的用户。如果是返回true,否则返回false。 为了说明session对象的具体应用,下面我们用三个页面模拟一个多页面的Web应 用。用户访问ex5-4.jsp时所输入的姓名在do54.jsp中被保存在session对象中,它对其 后继的页面newdo54.jsp一样有效。它们的源程序如下。