Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25023
  • 博文数量: 25
  • 博客积分: 1010
  • 博客等级: 少尉
  • 技术积分: 270
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-22 20:04
文章分类

全部博文(25)

文章存档

2011年(1)

2009年(24)

我的朋友
最近访客

分类: Java

2009-08-14 17:17:17

第四章 隐含对象
所谓隐含对象,就是当你在编写JSP网页时,不须做任何的声明就可以直接使用的对象。
简介:
4-1列出了目前在JSP2.0规范中所定义的九个隐含对象:
隐含对象
 
作用域
 
request
javax.servlet.http.HttpServletRequest
request
请求对象
response
javax.servlet.http.HttpServletResponse
page
响应对象
pageContext
javax.servlet.jsp.PageContext
page
表示此JSPPageContext
session
javax.servlet.http.HttpSession
session
在同联机中,所产生的session数据,目前只对HTTP协议有意义。
application
javax.servlet.ServletContext
application
如同调用getServletConfig().
getServletContext()
out
javax.servlet.jsp.JspWriter
page
数据流的标准输出
config
javax.servlet.ServletConfig
page
表示此JSPServletConfig
page
javax.servlet.Object
page
如同Javathis
exception
javax.servlet.Throwable
page
异常处理
这九个隐含对象,我们将它分为四大类:
1.      Servlet有关的隐含对象
l        page
l        config
2.      Input/Output有关的隐含对象
l        out
l        request
l        response
3.      JSP执行时,提供有关Context的隐含对象
l        session
l        application
l        pageContext
4.      Error有关的隐含对象
l        Exception
 
第一节   属性与范围
    我们将requestsessionapplicationpageContext归为一类,原因在于:它们皆能借助setAttribute()getAttribute()来设定和取得其属性(Attribute),通过这两种方法来做到数据分享
    我们先看看下面的小程序:
Page1.jsp
在这个程序中,设定两个属性:namepassword,其值为:mikebrowser。然后再转交(forward)Page2.jsp。我只要在Page2.jsp当中加入application.getAttribute(),就能取得在Page1.jsp设定的数据。
Page2.jsp
Page1.jsp的执行结果如图4-1所示。
1.      Page作用域
JSP有四种作用域,分别为PageRequestSessionApplication。所谓Page
指的是当前页面,仅仅一页的范围。若要数据存入Page范围时,可以用pageContext对象的setAttribute()的方法;若要取得Page范围的数据时,可以使用pageContext对象的getAttribute()方法。我们将之前的范例做小幅度的修改,将application改为pageContext
    PageScope1.jsp
    PageScope2.jsp
    PageScope1.jsp执行后的结果如图4-2所示。
   PageScope3.jsp
   执行后的结果如图4-3所示。
2.      Request作用域
Request的范围是指在一JSP网页发出请求到另一个JSP网页之间,随后这个属性就失效。设定Request的范围时可利用request对象中的setAttribute()getAttribute()
范例:
RequestScope1.jsp
RequestScope2.jsp
RequestScope1.jsp的执行结果如图4-4所示。
  
现在我们将RequestScope1.jsp
改为
    执行RequestScope1.jsp时,结果还是和图4-4一样。这表示使用标签所包含进来的网页,同样也可以取得Request范围的数据。
3.      SessionApplication作用域
4-2介绍了最后两种范围:SessionApplication
作用域
 
Session
Session的作用域为一段用户持续和服务器连接的时间,服务器断线后,这个属性就无效。只要将数据存入session对象,数据作用域就为Session
Application
Application的作用域在服务器一开始执行服务,到服务器关闭为止。Application的作用域最大、停留时间最长,所以使用时要注意,不然可能会造成服务器负担过重。只要将数据存入application对象,数据的作用域就为Application
 
第二节   Servlet有关的隐含对象
Servlet有关的隐含对象有两个:pageconfigpage对象表示Servlet本身;config对象则是存放Servlet的初始参数值。
l        page对象
 page对象代表JSP本身,更准确的说,它代表JSP被转译后的Servelt,因
此,它可以调用Servlet类所定义的方法,不过实际上,page对象很少在JSP中使用。
范例:
在这个例子中page对象的类型为java.lang.Object,我们调用javax.servlet.jsp.HttpJspPage对其进行强制转换。执行后的结果如图4-5所示。
l        config对象
config对象里存放着一些Servlet初始的数据结构,config对象和page对象一样都很少被使用。config对象实现于javax.servlet.ServeltConfig接口,它共有下列四种方法:
(1)public String getInitParameter(String name)
(2)public Enumeration getInitParameterNames()
(3)public ServletContext getServletContext()
(4)public String getServeltName()
范例:
web.xml
执行后的结果:
 
第三节   Input/Output有关的隐含对象
本节我们介绍和Input/Output有关的隐含对象,它们包括:outrequestresponse对象。request对象表示客户端请求的内容;response对象表示响应客户端的结果;而out对象负责把数据的结果显示到客户端的浏览器。
l        request对象
request对象包含所有请求的信息,如:请求的来源、标头、cookies和请求相关的参数值等等。在JSP网页中,request对象是实现javax.servlet.http.HttpServletRequest接口的,HttpServletRequest接口所提供的方法,可以将它分为四大类:
(1)   储存和取得属性方法;
 
 
void setAttribute(String name,Object value)
说明name属性的值为value
Enumeration getAttributeNames()
取得request scope下所有属性名称
Object getAttribute(String name)
取得name属性的值
Void removeAttribute(String name)
移除name属性的值
index.jsp
   requestAttribute.jsp
   执行后的结果:
(2)   能够取得请求参数的方法;
 
 
String getParameter(String name)
取得name的参数值
Enumeration getParameterNames()
取得request scope下的所有参数名称
String[] getParameterValues(String name)
取得所有name的参数值
Map getParameterMap()
取得一个要求参数的Map
范例:
index.jsp
   requestParamter.jsp
   执行后的结果:
 
(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的方法(GETPOST)
String getProtocol()
取得使用的协议(HTTP/1.1HTTP/1.0)
String getQueryString()
取得请求的参数字符串,不过,HTTP的方法必须为GET
String getRequestedSessionId()
取得用户端的Session ID
String getRequestURI()
取得请求的URL,但是不包括请求的参数字符串
String getRemoteAddr()
取得用户的IP地址
String getRemoteHost()
取得用户的主机名称
int getRemotePort()
取得用户的主机端口
String getRemoteUser()
取得用户的名称
Void setCharacterEncoding(String encoding)
设定编码格式,用来解决窗体传递中文的问题
范例一:
index.jsp
   执行后的结果:
   范例二:
   index.jsp
   Request.jsp
执行后的结果:
l        Response对象
response对象主要将JSP处理数据后的结果传回到客户端。response对象是实现javax.servlet.http.HttpServletResponse接口。
(1)    设定标头的方法
 
 
void addCookie(Cookie cookie)
新增cookie
void addDateHeader(String name,long date)
新增long类型的值到name标头
void addHeader(String name,String value)
新增Stirng类型的值到name标头
void addIntHeader(String name,int value)
新增int类型的值到name标头
void setDateHeader(String name,long date)
指定long类型的值到name标头
void setHeader(String name,String value)
指定String类型的值到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重写的方法
 
 
String encodeRedirectURL(String url)
对使用sendRedirect()方法的URL予以编码
String encodeURL(String url)
URL予以编码,回传包含session IDURL
   范例一:
   index.jsp
    执行后的结果:
页面上的时间每隔一秒变动一次。
范例二:
index.jsp
执行的结果:
选择0(No Idea)1(Beginner),点击submit键显示如下:
   选择0(No Idea)0(No Idea),点击submit键将发送一个错误信息,显示如下:
l        out对象
 out对象能把结果输出到网页上。通常我们最常使用out.println(String anme)
out.print(String name),它们两者最大的差别在于println()在输出的数据后面会自动加上换行符;print()不会在数据后自动加上换行符。
注意:在实际的应用中 println()print()输出的效果相同。这是因为网页是以,
进行换行的。
out对象除了这两种方法最常使用之外,它还有一些方法(见表5-11),这些方法主要是用来控制管理输出的缓冲区(buffer)和输出流(output stream)
                       5-11 out对象方法
 
 
void clear()
清除输出缓冲区的内容
void clearBuffer()
清除输出缓冲区的内容
void close()
关闭输出流,清除所有的内容
int getBufferSize()
取得目前缓冲区的大小(KB)
int getRemaining()
取得目前使用后还剩下的缓冲区大小(KB)
Boolean isAutoFlush()
如果回传为true,表示如缓冲区满了,会自动清除;若false,表示如果缓冲区满了,不会自动清除,而会产生异常处理
范例:
index.jsp
执行后的结果:
第四节   Context有关的隐含对象
在本节中,我们要介绍sessionapplicationpageContext这三个对象。session对象提供一些机制,让服务器能个别辨认用户。当程序在执行时,application对象能提供服务端的Context,说明哪些资源是可利用的,哪些信息可获取的。pageContext对象提供存取所有在此网页中可被利用的隐含对象,并且可以管理它们的属性。
l        session对象
 session对象表示目前个别用户的会话(session)状况,用此项机制可以轻易识
别每一个用户,然后针对每一个别用户的要求,给予正确的响应。例如:购物车最常使用session的概念,当用户把物品放入购物车时,他不须重复做身份确认的动作(如:Login),就能确认用户是谁,把它的物品放在属于用户的购物车,而不会将物品放错到别人的购物车。除了购物车之外,session对象也通常用来做追踪用户的功能。详细内容在以后章节详细说明。
            5-12 java.servlet.http.HttpSession接口所提供的方法
 
 
long getCreationTime()
取得session产生的时间,单位是毫秒,由197011日零时算起。
String getId()
取得sessionID
long getLastAccessedTime()
取得用户最后通过这个session送出请求的时间,单位是毫秒,由197011日零时算起。
long getMaxInactiveInterval()
取得最大session不活动的时间,若超过这时间,session将会失效,时间单位为秒。
void invalidate()
取消session对象,并将对象存放的内容完全抛弃。
Boolean isNew()
判断session是否为的,所谓session,表示session已由服务器产生,但是client尚未使用。
void setMaxInactiveInterval(int interval)
设定最大session不活动的时间,若超过这时间,session将会失效,时间单位为秒。
session对象也可以存储或取得用户相关的数据,例如:用户的名称、用户所订购的物品、用户的权限,等等,这些要看我们的程序如何去设计。例如:我要设定某些网页必须要求用户先做登录的动作,确定是合法的用户时,才允许读取网页内容,否则把网页重新转向到登录的网页上。
index.jsp
member.jsp
执行后的结果:
    登录失败后:
登录成功后:
直接运行member.jsp后的结果:
    五秒钟后,自动返回index.jsp
l        application对象
application对象实现javax.servlet.ServletContext接口,它主要功用在于取得或更改Servlet的设定。application对象拥有Application的范围,意思就是说它的生命周期是由服务器产生开始至服务器关机为止。
          ServletContext接口容器相关信息的方法
 
 
int getMajorVersion()
取得Container主要的Servlet API版本
int getMinorVersion()
取得Container次要的Servlet API版本
String getServerInfo()
取得Container的名称和版本
              ServletContext接口有关服务端的路径和文件的方法
 
 
String getMimeType(String file)
取得指定文件的MIME类型
ServletContext getContext(String uripath)
取得指定Local URLApplication context
String getRealPath(String path)
取得本地端path的绝对路径
              ServletContext接口有关信息记录的方法
 
 
void log(String message)
将信息写入log文件中
void log(String message,Throwable throwable)
stack trace所产生的异常信息写入log文件中
范例:
执行后的结果:
l        pageContext对象
pageContext对象能够存取其他隐含对象。当隐含对象本身也支持属性时,pageContext对象也提供存取那些属性的方法。不过在使用下列方法时,需要指定范围的参数:
范围参数有四个常数,分别代表四种范围:PAGE_SCOPE代表Page范围,REQUEST_SCOPE代表Request范围,SESSION_SCOPE代表Session范围,最后APPLICATION_SCOPE代表Application范围。
               PageContext类取得其他隐含对象的方法
 
 
Exception getException()
回传目前网页的异常,不过此网页要为error page,例如:exception隐含对象
JspWriter getOut()
回传目前网页的输出流,例如:out隐含对象
Object getPage()
回传目前网页的Servlet实体,例如:page隐含对象
ServletRequest getRequest()
回传目前网页的请求,例如:request隐含对象
ServletResponse getResponse()
回传目前网页的响应,例如:response隐含对象
ServletConfig getServletConfig()
回传目前此网页的ServletConfig对象,例如:config隐含对象
ServletContext getServletContext()
回传目前此网页的执行环境(context),例如:application隐含对象
HttpSession getSession()
回传和目前网页有联系的会话(session),例如:session隐含对象
             
PageContext类所提供取得属性的方法
 
 
Object getAttribute(String name,int scope)
回传name属性,范围为scope的属性对象,回传类型为Object
Enumeration getAttributeNamesInScope(int scope)
回传所有属性范围为scope的属性名称,回传类型为Enumeration
int getAttributesScope(String name)
回传属性名称为name的属性范围
void removeAttribute(String name)
移除属性名称为name的属性对象
void removeAttribute(String name,int scope)
移除属性名称为name,范围为scope的属性对象
void setAttribute(String name,Object value,int scope)
指定属性对象的名称为name、值为value、范围为scope
Object findAttribute(String name)
寻找在所有范围中属性名称为name的属性对象
                PageContext类所提供范围的常数
 
 
PAGE_SCOPE
存入pageContext对象的属性范围
REQUEST_SCOPE
存入request对象的属性范围
SESSION_SCOPE
存入session对象的属性范围
APPLICATION_SCOPE
存入application对象的属性范围
范例:
index.jsp
代码执行后的结果:
第五节   Error有关的隐含对象
最后一类的隐含对象只有一个成员:exception对象。当JSP网页有错误时会产生异常,而exception对象就来针对这个异常做处理。
l        exception对象
 exception对象和session对象一样,并不是在每一个JSP页面中都能够使用。
若要使用exception对象时,必须在page指令中设定。
范例:
参考第三章错误处理
阅读(370) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~