■ 学习目标
了解和掌握request请求对象方法
了解和掌握response响应对象方法
了解和掌握out 输出对象方法
了解和掌握session会话对象方法
了解和掌握application 应用程序对象方法
了解pageContext 页面上下文对象方法
了解config配置对象方法
了解page页面对象方法
了解exception例外对象方法

目录:


  • Java程序的功能主要是由Java包下的各个类在运行期所产生的对象所提供,并且应用这些对象组织构建程序所需的功能。
  • 所谓JSP内置对象,是指在JSP网页环境之下,用户不需要声明而直接可以在JSP网页中使用的对象。
  • 需要注意的问题是对象名的写法,包括这些对象方法的调用时也要书写正确,因为Java语言本身是大小写敏感的。

4-0-1.png

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()等方法。

  1. String getParameter(String name)
  • 用表单和超链接、传递参数的时候,使用getParameter(String name)接收传递的参数。
  • 返回给定参数的值,当传递给此方法的参数名没有实际参数与之对应时,返回null
  • 使用getParameter(String name)取得的值都是字符串类型,需要转换为需要的类型。
  1. 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>");
    }
%>
  1. void setCharacterEncoding(String chaen)

    • 在form表单采用post方式提交请求时,需要设置request对象的编码方式,保证能够正确地取到数据。
      <%request.setCharacterEncoding("gbk");%>
  2. 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对象的相关特性。

4-4-1.png

数据输出

输出数据

  • 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"%>

缓冲区操作

缓冲区是数据输出到浏览器之前,用来暂存数据的一块区域。

4-4-2.png

缓冲区操作

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");
%>

4-4-2-1.png

获取缓冲区状态

获取缓冲区当前状态的方法,分別为getBufferSizegetRemainingisAutoFlush

  • 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 对象。

4-5-1.png

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中的变量数据在程序设定其值时被初始化,而当关闭网页服务器,或者超过预设时间而未有任何用户联机时自动消失。

4-6-1.png

存取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_SCOPEREQUEST_SCOPESESSION_SCOPEAPPLICATION_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() 重写错误的堆栈