信产部考试题第一套题库Word文档下载推荐.docx
《信产部考试题第一套题库Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《信产部考试题第一套题库Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
request
javax.servlet.http.HttpServletRequest
response
javax.servlet.http.HttpServletResponse
pageContext
javax.servlet.jsp.PageContext
session
javax.servlet.http.HttpSession
application
javax.servlet.ServletContext
out
javax.servlet.jsp.JspWriter
config
javax.servlet.ServletConfig
page
java.lang.Object
exception
java.lang.Throwable
其中request,response,session,application和config对象所属的类及其用法在前面的Servlet章节中我们已经介绍过了,下面主要介绍一下其他的对象。
12.4.1pageContext
pageContext对象提供了访问其他隐含对象的方法,如下:
?
publicabstractjavax.servlet.ServletRequestgetRequest()
publicabstractjavax.servlet.ServletResponsegetResponse()
publicabstractjavax.servlet.http.HttpSessiongetSession()
publicabstractjavax.servlet.ServletContextgetServletContext()
publicabstractJspWritergetOut()
publicabstractjavax.servlet.ServletConfiggetServletConfig()
publicabstractjava.lang.ObjectgetPage()
publicabstractjava.lang.ExceptiongetException()
在pageContext对象中,可以使用下面两个方法来保存和获取属性。
publicabstractvoidsetAttribute(java.lang.Stringname,java.lang.Objectvalue)
publicabstractjava.lang.ObjectgetAttribute(java.lang.Stringname)
在pageContext对象中保存的属性,只能在当前页面中去获取,也就是说,pageContext对象具有页面范围(详见12.5节)。
利用pageContext对象,还可以设置和得到在其他范围对象中保存的属性。
pageContext对象提供了另外两个setAttribute()和getAttribute()方法,如下:
publicabstractvoidsetAttribute(java.lang.Stringname,java.lang.Objectvalue,intscope)
publicabstractjava.lang.ObjectgetAttribute(java.lang.Stringname,intscope)
其中的scope参数用于指定要获取哪一个范围对象的属性,有四个可能的取值,其中PageContext.PAGE_SCOPE表示页面范围,PageContext.REQUEST_SCOPE表示请求范围,PageContext.SESSION_SCOPE表示会话范围,PageContext.APPLICATION_SCOPE表示Web应用程序范围。
在pageContext对象中,可以使用下面两个方法来删除范围中的属性。
publicabstractvoidremoveAttribute(java.lang.Stringname,intscope)
删除指定范围内名字为name的属性。
publicabstractvoidremoveAttribute(java.lang.Stringname)
删除所有范围内名字为name的属性。
pageContext对象还提供了搜索属性的方法:
publicabstractjava.lang.ObjectfindAttribute(java.lang.Stringname)
该方法会按照page,request,session和application范围的顺序搜索指定名字的属性,如果找到,则返回属性的值,如果没有找到,则返回null。
关于范围,请参见12.5节。
pageContext对象也提供了请求转发的两个方法forward()和include(),其内部实现是调用RequestDispatcher对象的forward()和include()方法。
从pageContext对象提供的方法可以看出,pageContext对象实际上是为我们提供了访问其他隐含对象的统一入口,在多数情况下,直接利用pageContext对象就可以完成想要实现的功能。
12.4.2out
out对象的类型是javax.servlet.jsp.JspWriter,该类从java.io.Writer类派生,以字符流的形式输出数据。
out对象实际上是PrintWriter对象的带缓冲的版本(在out对象内部使用PrintWriter对象来输出数据),可以通过page指令的buffer属性来调整缓冲区的大小,默认的缓冲区是8kb。
在out对象中,提供了几个和缓冲区操作相关的方法,如下所示。
publicabstractvoidclear()throwsjava.io.IOException
清除缓冲区中的内容。
如果缓冲区已经被刷新,clear()方法将抛出IOException异常。
publicabstractvoidclearBuffer()throwsjava.io.IOException
清除缓冲区中的当前内容。
这个方法和clear()方法的区别是,如果缓冲区已经被刷新,这个方法不会抛出IOException异常。
publicabstractvoidclose()throwsjava.io.IOException
刷新缓冲区,关闭输出流。
注意,我们在编写JSP页面时,不需要显式地去调用这个方法,因为在JSP容器所生成的代码中会自动包含对close()方法的调用。
publicabstractvoidflush()throwsjava.io.IOException
刷新缓冲区。
publicintgetBufferSize()
获得out对象使用的缓冲区的大小。
publicabstractintgetRemaining()
获得缓冲区中未使用的字节数。
publicbooleanisAutoFlush()
判断out对象是否是自动刷新。
out对象针对不同的数据类型,提供了多个重载的print()和println()方法,用于输出数据。
要注意的是,虽然println()方法会输出一个换行,但是客户端的浏览器在显示页面时会忽略输出的换行。
12.4.3page
page对象是当前页面转换后的Servlet类的实例。
从转换后的Servlet类的代码中,可以看到这种关系:
Objectpage=this;
在JSP页面中,很少使用page对象。
12.4.4exception
exception对象表示了JSP页面运行时产生的异常,该对象只有在错误页面(在page指令中指定属性isErrorPage=true的页面)中才可以使用。
在JSP页面中,我们可以利用page指令的errorPage属性指定一个错误处理页面,当JSP页面运行发生错误时,JSP容器会自动调用指定的错误处理页面。
要注意的是,如果一个JSP页面使用errorPage属性定义了错误页面,那么在web.xml文件中定义的任何错误页面将不会被使用。
下面我们看一个例子:
price.jsp
<
%@pageerrorPage="
excep.jsp"
%>
%
StringstrPrice=request.getParameter("
price"
);
doubleprice=Double.parseDouble(strPrice);
out.println("
Totalprice="
+price*3);
%>
excep.jsp
%@pageisErrorPage="
true"
exception.toString():
"
br>
out.println(exception.toString());
p>
exception.getMessage():
out.println(exception.getMessage());
在price.jsp页面中,通过page指令的errorPage属性指定错误处理页面为excep.jsp。
在excep.jsp页面中,通过page指令的isErrorPage属性指定当前页面是错误处理页面,只有设置了isErrorPage为true,在此页面中才可以使用exception对象。
我们访问price.jsp页面时,输入URL:
http:
//localhost:
8080/ch12/price.jsp?
price=5.0
将看到输出:
Totalprice=15.0
如果输入:
price=abc
将看到如下的错误信息:
java.lang.NumberFormatException:
Forinputstring:
"
abc"
Forinputstring:
在JSP页面中的对象,包括用户创建的对象(例如,JavaBean对象)和JSP的隐含对象,都有一个范围属性。
范围定义了在什么时间内,在哪一个JSP页面中可以访问这些对象。
例如,session对象在会话期间内,可以在多个页面中被访问。
application对象在整个Web应用程序的生命周期中都可以被访问。
在JSP中,有4种范围,如下所示。
page范围
具有page范围的对象被绑定到javax.servlet.jsp.PageContext对象中。
在这个范围内的对象,只能在创建对象的页面中访问。
可以调用pageContext这个隐含对象的getAttribute()方法来访问具有这种范围类型的对象(pageContext对象还提供了访问其他范围对象的getAttribute方法),pageContext对象本身也属于page范围。
当Servlet类的_jspService()方法执行完毕,属于page范围的对象的引用将被丢弃。
page范围内的对象,在客户端每次请求JSP页面时创建,在页面向客户端发送回响应或请求被转发(forward)到其他的资源后被删除。
request范围
具有request范围的对象被绑定到javax.servlet.ServletRequest对象中,可以调用request这个隐含对象的getAttribute()方法来访问具有这种范围类型的对象。
在调用forward()方法转向的页面或者调用include()方法包含的页面中,都可以访问这个范围内的对象。
要注意的是,因为请求对象对于每一个客户请求都是不同的,所以对于每一个新的请求,都要重新创建和删除这个范围内的对象。
session范围
具有session范围的对象被绑定到javax.servlet.http.HttpSession对象中,可以调用session这个隐含对象的getAttribute()方法来访问具有这种范围类型的对象。
JSP容器为每一次会话,创建一个HttpSession对象,在会话期间,可以访问session范围内的对象。
application范围
具有application范围的对象被绑定到javax.servlet.ServletContext中,可以调用application这个隐含对象的getAttribute()方法来访问具有这种范围类型的对象。
在Web应用程序运行期间,所有的页面都可以访问在这个范围内的对象。
下面我们通过几个简单的例子,来看一下这4种范围对象的应用。
1.测试page范围
test1.jsp
pageContext.setAttribute("
name"
"
zhangsan"
test1.jsp:
out.println(pageContext.getAttribute("
));
pageContext.include("
test2.jsp"
test2.jsp
test2.jsp:
访问test1.jsp,将看到如下的输出:
zhangsan
null
说明保存在pageContext对象中的属性具有page范围,只能在同一个页面中被访问。
2.测试request范围
修改test1.jsp和test2.jsp,如下所示。
request.setAttribute("
out.println(request.getAttribute("
zhangsan
说明保存在request对象中的属性具有request范围,在请求对象存活期间,可以访问这个范围内的对象。
将
这一句注释起来,先访问test1.jsp,再访问test2.jsp,可以看到如下输出:
这是因为客户端开始了一个新的请求。
3.测试session范围
session.setAttribute("
out.println(session.getAttribute("
先访问test1.jsp,然后在同一个浏览器窗口中访问test2.jsp,可以看到如下输出:
说明保存在session对象中的属性具有session范围,在会话期间,可以访问这个范围内的对象。
如果我们在访问完test1.jsp后,关闭浏览器,重新打开浏览器窗口,访问test2.jsp,将看到如下输出:
这是因为客户端与服务器开始了一次新的会话。
4.测试application范围
application.setAttribute("
out.println(application.getAttribute("
先访问test1.jsp,然后关闭浏览器,再打开浏览器窗口,访问test2.jsp,可以看到如下输出:
说明保存在application对象中的属性具有application范围,在Web应用程序运行期间,都可以访问这个范围内的对象。