■ 学习目标
了解和掌握request请求对象方法
了解和掌握response响应对象方法
了解和掌握out 输出对象方法
了解和掌握session会话对象方法
了解和掌握application 应用程序对象方法
了解pageContext 页面上下文对象方法
了解config配置对象方法
了解page页面对象方法
了解exception例外对象方法
目录:
- Java程序的功能主要是由Java包下的各个类在运行期所产生的对象所提供,并且应用这些对象组织构建程序所需的功能。
- 所谓JSP内置对象,是指在JSP网页环境之下,用户不需要声明而直接可以在JSP网页中使用的对象。
- 需要注意的问题是对象名的写法,包括这些对象方法的调用时也要书写正确,因为Java语言本身是大小写敏感的。
JSP内置对象概述
对象名称 | 衍 生 类 | 功 能 说 明 |
---|---|---|
request | javax.servlet.ServletRequest.HttpServletRequest | 取得客户端数据与系统的信息 |
response | javax.servlet.ServletReponse.HttpServletResponse | 响应客户端信息 |
application | javax.servlet.ServletContext | 记录与处理上线者共享的数据 |
session | javax.servlet.http.HttpSession | 记录与处理上线者的个别数据 |
out | javax.servlet.jsp.JspWriter | 控制数据输出的操作 |
config | javax.servlet.ServletConfig | 取得JSP编译后的Servlet信息 |
pageContext | javax.servlet.jsp.PageContext | 存取与处理系统运行时期的各项信息 |
page | java.lang.Object | 代表目前的这个JSP网页对象 |
exception | java.lang.Throwable | 异常处理机制 |
request与response对象
JSP网页能够具备与用户互动的功能,关键在于request对象与response对象所提供的功能,request让服务器取得用户在网页表单中所输入的数据内容,response则提供服务器端程序响应客户端信息所需的功能。
request与response对象,是学习建构JSP网页交互功能最重要的两个内置对象,它们与HTML窗体标签有着相当密切的关系,下面章节对其将会有详细的说明与范例介绍。
out对象
JSP是一种动态的网页,其与HTML这一类静态文件的最大不同,在于同一份网页经过程序运算得以根据各种条件及情况进行呈现。out对象在这一方面提供相关的支持,服务器端利用out对象将所要输出的内容,在传送至网页的时候动态写入客户端。
session与application对象
application与session这两个对象,基本上被使用于记录和处理JSP网页之间的共享数据。
由于互联网本身是一种无联机状态的应用程序,当网页文件从网站服务器传送至客户端的浏览器之后,客户端和服务器端之间就没有任何联机状态存在,这个先天的缺陷,让网页无法存储应用程序运行期间所需的共享数据,application与session对象就是被设计用来解决这样的问题的。
config、pageContext以及page对象
这3个对象被用于存取JSP网页程序运行阶段的各种信息内容,其中config包含JSP网页文件被编译成为Servlet之后的相关信息、pageContext则是提供系统运行期间各种信息内容的存取操作功能,page代表目前正在运行的JSP网页对象。
JSP服务器端应用程序可以运用这3个对象,存取网页运行期间的各种环境信息,同时将当前网页当作对象进行操作,本章最后将对于这几个对象将会有详细的说明与探讨。
exception对象
exception为JSP提供用于处理程序运行错误的异常对象,此对象搭配功能强大的异常处理机制,运用于JSP网页的程序除错与异常处理上。
通过指定某一个页面为错误处理页面,把所有的错误都集中到那个页面进行处理,可以使整个系统的健壮性得到加强,也可以使程序的流程更加简单明晰。
request对象
- request对象主要用于接收客户端通过HTTP协议连接传输到服务器端的数据。在客户端的请求中如果有参数,则该对象就有一个参数列表,它通常是HttpServletRequest的子类,其作用域就是一次request请求。
- HTTP通信协议是客户与服务器之间一种提交(请求)信息与响应信息(request/respone)的通信协议。在JSP中,内置对象request封装了用户提交的信息,那么该对象调用相应的方法可以获取封装的信息,即使用该对象可以获取用户提交的信息。
- request内置对象代表了客户端的请求信息,主要用于接受客户端通过HTTP协议传送给服务器端的数据。
- Request对象封装请求信息的内容:请求的头信息(Header)、系统信息(比如:编码方式)、请求的方式(比如:GET或POST)、请求的参数名称和参数值等信息;
- 还提供了获取cookie和session等对象、数据的方法。
- 通过request对象可以获取用户的请求信息
request对象包括很多方法,最主要的有getParameter(String name)、getParameterValues(String name)、getParameterNames()等方法。
String getParameter(String name)
- 用表单和超链接、
- 返回给定参数的值,当传递给此方法的参数名没有实际参数与之对应时,返回
null
。 - 使用
getParameter(String name)
取得的值都是字符串类型,需要转换为需要的类型。
Enumeration getParameterNames()
- 返回值类型:枚举类型Enumeration。
- 得到客户端提交的所有参数的名称。
【例4-1】中的代码段通过循环可获取客户端提交的所有参数的名字
<% Enumeration enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String parameterName = (String) enu.nextElement();
String parameterValue = (String) request.getParameter(parameterName);
out.print("参数名称:" + parameterName + "<BR>");
out.print("参数内容:" + parameterValue + "<BR>");
}
%>
-
void setCharacterEncoding(String chaen)
- 在form表单采用post方式提交请求时,需要设置request对象的编码方式,保证能够正确地取到数据。
<%request.setCharacterEncoding("gbk");%>
- 在form表单采用post方式提交请求时,需要设置request对象的编码方式,保证能够正确地取到数据。
-
String [] getParameterValues(String name)
- 使用
getParameterValues()
能够取出变量的多个值。返回值类型:字符串数组 String[]。 - 能够取出变量的多个值,主要用于获取复选框的值或是下拉列表带multiple属性的值。
response对象
response对象用于将服务器端数据发送到客户端以响应客户端的请求。
response对象实现HttpServletResponse接口,可对客户的请求做出动态的响应,向客户端发送数据,如Cookie、HTTP文件头信息等,一般是HttpServlet.Response类或其子类的一个对象。
1、动态响应contenType属性 public void setContentType(String type)
当一个用户访问一个JSP页面时,如果该页面用page指令设置页面的
contentType
属性是text/html,那么JSP引擎将按照这种属性值作出反映。如果要动态改变这个属性值来响应客户,就需要使用response对象的setContentType(String s)
方法来改变contentType
的属性值。
- 设置输出数据的类型:
- text/html: 网页
- text/plain: 纯文本
- application/x-msexcel: Excel文件
- application/msword: Word文件
2、设置刷新 public void setHeader(Stringname, String value)
setHeader可以设置HTTP应答报文的首部字段和值;利用setHeader方法可以设置页面的自动刷新
例如:
// 5秒种后自动刷新本页面
response.setHeader("Refresh","5");
// 5秒种后自动跳转到新页面
response.setHeader("Refresh", "5;URL=http://www.163.com");
3、将客户端重定向到指定的URL void sendRedirect(String redirectURL)
在某些情况下,当响应客户时,需要将客户重新引导至另一个页面,可以使用response的
sendRedirect(URL)
方法实现客户的重定向。
例如 :
response.sendRedirect(xxx.jsp?param1=aaa&...);
sendRedirect和
response.sendredirect()
会在客户端呈现跳转后的URL地址;这种跳转称为客户端跳转。使用response.sendredirect()
将重定向的URL发送到客户端,浏览器再根据这个URL重新发起请求。所以用这个方法时,浏览器地址栏上会显示新的请求资源的地址。并且此时的request,response都和第一次不一样,是重新产生的request,response。- 使用
完全是在服务器上进行,浏览器地址栏中的地址保持不变;这种跳转称为服务器端跳转。所以使用这个方法时没有产生新的request,response。 - 因为request没有变,在同一个请求内,可以用request来传递参数。
response.sendRedirect()
想带参数的话,自己在地址中写成xxx.jsp?param1=aaa&...
这种形式传递参数。能够使用标签向目标文件传送参数和值,目标文件必须是一个动态的文件,能够处理参数。 -
后面的语句不会被执行也不会继续发送到客户端,`response.sendRedirect()`后面的语句会继续执行(但是在页面上看不到),除非语句前面有return。 -
是在服务器的内部进行转换,只发送给客户端最后转到的页面,速度比较快; response.sendRedirect()
需要服务器与客户端之间的往返,可以转到任何页面,包括网络有效域名。但速度比较慢。
4、设定状态显示码的方法 void setStatus(int n)
-
当服务器对请求进行响应时,发送的首行称为状态行。
-
response状态行包括3位数字的状态代码。
-
对5类状态代码的大概描述。
- 1XX:1开头的3位数字:主要是实验性质的
- 2XX:表示请求成功。
- 3XX:表示在请求满足之前应该采取进一步的行动。
- 4XX:当浏览器做出无法满足的请求时,返回该状态码。
- 5XX:表示服务器出现的问题。
200:正常
400:请求类型不匹配
401:请求需要HTTP认证
403:取得请求但拒绝服务
404:资源找不到
500:Java 程序抛出异常
- 可以通过response对象的setStatus(int n)方法来增加状态行的内容。
5、void addCookie(Cookie cookie)
添加一个Cookie对象,用来保存客户端的用户信息。可以通过request对象的getCookie()方法获得这个Cookie。
Cookie可以保存用户的个性化信息,从而对下一次访问提供方便。
out对象
out对象是javax.servlet.jsp.JspWriter的一个对象,它能把信息发送给客户端的浏览器。
out对象常用的方法是print()和println(),两者都在浏览器上显示信息。out对象最主要的功能在于将特定的数据内容搭配JSP程序代码动态输出至客户端的浏览器网页,在本书稍早的章节范例当中,我们已经初步看到了如何使用这个对象进行文本输出,这一节的内容将进一步说明out对象的相关特性。
数据输出
输出数据
-
newLine在网页中输出一行空白,例如:
out.newLine();
-
print和println这2个方法成员被引用的时候均接受一个特定型态的参数,並且将这个参数输出到网页上:
out.print("Hello JSP") ;
、out.println("Hello JSP") ;
-
第一行程序代码将Hello JSP直接输出到客户端的缓冲区上,第二行则在输出Hello JSP之后紧接着加上一个换行。但这换行符在浏览器中会被忽略,要想真正在页面中实现换行,就需要在输出内容的最后加上换行标签
<br>
。 -
JSP程序利用out对象将网页内容输出时,都要和客户端做一次连接,并且会为此消耗不少的资源;
-
因此可以将要输出的内容放在一个固定大小的缓冲区中,等到缓冲区满时再一次性将内容送往客户端,这就要将autoFlush设为true,否则缓冲区满时将产生IOException错误。
<%@ page autoFlush="true"%>
缓冲区操作
缓冲区是数据输出到浏览器之前,用来暂存数据的一块区域。
缓冲区操作
clear()
、clearBuffer()
和flush()
使用于清空缓冲区內容。
clear()
使用于清空缓冲区中暂存的数据內容,缓冲区必需存在储存的数据 ,否则系统会引发一个IOException的例外 。clearBuffer()
只负责清除的操作而不在乎是否存在任何数据。flush()
除了清空缓冲区,还会进一步将所清空的数据内容输出到网页 。
【例4-10】out对象对缓冲区的操作outbuffer.jsp。
<%
out.println("JSP程序设计<br>");
out.clearBuffer();
out.println("清华出版社<br>");
out.flush();
out.println("康牧编著<br>");
out.println("==========<br>");
out.println("剩余缓冲区大小:"+
out.getRemaining()+"bytes<br>");
out.println("预设缓冲区大小:"+
out.getBufferSize()+"bytes<br>");
out.println("AutoFlush:"+out.isAutoFlush());
out.close();
out.print("hello");
%>
获取缓冲区状态
获取缓冲区当前状态的方法,分別为getBufferSize
、getRemaining
和isAutoFlush
。
getBufferSize
返回一个表示当前缓冲区大小的整数值。getRemaining
所返回的整数值,则是当前缓冲区中剩余的空间大小。isAutoFlush
用以设定当数据储存量大于缓冲区剩余空间的时候,是否清空其中的数据內容。是则返回一个true
,否则返回值为flase
。
session对象
session(会话)对象是类javax.servlet.Httpsession
的一个对象。session是从客户端连接服务器开始,直到与服务器断开连接为止。session对象用于保存每个与服务器建立连接的客户端的信息,session的ID保存于客户端的Cookie中,这个sessionID标识唯一的用户,与其他用户的sessionID不同。接下来针对session的概念与其中数据的处理方式来进行讨论。
session的概念
什么是Session:
- Session对象是一个jsp内置对象,它在第一个jsp页面被装载时自动创建,完成会话期管理。
- 从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面,服务器应当通过某种办法知道这是同一个客户,这就需要session对象。
当客户端用户向服务器提出请求打开网页后,若该网页中包含了为用户建立session的程序代码,则便会产生session 对象。
session对象的id
session对象的id:当一个客户首次访问服务器上的一个jsp页面时,jsp引擎产生一个session对象,同时分配一个String类型的id号,jsp引擎同时将这个id号发送到客户端,存放在Cookie(Cookie是Web服务器保存在用户硬盘上的一段文本)中,这样 session对象和客户之间就建立了一一对应的关系。当客户再访问连接该服务器的其他页面时,不再分配给客户新的session对象,直到客户关闭浏览器后,服务器端该客户的session对象才取消,并且和客户的会话对应关系消失。当客户重新打开浏览器再连接到该服务器时,服务器为该客户再创建一个新的session对象。
session的有效期限
session和application相同,有其存在的期限。当发生以下四种情形其中之一时,session对象中的数据便会清空 :
- 用户关闭目前正在使用的浏览器程序
- 关闭网页服务器
- 用户未向服务器提出请求超过预设的时间,Tomcat服务器预设为30分钟
- 运行程序结束session
访问session中的数据
建立session变量
- 在JSP中不需要特别设置程序代码来建立用户session,当程序使用了session对象时,便会自动建立session,而下面这行语句便是在session中新增变量数据的方式:
session.setAttribute("变量名称",变量内容)
- 变量内容可为字符串或者其他对象类型,接着让我们来看看如何使用这个方法在session中设置变量数据:
<%
// 设置字符串
session.setAttribute("id","编号");
// 设置日期
session.setAttribute("expire",new Date(86400*10));
// 设置整数
session.setAttribute("level",new Integer(3));
%>
返回session中的变量
- 在session中设置了变量数据后,在其他的各个网页中便可使用getValue读取其中的内容,此方法所返回的数据类型为对象(Object)类型,语法如下:
session.getAttribute("变量名称")
返回所有session中的变量名称
getValueNames()
方法可以取出session中所有变量的名称,其结果为一个枚举类的实例。语法为:
session.getAttributeNames()
清除session中的变量
removeValue()
方法可以清除session中的变量数据,使用语法如下:
session. removeAttribute("变量名称")
结束session
- 对于已经建立的session,可使用
invalidate()
方法将其结束,使用语法为:
session.invalidate()
其它session对象的常用方法
方 法 | 说 明 |
---|---|
getCreationTime() | 返回session建立的时间,返回值为从格林威治时间开始算起到session建立时的毫秒数 |
getLastAccessedTime() | 返回客户端对服务器端提出请求至处理session中数据最后的时间,若为新建立的session则返回–1 |
getMaxInactiveInterval() | 返回客户端未对session提出请求而session开始停滞到自动消失之间所间隔的时间,返回值以秒为单位 |
isNew() | 返回布尔值表示是否为新建的session |
SetMaxInactiveInterval (int interval) | 设置客户端未对session提出请求而session开始停滞到自动消失之间所间隔的时间为interval,以秒为单位 |
session.getValue()
方法所返回的数据类型为对象(Object)类型, 可以根据程序的需要转换为其他数据类型。
application内置对象
Application对象和Session对象相比,含义更加广泛。
什么是application:
Application对象保存了一个应用系统中公有的数据,一旦创建了application对象,除非服务器关闭,否则application对象将一直得保存,并为所有客户共享。
服务器启动后就会自动创建application对象,当客户在所访问的网站的各个页面之间浏览时,这个application对象都是同一个,直到服务器关闭。所有客户的application对象都是同一个,即所有客户共享这个内置的application对象。
在JSP服务器运行时,仅有一个application对象,它由服务器创建,也由服务器自动清除,不能被用户创建和清除。
Application是一个所有在线用户共享的数据存取区,application中的变量数据在程序设定其值时被初始化,而当关闭网页服务器,或者超过预设时间而未有任何用户联机时自动消失。
存取application中的数据
建立application变量
除了系统预设的application变量外,要在application中建立变量数据则必须使用setAttribute()
方法,建立application变量的语法如下:
application.setAttribute(“变量名称”,变量内容);
<%
// 设置字符串
application.setAttribute("id","编号");
// 设置日期
application.setAttribute("expire",new Date(86400*10));
// 设置整数
application.setAttribute("level",new Integer(3));
%>
返回application中的变量
在设置了application中的变量数据之后,接着在各个网页中便可利用getAttribute()
方法来取得所设置的application变量内容,使用语法如下:
application.getAttribute("变量名称")
此方法返回的数据内容为对象(Object)类型,延续前面的例子,若在其他的网页中加入下面的程序代码,则会在浏览器上显示objApp变量存储的内容:
<%
Object objApp = application.getAttribute("id");
out.println(id);
%>
删除application变量
要删除application中的变量数据,必须引用removeAttribute()
,使用的语法为:
application.removeAttribute("变量名称")
返回所有application变量
getAttributeNames()
方法会返回application中所有变量名称的集合对象,数据类型为Enumeration
。
getAttributeNames()
使用语法如下:application.getAttributeNames()
使用 application 对象取得信息
方 法 | 说 明 |
---|---|
getMajorVersion() | 返回服务器解释引擎所支持的最新 Servlet API 版本 |
getMinorVersion() | 返回服务器解释引擎所支持的最低 Servlet API 版本 |
getMimeType(String file) | 返回文件 file 的文件格式与编码方式 |
getRealPath(String path) | 返回虚拟路径 path 的真实路径 |
getServerInfo() | 返回服务器解释引擎的信息 |
其他JSP内置对象
pageContext对象
pageContext对象衍生于javax.servlet.jsp.PageContext
类,该对象可以得到当前页面中所有其他的JSP隐含对象,例如getRequest()
、getResponse()
、getOut()
和getSession()
等,并提供了处理JSP各个对象与属性的方法。
pageContext 对象用于访问页面有效属性的方法及对应的说明:
方 法 | 说 明 |
---|---|
Object getAttribute(String name) | 返回当前页面内的name变量 |
void setAttribute(String name, Object obj) | 设定当前页面内name变量值为obj |
void removeAttribute(String name) | 删除当前页面内的name变量 |
HttpSession getSession() | 取得页面的session对象 |
ServletContext getServletContext() | 返回ServletContext对象,这个对象对所有的页面都是共享的。 |
javax.servlet.ServletRequest getRequest() | 该方法的返回对象是JSP内置对象request对象,主要用于获取客户端的信息。 |
pageContext对象访问所有范围的属性操作与上面的方法类似,只是多了一个输入参数,例如设置变量值可以用setAttribute(String name,Object obj,int scope)
,其中,scope取值可以为PAGE_SCOPE
、REQUEST_SCOPE
、SESSION_SCOPE
和APPLICATION_SCOPE
,分别代表页内有效、请求有效、会话有效和应用有效。pageContext对象还可以实现页面重定向和包含页面等功能。
-
pageContext.setAttribute(“usename”,name)
设置的属性在当前页面有效。 -
pageContext.getSession().setAttribute(“session Value”,name)
设置的属性在session中有效。 -
pageContext.getServletContext().setAttribute(“sharevalue”,name)
设置的属性是对所有页面共享的。
config对象
config对象是类javax.servlet.ServletConfig
的一个对象,它标识Servlet的配置。config对象主要用来取得服务器的配置信息,在JSP页面通过JSP Container进行初始化时被传递。
使用config对象,在修改需要在Web服务器中处理的变量时,不需要逐一修改JSP文件,而只需修改相应属性文件的内容,这样就大大简化了网络维护工作,而且能够避免由于忘记修改一些文件而造成的错误。
config对象常用的方法及对应的说明如下:
方 法 | 说 明 |
---|---|
String getInitParameter(String name) | 返回name所指定的初始参数 |
java.util.Enumeration getInitParameterNames() | 返回所有初始参数 |
ServletContext getServletContext() | 返回Servlet相关的上下文对象 |
String getServletName() | 返回Servlet名称 |
page对象
- page对象代表了正在运行的由JSP文件产生的类对象,此对象在JSP中并不常用
- page对象是指向当前JSP程序本身的对象,有点像类中的this,参考【例4-9】。page对象其实是
java.lang.Object
类的实例对象,它可以使用Object类的方法,例如hashCode()
、toString()
等方法。page对象在JSP程序中的应用不是很广,但是java.lang.Object
类还是十分重要的 - JSP内置对象很多方法的返回类型是Object,需要用到Object类的方法
exception对象
exception对象是类java.lang.Throwable
的一个对象,是为JSP提供用于处理程序运行错误的异常对象,可以配合page指令一起使用。参考【例4-10】,通过指定某一个页面为错误处理页面,把所有的错误都集中到那个页面进行处理,可以使整个系统的健壮性得到加强,也可以使程序的流程更加简单明晰。
必须在isErrorPage=“true”
的情况下才可以使用exception对象。
exception对象常用的方法及对应的说明如下:
方 法 | 说 明 |
---|---|
String getMessage() | 返回错误信息 |
String getLocalizedMessage() | 取得本地语系的错误提示信息 |
void printStackTrace() | 以标准错误的形式输出一个错误和错误的堆栈 |
String toString() | 该方法以字符串的形式返回一个对异常的描述 |
Throwable fillInStackTrace() | 重写错误的堆栈 |