隐式对象
Servlet创建了几个由JSP引擎使用的隐式对象。开发人员不用事先声明就可以使用标准的变量来访问这些对象。JSP提供了9种隐式对象。
一、学习JSP的page 对象
page对象代表JSP本身,更准确地说它代表JSP被转译后的Servlet,它可以调用Servlet类所定义的方法。page对象其实是Java.lang.Object类的实例对象,它可以使用Object类的方法,例如,hashCode()、toString()等方法。page对象在JSP程序中的应用不是很广,但是java.lang.Object类还是十分重要的,因为JSP内置对象的很多方法的返回类型是Object。
二、学习JSP的config 对象
config对象是在一个servlet程序初始化时,JSP引擎向它传递消息用的,此消息包括servlet程序初始化时所需要的参数及服务器的有关信息。Config对象其实是实现javax.servlet.ServletConfig接口的类的实例对象,它可以使用下面的3个方法。
1)getServletContext()
调用这个方法可以返回一个含有服务器相关信息的ServletContext对象,即JSP内置对象--application对象。
2)getInitParameter(String name)
调用这个方法可以返回servlet程序初始参数的值,参数名由name指定。
3)getInitParameterNames()
调用这个方法可以返回一个枚举对象,该对象由servlet程序初始化所需要的所有参数的名称构成。
我们可以通过如下所示的方式获取JSP/Servlet程序初始化所需要的参数名称和它们的值:
<% |
上面的代码段仅适用于JSP程序,如果要用于Servlet程序,需要修改部分代码。其次,有些服务器仅仅支持设定Servlet程序的初始参数,还支持设定JSP程序的初始参数,对于这一点,请读者要特别留心服务器的说明文档。
config对象在Servlet程序中的作用很大,不过在Servlet程序中没有内置对象这一说,严格的说法应该是ServletConfig接口在servlet程序中作用很大。但是JSP页面中的config对象的作用很小。
三、学习JSP的request 对象
request对象可以获得客户端的输入信息。request对象包括了从客户端传来的请求信息。在HTTP 1.1协议中,客户端请求信息是从客户端通过HTTP头(HTTP Header)和消息体传送到服务器端的。请求的参数是一个请求的组成部分,它们被作为字符串从客户端传送到JSP/Servlet容器,并被用于初始化request对象。
request 对象实现javax.servlet.http.HttpServletRequest接口的,所提供的方法可以将它分为四大类:
1.储存和取得属性方法;
void setAttribute(String name, Object value)设定name属性的值为value
Enumeration getAttributeNamesInScope(int scope)取得所有scope 范围的属性
Object getAttribute(String name)取得name 属性的值
void removeAttribute(String name)移除name 属性的值
2.取得请求参数的方法
String getParameter(String name)取得name 的参数值
Enumeration getParameterNames( )取得所有的参数名称
String [] getParameterValues(String name) 取得所有name 的参数值
Map getParameterMap( ) 取得一个要求参数的Map
3.能够取得请求HTTP 标头的方法
String getHeader(String name) 取得name 的标头
Enumeration getHeaderNames() 取得所有的标头名称
Enumeration getHeaders(String name) 取得所有name 的标头
int getIntHeader(String name) 取得整数类型name 的标头
long getDateHeader(String name) 取得日期类型name 的标头
Cookie [] getCookies( ) 取得与请求有关的cookies
4.其他的方法
String getContextPath( ) 取得Context 路径(即站台名称)
String getMethod( ) 取得HTTP 的方法(GET、POST)
String getProtocol( ) 取得使用的协议 (HTTP/1.1、HTTP/1.0 )
String getQueryString( ) 取得请求的参数字符串,不过,HTTP的方法必须为GET
String getRequestedSessionId( ) 取得用户端的Session ID
String getRequestURI( ) 取得请求的URL,但是不包括请求的参数字符串
String getRemoteAddr( ) 取得用户的IP 地址
String getRemoteHost( ) 取得用户的主机名称
int getRemotePort( ) 取得用户的主机端口
String getRemoteUser( ) 取得用户的名称
void etCharacterEncoding(Stringencoding) 设定编码格式,用来解决窗体传递中文的问题
四、学习JSP的response 对象
response表示服务器端对客户端的一种回应,response 对象主要将JSP 处理数据后的结果传回到客户端。
response 对象是实现javax.servlet.http.HttpServletResponse 接口。response对象所提供的方法:
1.设定表头的方法
void addCookie(Cookie cookie) 新增cookie
void addHeader(String name, String value) 新增String类型的值到name标头
void addDateHeader(String name, long date) 新增long类型的值到name标头
void addIntHeader(String name, int value) 新增int类型的值到name标头
void setHeader(String name, String value) 指定String类型的值到name标头
void setDateHeader(String name, long date) 指定long类型的值到name标头
void setIntHeader(String name, int value) 指定int类型的值到name标头
2.设定响应状态码的方法
void sendError(int sc) 传送状态码(status code)
void sendError(int sc, String msg) 传送状态码和错误信息
void setStatus(int sc) 设定状态码
3.用来URL 重写(rewriting)的方法
void sendRedirect( )(String url) 使当前页面重定向到另外的JSP程序或者HTML文件中。
五、学习JSP的out 对象
out 对象能把结果输出到网页上。
out主要是用来控制管理输出的缓冲区(buffer)和输出流(output stream)。
void clear( ) 清除输出缓冲区的内容
void clearBuffer( ) 清除输出缓冲区的内容
void close( ) 关闭输出流,清除所有的内容
int getBufferSize( ) 取得目前缓冲区的大小(KB)
int getRemaining( ) 取得目前使用后还剩下的缓冲区大小(KB)
boolean isAutoFlush( )回传true表示缓冲区满时会自动清除;false表示不会自动清除并且产生异常处理
六、学习JSP的session 对象
session对象是十分重要的一个JSP内置对象,它可以用来在每一个用户之间分别保存用户信息,这与application对象不同。application对象用于在多个程序之间保存信息,application对象只有一个,它可以绑定若干个相当于全局变量的参数或者Java对象,每个JSP程序所访问的都是application对象的一个同步副本,都是一样的,而且application对象的生命周期贯穿服务器的整个运行周期。但是,服务器上的session对象却可以有多个,不同的用户所面临的session对象一般来说是不同的,当用户登录网站,系统将为他生成一个独一无二的session对象,用以记录该用户的个人信息,一旦该用户退出网站,那么该session对象将会被注销。session对象也可以绑定若干个参数或者Java对象,这些参数或者Java对象就相当于局部变量,不同session对象间的同名变量是不会相互干扰的。我们应用session对象的功能,可以十分简单地实现购物车等功能。
session对象实现javax.servlet.http.HttpSession接口。获取session对象有以下方法:
1)使用session关键字直接引用session对象
<% |
2)使用request对象的getSession()方法
使用request对象的getSession()方法可以返回HttpSession接口的实例对象,也就是session对象,注意,这个新获得的HttpSession对象不能够被命名为session,因为session是JSP引擎自动创建的当前session对象的一个同步副本,如程序4-18所示。
createSession1.jsp
01 <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> |
程序演示了getSession()方法的使用,它首先使用getSession()方法获取HttpSession对象--mysession,然后输出它的id,同时也输出session的id,运行结果证明了这两个id是一样的,要注意的是每个用户的session对象的id是不同的(服务器就靠不同的id鉴别不同的session对象),而且每个用户只能够有一个session对象,无论mysession还是session,都是当前session对象的一个同步副本。
图4-18 createSession1.jsp程序的运行效果 |
3)使用PageContext对象的getSession()方法
使用pageContext对象的getServletContext()方法可以获得application对象的副本,同样,使用pageContext对象的getSession()方法也可以获取session对象的一个副本,如程序4-19所示。
【程序4-19】createSession2.jsp
01 <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> |
图4-19 createSession2.jsp程序的运行效果 |
下面我们介绍session对象的主要用法:
1)getValue(String name)
和application对象一样,session对象也允许将若干个参数或者Java对象绑定在自己身上,相当于局部变量的作用,这些变量的生命周期就是session对象的存活周期,我们可以使用putValue()方法或者getValue()方法存取这些变量的值,或者使用removeValue()方法将它们删除,也就是解除它们和session对象之间的绑定关系,getValue()方法就用于获取指定名字的(由name指定)和session对象绑定的变量的值,如果不存在这个参数或者Java对象,那么该方法将会返回null值。getValue()方法的用法如下所示:
<% |
2)getValueNames()
该方法可以返回和当前session对象绑定在一起的参数或者Java对象的名字,该方法的返回值是一个字符串数组。它的使用方法如下所示:
<% for(int i=0; i<name.length; i++) |
3)getCreationName()
该方法可以返回当前session对象创建的时间,单位以毫秒计算,从1970年1月1日开始。用不同方法获取的session对象的副本,如果都调用这个方法,那么返回值都是一样的。读者可以试验一下下面的JSP代码片段,看看是否真的如此:
<% out.println(mysession.getId()+"--->"+ |
4)getId()
服务器端每生成一个session对象,都会赋予它一个独一无二的编号,这个编号不会重复,服务器就依赖此编号来鉴别不同的客户,getId()方法就返回当前session的编号,如果你使用上面介绍的方法创建了多个session对象的副本,那么这些副本调用getId()方法的返回值都是一样的。
5)getLastAccessedTime()
该方法用于返回当前session对象最后一次被操作的时间,单位是毫秒,该方法返回自1970年1月1日至今的毫秒数。应用这个方法,我们可以判断某个用户在站上一共待了多少时间。
6)getMaxInactiveInterval()
该方法可以获取当前session对象的最大休眠时间。服务器会为每个用户创建一个session对象,如果用户不断地进行浏览等操作,那么这个session对象就一直处于活动状态,如果用户仅仅是打开一个页面,然后不做任何操作,那么这个session对象就处于休眠状态,session对象如果处于休眠状态太久了,超过了一定的时间,那么服务器会默认用户已经退出了网站,并且会自动清除这个session对象。这个时间限制就是所谓的最大休眠时间,设定一个session对象的最大休眠时间,对于一个JSP服务器来说是十分重要的,因为这样可以及时回收闲置的资源。如果getMaxInactiveInterval()方法的返回值是-1,那么,session对象的最大休眠时间为无限长。
7)setMaxInactiveInterval(int time)
该方法通常和getMaxInactiveInterval()方法配合使用,主要用于设定最大休眠时间。它的使用情况如下所示:
<% |
8)removeValue(String name)
该方法可以使得某个参数或者Java对象与当前的session对象解除绑定状态。
9)putValue(String name, java.lang.Object value)
putValue()方法和removeValue()方法恰好相对,putValue()方法可以将某个参数或者Java对象和当前的Java对象绑定起来。putValue()方法的参数name指定需要绑定的名称,value指定需要绑定的参数或者Java对象的值。如果在使用putValue()方法以前,已经有同名的参数或者Java对象被绑定于session对象上,那么新值将会覆盖旧值。
10)invalidate()
该方法将会清除当前的session对象,解除它和任何参数或者Java对象的绑定关系。
注意:
能够和application对象或者session对象绑定的只能够是Java对象,如String、Integer、Vector等,而不能够是普通的数据类型,如int、double、float等,如果真需要将它们绑定到application对象或者session对象上,那么它们必须首先转化为相应的Java对象。
七、学习JSP的application对象
application对象是一个特别重要的JSP对象,它存在于服务器的内存空间中,服务器一旦启动,就会自动产生一个application对象,除非服务器被关闭,否则这个application对象将一直保持下去。application对象要由服务器自动清除它,不能被用户创建,用户也不能清除application对象,我们只能创建这个application对象的同步副本。application就是由JSP引擎自动创建的第一个application对象的同步副本。特别需要注意的是这些副本是同步的,任何一个副本上发生的变化都会影响到其他的副本。在application对象的生命周期中,在当前服务器上运行的每一个JSP程序都可以任意存取和这个application对象绑定的参数(或者Java对象)的值。application对象的这些特性为我们在多个JSP程序中、多个用户共享某些全局信息(如当前的在线人数等)提供了方便。由此我们可以不借助数据库就实现聊天室的功能。
因为环境的信息通常都储存在ServletContext中,所以常利用application对象来存取ServletContext中的信息。
application 对象实现javax.servlet.ServletContext 接口。我们具体如何获得application对象呢?有以下几种方法:
1)在JSP程序中直接使用application以代表application对象
<% application.Method(); %> |
2)使用ServletConfig接口
使用ServletConfig接口可以间接获取application对象,但是这个application对象的名字不能同样为application,因为application是JSP引擎创建的默认的application对象的副本,不能够被覆盖。使用ServletConfig接口其实就是使用config对象,config对象是实现ServletConfig接口的类的实例对象,它可以通过调用getServletContext()方法返回一个ServletContext接口的对象,也就是application对象的一个副本,如程序4-3所示。
【程序4-3】createApp1.jsp
01 <%@ page language="java" import="java.util.*" |
图4-4 createApp1.jsp程序的运行效果 |
3)使用pageContext对象获取application对象
pageContext对象的getServletContext()方法同样可以返回一个application对象的副本,如程序4-4所示。
【程序4-4】createApp2.jsp
01 <%@ page language="java" import="java.util.*" |
程序4-4的运行效果如图4-5所示,我们从图中可以发现,与程序4-3的运行效果是相同的。
图4-5 createApp2.jsp程序的运行效果 |
application对象的方法
1)getAttribute(String name)
当我们创建application对象的同步副本后,就可以存取和application对象绑定在一起的参数或者Java语言中的类的对象,因为application对象的生命周期是贯穿服务器的运行周期,因此,这些参数或者Java对象既然和application对象绑定在一起,那么它们的生命周期也应该和application对象一样,除非使用application对象的方法去绑定它或者使它和application对象解除绑定。使用getAttribute()方法可以返回那些和当前application对象绑定在一起的值或者Java对象。getAttribute()方法的参数name指定了目标参数或者目标Java对象的名字。
getAttribute()方法的使用方法如下:
<% |
2)getAttributeNames()
该方法可以返回所有与当前application对象绑定在一起的参数或者Java对象的名字。这个方法的返回值是一个枚举对象(Enumeration)。它的使用方法如下:
<% |
3)getServerInfo()
该方法可以获得当前服务器的详细信息,不同的服务器返回的信息格式不一样。
4)setAttribute(String name, Object object)
该方法通常和getAttribute()方法及removeAttribute()方法搭配使用,它的作用就是将某个参数或者Java对象与application对象绑定在一起,在setAttribute()方法中,参数name指定和application对象绑定的参数或者Java对象的名称,参数object指定需要绑定的值,object必须是一个Java对象,例如Integer对象,但不能够是int类型的数据。如果在绑定新值时,已经有同名的参数或者Java对象和application对象绑定了,那么新值将会覆盖旧值。
setAttribute()方法的使用方法如下。
将某个字符串参数和application对象绑定在一起:
<% |
<% |
5)removeAttribute(String name)
通过该方法,我们可以使某个参数或Java对象与application对象解除绑定关系。一旦绑定关系被解除,我们就不能使用getAttribute()方法获取它们的值了,否则,将会返回null值。
它的使用方法如下:
<% |
6)log(String msg)
该方法用于往服务器的log文件中写入信息,至于是哪一个log文件,则由服务器来决定。利用这个方法,我们可以在log文件中记录访问者的信息,这对于统计访问流量来源方面十分有用,同时也便于管理员监控网站的运行情况。其实,还有一个同名但使用不同参数的log()方法,利用后者,我们可以将JSP程序执行过程中所发生的错误事件都记入log文件中。
在大部分的服务器中我们可以使用application.Method(…),但在有些较旧版本的服务器中,它们不支持application的形式,但它们支持以getServletContext().Method(…)的形式实现application对象的功能,读者一定要多加留心。
八、学习JSP的pageContext对象
pageContext对象是JSP中很重要的一个内置对象,不过在一般的JSP程序中,很少用到它,所以知道request对象、response对象的人比较多,知道pageContext对象的人就比较少了。它是javax.servlet.jsp.PageContext类的实例对象,可以使用PageContext类的方法。实际上,pageContext对象提供了对JSP页面所有的对象及命名空间的访问。pageContext对象的方法可以访问除本身以外的8个JSP内部对象,还可以直接访问绑定在application对象、page对象、request对象、session对象上的Java对象。pageContext对象相当于JSP程序中所有对象功能的集成者。不过,这里存在着一个问题,既然可以直接访问JSP内部对象,为什么还要多此一举,通过pageContext对象来访问它们呢?这也正是pageContext对象应用较少的原因。话虽这样说,pageContext对象总是JSP中9个内置对象不可或缺的一部分,读者还是需要掌握它的用法的。
pageContext对象的主要用法如下。
1)getOut()
该方法返回一个JspWriter类的实例对象,也就是JSP内置对象--out对象,可以往客户端写入输入流。它的使用方法如下::
<% |
2)getSession()
该方法的返回值是一个HttpSession接口的实例对象,即JSP内置对象--session对象,可以保存不同用户的信息。它的使用方法如下:
<% |
3)getPage()
该方法的返回值是一个java.lang.Object对象,也就是JSP内置对象--page对象。它的使用方法如下:
<% |
4)getResponse()
该方法的返回对象是javax.servlet.ServletResponse,也就是JSP内置对象--response对象,主要用于控制HTTP连接。它的使用方法如下:
<% |
5)getRequest()
该方法的返回对象是javax.servlet.ServletRequest,也就是JSP内置对象--request对象,主要用于获取客户端的信息。它的使用方法如下:
<% myrequest.setAttribute("username",username2); |
6)getException()
该方法的返回值是当前页的exception对象。它的使用方法如下:
<% |
上面的代码片段最好在错误处理程序中使用,也就是page编译指令的isErrorPage属性为true的页面中。
7)getServletConfig()
该方法可以返回当前的config对象,用于获取JSP/Servlet程序的初始参数。它的使用方法如下:
<% |
8)getServletContext()
该方法的返回值是一个ServletConfig接口的实例对象,也就是JSP内置对象--application对象的副本。它的使用方法如下:
<% myapplication.setAttribute("username",username3); |
9)setAttribute(String name, Object o, int scope)
pageContext对象的setAttribute()方法可以将参数或者Java对象绑定到application对象、session对象、request对象或者page对象上,这里的scope参数可以取以下的值。
pageContext.PAGE_SCOPE
pageContext.REQUEST_SCOPE
pageContext.SESSION_SCOPE
pageContext.APPLICATION_SCOPE
当scope参数的值为pageContext.SESSION_SCOPE时,调用PageContext对象的setAttribute()方法和调用session对象的putValue()方法是等效的,都是将某个参数或者Java对象和当前的session绑定起来。如果scope参数的值为如果scope参数的值为pageContext.APPLICATION_SCOPE,那么调用PageContext对象的setAttribute()方法和调用application对象的setAttribute()方法是等效的。如果scope参数是其他的值,原理也是一样的,我们就不多说了。它的使用方法如下:
<% |
10)getAttribute(String name, int scope)
pageContext对象的getAttribute()方法也可以直接获取和application对象、page对象、session对象、request对象相互绑定的参数或者Java对象的值。这个方法的scope参数的意义和上面讲的一样。如果scope参数的值是pageContext.REQUEST_SCOPE,那么getAtttribute()方法就在当前的request对象内部查找有没有绑定一个名为name的Java对象,如果有,就返回这个对象,如果没有,返回null值。如果scope参数的值是pageContext.APPLICATION_SCOPE,那么getAtttribute()方法的作用范围将是application对象。它的使用方法如下:
<% |
11)removeAttribute(String name, int scope)
顾名思义,pageContext对象的removeAttribute()方法可以直接解除application对象、session对象、request对象、page对象和某个特定的参数或者Java对象的绑定关系。这个方法的scope参数指定了作用的范围,如果scope参数的值为pageContext.SESSION_SCOPE,那么removeAttribute()方法将会使某个参数或者Java对象和当前的session对象解除绑定关系,如果scope参数是其他值,原理也一样的。它的使用方法如下::
<% |
12)findAttribute(String name)
pageContext对象的findAttribute()方法将在application对象、session对象、request对象、page对象内部查找是否有某个参数或者Java对象与这些对象绑定了,搜索顺序是先是范围最小的page对象,其次是request对象、session对象,最后是application对象,这个方法的返回值是第一个符合要求的Java对象的值。它的使用方法如下:
<% |
13)getAttributeScope(String name)
使用这个方法可以知道特定的参数或者Java对象和哪一个JSP对象绑定在一起。该方法的返回值是整型常数,可能是下面4个常数之一:
pageContext.PAGE_SCOPE
pageContext.REQUEST_SCOPE
pageContext.SESSION_SCOPE
pageContext.APPLICATION_SCOPE
如果返回值是pageContext.SESSION_SCOPE,表明这个Java对象和session对象绑定在一起。如果是其他返回值,读者可以依次类推。它的使用方法如下:
<% |
14)getAttributeNameInScope(int scope)
该方法可以获取特定JSP对象内部绑定了哪些参数或者Java对象,scope参数指定了该方法的作用范围。这个方法的返回值是一个枚举对象(Enumeration)。它的用法示例如下:
<% |
上面的JSP代码段将返回session对象中所绑定的参数或者Java对象的名字。
15)release()
该方法将会释放pageContext对象所占的资源。
16)forward(String url)
该方法可以实现网页的重定向功能,类似于response.sendRedirect()方法。
17)include(String relativeUrlPath)
该方法可以让当前文件包含进一个外部文件,类似于JSP的include编译指令和<jsp:include>操作指令。
由上面对pageContext对象的介绍,读者应该不难看出,pageContext对象有两大主要功能,分别是获取各JSP内部对象,以及直接操作与某些JSP对象绑定在一起的参数或者Java对象。
九、学习JSP的exception对象
若要使用exception 对象时,必须在page 指令中设定。< %@ page isErrorPage="true" %>才能使用。
exception提供的三个方法:
getMessage( ) 该方法返回错误信息。
printStackTrace( ) 该方法以标准错误的形式输出一个错误和错误的堆栈。
toString():该方法以字符串的形式返回一个对异常的描述。
如果某个JSP页面在执行的过程中出现了错误,那么JSP引擎会自动产生一个异常对象,如果这个JSP页面指定了另一个JSP页面为错误处理程序,那么JSP引擎会将这个异常对象放入到request对象中,传到错误处理程序中,在错误处理程序里,因为page编译指令的isErrorPage属性的值被设为true,那么JSP引擎会自动声明一个exception对象,这个exception对象从request对象所包含的HTTP参数中获得:
Throwable exception=(Throwable)request.getAttribute |
事实上,javax.servlet.jspException是JSP引擎为exception对象所取的名字,并不存在所谓的jspException类,exception对象实际上是java.lang.Throwable类的实例对象。
下面的程序4-9和程序4-10分别演示了exception对象的使用方法。程序4-9中首先引发一个Java异常事件,使得当前JSP页面定向到指定的错误处理程序--程序4-10,并且在该页面中将错误信息输出。
【程序4-9】errorthrow1.jsp
01 <%@ page language="java" import="java.util.*" |
程序4-9在执行时,将会引发一个除数为零的异常,并指定该异常由程序4-10进行处理。
【程序4-10】error.jsp
01 <%@ page language="java" import="java.util.*" |
图4-9 errorthrow1.jsp的运行效果 |
每个对象的范围,即作用域:
内置对象 | 代表内容 | 范围 |
request | 触发服务调用的请求 | request |
response | 对请求的应答 | page |
session | 为请求的客户创建的session对象 | session |
application | 从 servlet 配置对象获得的 servlet 上下文(如在getServletConfig() ,getContext()的调用中) | application |
out | 向输出流写入内容的对象 | page |
pageContext | 本 JSP 的页面上下文 | page |
page | 实现处理本页当前请求的类的实例 | page |
config | 本 JSP 的 ServletConfig | page |
exception | 表示JSP页面运行时产生的异常 | Page |