JSP动态WEB技术与开发实例第三章JSP的内置对象.docx
《JSP动态WEB技术与开发实例第三章JSP的内置对象.docx》由会员分享,可在线阅读,更多相关《JSP动态WEB技术与开发实例第三章JSP的内置对象.docx(76页珍藏版)》请在冰豆网上搜索。
JSP动态WEB技术与开发实例第三章JSP的内置对象
第1章JSP技术概述
第2章JSP语法基础
第3章JSP的内置对象
JSP的内置对象是无须声明就可以直接在JSP页面脚本(Java程序片和Java表达式)中使用的对象,JSP共有以下9种基本内置对象:
request对象、response对象、session对象、out对象、application对象、page对象、exception对象、pageContext对象、config对象。
这些对象是Web开发中最为常用的对象,本章中将一一介绍并通过实例引导大家学习掌握,在学习过程中,应重点掌握request对象、response对象、session对象、out对象、application对象。
3.1内置对象概述
JSP内置对象包括request对象、response对象、session对象、out对象、application对象、page对象、exception对象、pageContext对象、config对象。
这些对象在客户端和服务器端交互的过程中分别完成不同的功能。
3.1.1JSP内置对象概述
1.request对象
request对象是javax.servlet.http.HttpServletRequest类的实例。
代表请求对象,主要用于接受客户端通过HTTP协议连接传输到服务器端的数据。
比如表单中的数据、网页地址后带的参数等。
2.response对象
response对象是javax.servlet.http.HttpServletResponse类的实例。
代表响应对象,主要用于向客户端发送数据。
3.out对象
out对象是javax.servlet.jsp.jspWriter类的实例。
主要用于向客户端浏览器输出数据。
4.session对象
session对象是javax.servlet.http.HttpSession类的实例。
主要用于来保持在服务器与一个客户端之间需要保留的数据,比如在会话期间保持用户的登录信息等,会话状态维持是Web应用开发者必须面对的问题。
当客户端关闭网站的所有网页或关闭浏览器时,session对象中保存的数据会自动清除。
由于Http协议是一个无状态协议,不保留会话间的数据,因此通过session对象扩展了http的功能。
比如用户登录一个网站之后,登录信息会暂时保存在session对象中,打开不同的页面时,登录信息是可以共享的,一旦用户关闭浏览器或退出登录,就会清除session对象中保存的登录信息。
request、response、session是JSP中的三个重要对象,这三个对象提供了服务器端与客户端进行交互通信的控制,它们的控制如图3-1所示。
图3-1session、request、response对象通信控制
当客户端打开浏览器,在地址栏输入Web服务器上的JSP页面的地址后,就会显示页面的执行结果。
客户端的浏览从Web服务器上获得网页是通过http协议来实现的,整个过程是,客户端通过输入网页地址向服务器端发送一个请求,服务器在受到来自客户端的请求后要响应请求。
JSP通过request对象控制客户端发送的请求,通过response对象对客户端请求进行响应。
而session就维持这个反反复复的过程中的会话期间需要的数据信息。
请求方法有多种,有POST、GET、PUT、HEAD、DELTE、TRACE等,最常用的是前两种。
request对象和response对象还可以操作http头中的数据。
5.application对象
application对象是javax.servlet.ServletContext类的实例。
主要用于保存用户信息,代码片段的运行环境;它是一个共享的内置对象,即一个容器中的多个用户共享一个application对象,故其保存的信息被所有用户所共享。
6.pageContext对象
pageContext对象是javax.servlet.jsp.PageContext类的实例。
用来管理网页属性,为JSP页面包装页面的上下文,管理对属于JSP中特殊可见部分中已命名对象的访问,它的创建和初始化都是由JSP容器来完成的。
7.config对象
config对象是javax.servlet.ServletConfig类的实例。
是代码片段配置对象,表示Servlet的配置。
8.page(相当于this)对象
page对象是javax.servlet.jsp.HttpJspPage类的实例。
用来处理JSP网页,它指的是JSP页面对象本身,或者说代表编译后的servlet对象,只有在JSP页面范围之内才是合法的。
9.exception对象
exception对象是java.lang.Throwable类的实例。
处理JSP文件执行时发生的错误和异常只有在JSP页面的page指令中指定isErrorPage="true"后,才可以在本页面使用exception对象。
需要说明的是,pageContext中的属性默认在当前页面是共享的;session中的属性是在当前session中是共享的;application对象对象中的属是则是对所有页面都是共享的。
3.1.2JSP内置对象的特点
JSP的内置对象主要有以下特点:
•由JSP规范提供,不用编写者实例化;
•通过Web容器实现和管理;
•所有JSP页面均可使用;
•只有在脚本元素的表达式或代码段中才可使用(<%=使用内置对象%>或<%使用内置对象%>)。
3.1.3JSP内置对象的分类
按照内置对象的功能来划分,可以分为以下四类:
•输出输入对象:
request对象、response对象、out对象;
•通信控制对象:
pageContext对象、session对象、application对象;
•Servlet对象:
page对象、config对象;
•错误处理对象:
exception对象。
3.1.4JSP对象的作用域
所谓“作用域”就是“信息共享的范围”,也就是说一个信息能够在多大的范围内有效。
4个JSP内置对象的作用域分别为:
application、session、request、page。
JSP内置对象作用域表如下:
表3-1JSP对象的4中作用域
名称
作用域
application
在所有应用程序中有效
session
在当前会话中有效
request
在当前请求中有效
page
在当前页面有效
Web交互的最基本单位为HTTP请求。
每个用户从进入网站到离开网站这段过程称为一个HTTP会话,一个服务器的运行过程中会有多个用户访问,就是多个HTTP会话。
作用域详细解释如下。
1.application作用域
application作用域就是服务器启动到关闭的整段时间,在这个作用域内设置的信息可以被所有应用程序使用。
application作用域上的信息传递是通过ServletContext实现的,它提供的主要方法如下所示:
ObjectgetAttribute(Stringname)//从application中获取信息;
voidsetAttribute(Stringname,Objectvalue)//向application作用域中设置信息。
2.session作用域
session作用域比较容易理解,同一浏览器对服务器进行多次访问,在这多次访问之间传递信息,就是session作用域的体现。
session是通过HttpSession接口实现的,它提供的主要方法如下所示。
ObjectHttpSession.getAttribute(Stringname)//从session中获取信息。
voidHttpSession.setAttribute(Stringname,Objectvalue)//向session中保存信息。
HttpSessionHttpServletRequest.getSessio()//获取当前请求所在的session的对象。
session的开始时刻比较容易判断,它从浏览器发出第一个HTTP请求即可认为会话开始。
但结束时刻就不好判断了,因为浏览器关闭时并不会通知服务器,所以只能通过如下这种方法判断:
如果一定的时间内客户端没有反应,则认为会话结束。
Tomcat的默认值为120分钟,但这个值也可以通过HttpSession的setMaxInactiveInterval()方法来设置:
voidsetMaxInactiveInterval(intinterval)
如果想主动让会话结束,例如用户单击“注销”按钮的时候,可以使用HttpSession的invalidate()方法,用于强制结束当前session:
voidinvalidate()
3.request作用域
一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了。
Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的。
voidsetAttribute(Stringname,Objectvalue)//将对象value以name为名称保存到request作用域中。
ObjectgetAttribute(Stringname)//从request作用域中取得指定名字的信息。
JSP中的doGet()、doPost()方法的第一个参数就是HttpServletRequest对象,使用这个对象的setAttribute()方法即可传递信息。
那么在设置好信息之后,要通过何种方式将信息传给其他的Servlet呢?
这就要用到RequestDispatcher接口的forward()方法,通过它将请求转发给其他Servlet。
RequestDispatcherServletContext.getRequestDispatcher(Stringpath)
//取得Dispatcher以便转发,path为转发的目的Servlet。
voidRequestDispatcher.forward(ServletRequestrequest,ServletResponseresponse)
//将request和response转发
因此,只需要在当前Servlet中先通过setAttribute()方法设置相应的属性,然后使用forward()方法进行跳转,最后在跳转到的Servlet中通过使用getAttribute()方法即可实现信息传递。
PHP的程序员可能不太好理解这一段,因为PHP中没有转发的概念,一个请求只能由一个PHP文件来处理,所以PHP中根本没有request作用域的概念。
而Servlet则不同,请求可以在应用程序中任意转发,所以用request作用域在不同Servlet之间传递信息。
需要注意两点:
(1)转发不是重定向,转发是在Web应用内部进行的。
PHP支持重定向但没有转发。
(2)转发对浏览器是透明的,也就是说,无论在服务器上如何转发,浏览器地址栏中显示的仍然是最初那个Servlet的地址。
4.page作用域
page对象的作用范围仅限于用户请求的当前页面,对于page对象的引用将在响应返回给客户端之后被释放,或者在请求被转发到其他地方后被释放。
对page对象的引用通常存储在pageContext对象中。
以上介绍的作用范围越来越小,request和page的生命周期都是短暂的,它们之间的区别:
一个request可以包含多个page页(include,forward及filter)。
3.2Request对象
request对象是javax.servlet.http.HttpServletRequest类的实例。
request对象包含所有请求的信息,如请求的来源、标头、cookies和请求相关的参数值等。
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。
该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息,即使用该对象可以获取用户提交的信息。
它是HttpServletRequest类的实例。
HTTP通信协议是客户与服务器之间一种提交(请求)信息与响应信息(request/respone)的通信协议。
在JSP中,内置对象request封装了用户提交的信息,那么该对象调用相应的方法可以获取封装的信息,即使用该对象可以获取用户提交的信息。
客户通常使用HTML表单向服务器的某个JSP页面提交信息,表单的一般格式是:
…//提交数据封装
其中
该表单使用post方法向页面tom.jsp提交信息,提交信息的过程是:
在文本框输入信息,其中默认信息是“史湘云”;然后点击“提交”按钮向服务器的JSP页面detail.jsp提交信息。
request对象可以使用getParameter(Strings)方法获取该表单通过text提交的信息,比如:
request.getParameter(“studentname”);
3.2.1request对象的常用方法
request的方法主要用来处理客户端浏览器提交的请求中的各项参数和选项。
主要方法如下:
1.ObjectgetAttribute(Stringname)
这个方法用来返回指定的属性值,该属性不存在时返回null。
参数name是指定的属性的名称。
2.EnumerationgetAttributeNames()
这个方法返回request对象的所有属性名称的集合,返回值是一个枚举类型的对象。
3.StringgetAuthType();
返回用来保护servlet的认证方法的名称,返回值是一个字符型对象,未受保护时返回null,调用的语法格式如下:
4.StringgetCharacterEncoding();
返回请求中的字符编码方法,可以在response对象中设置。
5.intgetContentLength();
返回请求的BODY的长度,不能确定长度时返回-1。
可以在response中设置。
6.StringgetContentType();
返回在response中定义的内容类型。
7.StringgetContentPath();
返回请求的路径。
8.Cookie[]getCookies();
返回客户端所有的Cookie的数组。
9.EnumerationgetHeaderNames();
返回所有HTTP头的名称的集合。
10.EnumerationgetHeaders(Stringname);
返回指定HTTP头的所有值的集合,调用的语法格式如下:
11.StringgetHeader(Stringname);
返回指定名称的HTTP头的信息,调用的语法格式如下:
12.longgetDateHeader(Stringname);
返回指定名称的Data类型的HTTP头的信息,调用的语法格式如下:
13.intgetIntHeader(Stringname);
返回指定名称的Int类型的HTTP头的信息,调用的语法格式如下:
14.ServletInputStreamgetInputStream();
返回请求的输入流,调用的语法格式如下:
15.LocalegetLocale();
返回当前页的Locale对象,可以在response中设定,调用的语法格式如下:
16.EnumerationgetLocales();
返回请求中所有的Locale对象的集合,调用的语法格式如下:
17.StringgetLocalName();
获取响应请求的服务器端主机名,调用的语法格式如下:
18.StringgetLocalAddr();
获取响应请求的服务器端地址。
19.intgetLocalPort();
获取响应请求的服务器端端口
20.StringgetMethod();
获取客户端向服务器端发送请求的方法(GET、POST)。
21.StringgetParameter(Stringname);
获取客户端发送给服务器端的参数值。
22.MapgetParameterMap();
该方法返回包含请求中所有参数的一个Map对象。
23.EnumerationgetParameterNames();
返回请求中所有参数的集合。
24.String[]getParameterValues(Stringname);
获得请求中指定参数的所有值。
25.StringgetQueryString();
返回get方法传递的参数字符串,该方法不分解出单独的参数。
26.StringgetPathInfo();
取出请求中处于ServletPath和QueryString之间的额外信息。
27.StringgetPathTranslated();
返回用getPathInfo()方法取得的路径信息的实际路径。
28.StringgetProtocol();
返回请求使用的协议。
可以是HTTP1.1或者HTTP1.0。
29.BufferedReadergetReader();
返回请求的输入流对应的Reader对象,该方法和getInputStream()方法在一个页面中只能调用一个。
30.StringgetRemoteAddr();
获取发出请求的客户端IP地址。
31.StringgetRemoteHost();
获取发出请求的客户端主机名
32.StringgetRemoteUser();
返回经过客户端验证的用户名,未经验证返回null。
33.intgetRemotePort();
返回发出请求的客户端主机端口。
34.StringgetRealPath(Stringpath);
返回给定虚拟路径的物理路径。
35.RequestDispatchergetRequestDispatcher(Stringpath);
按给定的路径生成资源转向处理适配器对象。
36.StringgetRequestedSessionId();
返回请求的session的标识。
37.StringRequestURI();
返回发出请求的客户端地址,但是不包括请求的参数字符串。
38.StringBuffergetRequestURI();
返回响应请求的服务器端地址
39.StringgetScheme();
获取协议名称,缺省值为HTTP协议。
40.StringgetServerName();
返回响应请求的服务器名称。
41.StringgetServletPath();
获取客户端所请求的脚本文件的文件路径。
42.intgetServerPort();
获取响应请求的服务器端主机端口号。
43.voidremoveAttribute(Stringname);
在属性列表中删除指定名称的属性。
44.voidsetAttribute(Stringname,Objectvalue);
在属性列表中添加/删除指定的属性。
45.voidsetCharacterEncoding(Stringname);
设置请求的字符编码格式。
46.HttpSessiongetSession();
HttpSessiongetSession(booleancreate);
获取session,如果create为true,在无session的情况下创建一个。
47.booleanisRequestedSessionIdFromCookie();
检查请求的会话ID是否为通过Cookie传入。
48.booleanisRequestedSessionIdFromURL();
检查请求的会话ID是否为通过URL传入。
49.booleanisRequestedSessionIdValid();
检查请求的会话ID是否仍然有效。
例3-1request对象常用方法的应用。
request_example1.jsp
<%@page<%request.setCharacterEncoding("gb2312");%>
contentType="text/html;charset=gb2312"%>
request对象示例1
请求方式:
<%=request.getMethod()%>
请求的资源:
<%=request.getRequestURI()%>
请求用的协议:
<%=request.getProtocol()%>
请求的文件名:
<%=request.getServletPath()%>
请求的服务器的IP:
<%=request.getServerName()%>
请求服务器的端口:
<%=request.getServerPort()%>
客户端IP地址:
<%=request.getRemoteAddr()%>
客户端主机名:
<%=request.getRemoteHost()%>
表单提交来的值:
<%=request.getParameter("xingming")%>