第3章JSP隐含对象
3.1JSP的隐含对象
隐含对象类型作用域描述
request javax.servlet.http.HttpServletReq
uest request表示的是调用JSP页
面的请求
response javax.servlet.http.HttpServletRes
ponse page表示的是返回给客户
的响应
pageConte
xt
javax.servlet.jsp.PageContext page存储指定页面的属性
session javax.servlet.http.HttpSession session表示的是客户端正参
与的HTTP会话
applicatio n javax.servlet.ServletContext applicati
on
表示的是JSP页面所
驻留的Web应用程序
out javax.servlet.jsp.JspWriter page一个缓冲的输出流,
用来给客户返回信息config javax.servlet.ServletConfig page包含与页面servlet
有关的配置信息
page https://www.doczj.com/doc/d42744073.html,ng.Object page表示页面servlet的一
个实例
exception https://www.doczj.com/doc/d42744073.html,ng.Throwable page表示未捕获到的异常
与错误
Jsp的隐含对象是在jsp页面servlet实现类的_jspService()方法内部定义,故jsp 页面可在<%= %>中直接使用它们。
3.2out隐含对象
out隐含对象属于javax.servlet.jsp.JspWriter类型,供jsp页面输出信息。功能类似于jaca.io.BufferedWriter和java.io.PrintWriter。不同的是JspWriter的打印方法可以抛出java.io.IOException异常,而JspWriter不抛出。JspWriter的实现子类由tomcat容器实现。
服务器能够为每一个jsp页面设置一个输出缓冲区。如果jsp页面不使用输出缓冲区,则页面输出信息时,Servlet容器会调用response.getWriter()生成一个PrintWriter对象,将缓冲区中的信息输出。使用输出缓冲区可以减少网络连接的次数。在默认情况下,jsp页面使用输出缓冲区。
3.2.1输出信息的方法
方法主要有print()、println()和newLine()。newLine()相当于回车。
3.2.2缓冲区相关的方法
输出缓冲区的相关方法有
1).flush():用于刷新流,如果缓冲区满了,这个方法自动调用,输出缓冲区中的信息。如果流已经关闭,调用print()或flush()会引发一个IOException异常。2).clear():表示清除缓冲区中的信息。如果缓冲区空清除,会引发一个IOException 异常。
3).clearBuffer():功能与clear()相似,区别是不抛出异常。
4).getBufferSize():返回缓冲区大小。
5).getRemaining():返回缓冲区剩余的空闲空间。
6).isAutoFlush():返回一个真假值,用于标示缓冲区是否自动刷新。
3.3request隐含对象
客户端通过http请求提交的信息会被Servlet容器封装在request隐含对象中。Jsp 页面通过request对象可以操作客户端请求参数、属性和客户端输入流等数据。参数一般是GET或HTTP POST提交过来的,属性主要是服务器产生的数据。3.3.1用request读取客户端传递来的参数
用public https://www.doczj.com/doc/d42744073.html,ng.String getParameter(https://www.doczj.com/doc/d42744073.html,ng.String name)来获得resquest对象中的参数。
用public java.util.Enumeration getParameterNames()来获得resquest对象中的参数变量名
用public https://www.doczj.com/doc/d42744073.html,ng.String[] getParameterValues(https://www.doczj.com/doc/d42744073.html,ng.String name) 来获得resquest对象中的多值参数。
3.3.2request作用范围变量
1).服务器端的两个jsp/servlet程序间要交换数据时,可以通过request属性来实现。用public void setAttribute (https://www.doczj.com/doc/d42744073.html,ng.String name,https://www.doczj.com/doc/d42744073.html,ng.Object o)用于把一个属性对象按指定的名字写入request作用范围。
public https://www.doczj.com/doc/d42744073.html,ng.Object getAttribute (https://www.doczj.com/doc/d42744073.html,ng.String name)从request作用范围独处指定名字的属性对象。
2).两个servlet程序间要利用request作用范围变量来传递数据时,要用转发跳转操作实现从第一个servlet程序A跳转到第二个servlet程序B,A的request和response隐含对象被自动转发给B.
Request转发器(RequestDispatcher)的作用是活的目标资源的转发器,通过转发器将当前servlet程序的resquest和response对象转发给目标资源,并跳转至目标资源上运行程序。这样目标资源就可以用request对象获得上一资源给它的属性。用public requestDispatcher getRequestDispatcher(https://www.doczj.com/doc/d42744073.html,ng.String path)获得目标资源的RequestDispatcher对象。
RequestDispatcher的主要方法有:
forward()方法.把当前Servlet的resquest和response对象转发给目标资源,并跳转至目标资源运行代码,且forward()在response对象提交前调用,不能再提交前刷新输出缓冲区。
include()方法.用于包含目标资源,如果目标资源是jsp页面,它会被编译成servlet程序后再运行,包含操作前运行刷新输出缓冲区。
removeAttribute().作用是从request作用范围中删除指定名字的属性。
setCharacterEncoding().用来定义request对象中的参数的字符编码标准。
3.3.3用request读取系统信息
用request.XXX实现
1).getProtocol()获得request请求使用的协议及版本号
2).getRemoveAddr()返回客户端或最后一个客户端代理服务器的IP地址。
3).getRemoteHost()返回客户端主机名或最后一个客户端代理服务器的主机名
4).getScheme()返回当前request对象的构造方案。
5).getQueryString()返回URL的查询字串。
6).getRequestURL()返回URL请求中目标资源的URL。
7).getMethod()返回request请求的其他较方式,如GET或者POST
8).getServletPath()返回调用Servlet程序的URL请求
8).getRealPath()返回虚拟路径在服务器上的真实绝对路径。
3.3.4用request读取HTTP请求报头信息
客户端浏览器向服务器求情资源的过程一般有三步:1).发出请求2).HTTP报头信息交换.3).信息传输(传输方向由报头决定)。
Jsp中读取HTTP报头信息可以使用getHeader()和getHeaderNames
3.3.5用request读取cookie
Javax.servlet.http.Cookie用来生成一个cookie对象。用Cookie c[]=request.getCookies()来获取Cookie对象。再用c.getName()和c.getValue()来拿到值。
3.3.6用request选择国际化信息
Request对象可以读取客户端浏览器的语言类型,并据此选择合适的语言信息给客户阅读,这个工作就叫做信息国际化request.getLocal返回客户端的语言信息。
3.4response隐含对象
Response对象将Servlet程序的输出信息发送给客户端。Response对象是javax.servlet.http.HttpServletResponse接口类型的,HttpServletResponse继承了javax.servlet.ServletResponse接口,增加了对HTTP响应报头和cookie的操作。Response对象由Servlet容器创建,并传递给jsp页面servlet实现类的_jspService()方法。
3.4.1输出缓冲区与响应提交
Response对象和输出缓冲区相关的方法:
1).flushBuffer:刷新输出缓冲区,把信息传回客户端
2).setBufferSize:定义输出缓冲区的大小
3).isCommitted:返回缓冲区中的响应信息是否已经提交
4).getWriter():返回一个PrintWriter对象,Servlet程序通过此对象向客户端输出字符信息
3.4.2HTTP响应报头设置
Jsp服务器默认下响应信息以字符形式传送。如果要用http响应报头传输二进制数据,应该通过response.getOutputStream()获得一个ServletOutputStream输出流对象输出二进制信息。
用setContenttype()返回客户端的信息类型及编码标准。
用setCharacterEncoding返回客户端信息的编码标准。
用sendError()向客户端返回HTTP响应码。
用setHeader()设置HTTP报头
3.4.3用response实现JSP页面重定向
重定向使得目标资源的URL从服务器传到客户端浏览器,再从客户端通过HTTP 请求传回服务器,其中有一定的网络延迟。
Jsp页面转换中有转发跳转(forward)和重定向跳转(redirect);resquestDispather.forward()实现转发跳转,response.sendRedirect()实现的是重定向跳转。
重定向通过客户端重新发送URL来实现,会导致浏览器地址更新,转发跳转在服务器切换程序,在浏览器不变。
转发能够把当前jsp页面中的resquest、response对象转发给目标资源,而重定向会导致jsp的request和response对象生命期结束。如果要重定向跳转要拿数据,只有在url中写入参数。
3.4.4用response实现文件下载
1).二进制文件的下载用FileInputStream和getOutputStream()来是实现。
2).文本文件的下载用FileReader和BufferedReader来实现。
3).把服务器上的excel下载下来的实例函数:
public static void exportToWeb(HttpServletRequest request, HttpServletResponse response,String templateFileName) {
try{
if(templateFileName.indexOf(".")<0){
templateFileName=templateFileName+".xls";
}
String url = request.getSession().getServletContext()
.getRealPath("/")+ "filesTemp/"+templateFileName;
String contentType = "application/octet-stream";
response.setContentType(contentType);
response.setHeader("Content-disposition",
"attachment;filename=\""+templateFileName+""+ "\""); InputStream is = null;
OutputStream os = null;
try{
is = new BufferedInputStream(new FileInputStream(url));
java.io.ByteArrayOutputStream baos = new
java.io.ByteArrayOutputStream();
os = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[10 * 1024 * 1024];
int read = 0;
while((read = is.read(buffer)) != -1) {
baos.write(buffer, 0, read);
}
os.write(baos.toByteArray());
} catch(Exception ex) {
ex.printStackTrace();
} finally{
try{
os.close();
is.close();
} catch(IOException ex1) {
}
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
3.5application隐含对象
Tomcat是一个jsp服务器,一个jsp服务器可以挂多个web应用。每一个web应
用有自己的上下文。同一个上下文中的两个servlet程序共享数据的方法是利用application对象。共享数据存放在servlet容器中,通过application对象进行存储操作。
Application对象是javax.servlet.ServletContext接口定义了一系列方法,供Servlet 程序和Servlet容器通信。
3.5.1用application访问Web应用的初始参数
3.5.2application作用范围变量
Application作用范围变量能够在web应用中的所有程序共享。
有getAttributeNames(),getAttribute(),setAttribute(),removeAttribute()等方法。3.5.3用application对象读取Servlet容器信息
getMajorVersion()读取Servlet主版本号。
getMinorVersion()读取子版本号。
getServerInfo()返回Servlet容器的名字与版本号。
3.5.4用application记录操作日志
用application.log(“xxx”)来记录日志。
3.5.5application的其他应用
用getRequestDispatcher()取得目标资源的RequestDispatcher对象
用getMimeType()返回指定文件的MIME-type
用getRealPath()获得虚拟目录对应的真实绝对路径。
用getResourcesAsStream()取得目标资源的输入流对象。
3.6session隐含对象
Session是指一个终端用户与后台某交互式系统尽心通信的时间间隔,通常把从登陆进入系统到注销退出系统之间所经历的时间为一个session通信周期。在web应用中,session终端用户一般表现为一个浏览器窗口,如果打开多个浏览器窗口就是多个session客户端。如果用户在同一个窗口访问不同的地方也会产生多个session通信。
由于http协议是无状态的,无法直接保存session数据,在jsp中要实现seesion 跟踪,主要有四种技术:URL重写,cookie,隐藏表单域和session对象。
3.6.1用URL重写实现session跟踪
URL重写就是把session数据编码成”name=value”对,当做URL的查询串附在URL后面。
3.6.2用cookie实现session跟踪
基本原理就是将一个session数据封装在一个cookie对象中,cookie对象传回客户端存储。
在一个页面中申请cookie对象,使用response.addCooike()加入cookie对象,然后在另一个页面通过request.getCookies()获得cookie对象。
3.6.3用隐藏表单域实现session跟踪
隐藏表单域在页面上不可以看见,相当于一个变量,如果把一个session数据存储在其中,则提交表单时,隐藏表单域中的数据也会被提交给服务器。
比如这就是一个隐藏的表单域。在form提交之后就可以在action的对应页面中进行获取,用request.getParameter()。
3.6.4session作用范围变量与session跟踪
Session隐含对象是实现session跟踪的最之直接的方法。
为了能够唯一标识客户端,服务器随机生成一个sessionID号,并用cookie把ID 传回客户端存储,通过查询sessionID号,就知道接收到的某个请求来自哪个客户端,在tomcat中,这个ID号的cookie名是”JSESSIONID”。HttpSession常用方法:
isNew()判断session对象是新创建的还是已经存在的。
getId()返回当前session对象的ID号。
getLastAccessedTime()返回客户端最后一次请求的发送时间,是一个long型的整数。
invalidate()使得当前session无效。
setMaxInactiveInterval()读取当前session超时时间
setAttribute()定义session作用范围变量。
getAttribute()读取一个session作用范围变量。
getAttributeNames()将当前合法的所有session作用范围变量读到一个枚举的对象中。
3.6.5动态生成验证码
服务器动态生成验证码并存储在session作用范围,最后一图像形式返回给客户端显示。例如:
<%@page contentType="image/jpeg"import="java.awt.*,
java.awt.image.*,java.util.*,javax.imageio.*"pageEncoding="gb2312"%> <%!Color getRandColor(int fc,int bc){//给定范围获得随机颜色
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}%>
<%//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
// 在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
//生成随机类
Random random = new Random();
// 设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);
//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for(int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
// 取随机产生的认证码(4位数字)
String sRand="";
for(int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
// 将认证码显示到图象中
g.setColor(new
Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt (110)));
//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16);
}
// 将认证码存入SESSION
session.setAttribute("rand",sRand);
// 图象生效
g.dispose();
// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
out.clear();
out = pageContext.pushBody();%>
3.7其他JSP隐含对象
3.7.1config隐含对象
config隐含对象是javax.servlet.ServletConfig类型的,常常用于给一个Servlet程序传送初始化参数。config 对象里存放着一些Servlet 初始的数据结构。它共有下列四种方法:
public String getInitParameter
public java.util.Enumeration getInitParameterNames
public ServletContext getServletContext
public Sring getServletName
3.7.2exception隐含对象
exception隐含对象包含了关于异常或错误的信息,这些异常或错误导致把控制传递给错误页面。exception隐含对象在转换为Servlet之后,会对应至https://www.doczj.com/doc/d42744073.html,ng.Throwable型态的对象,也就是异常处理相关对象。exception隐含对象并不总是可用的,它只在错误页面中可用。exception隐含对象提供了检索错误或异常信息的方法:
getMessage():返回描述错误信息的一个字符串
toString():返回包含了错误或异常类的名字以及错误信息的一个字符串
printStackTrace():打印完整的错误信息到标准输出,或者打印到指定的PrintStream和PrintWriter流
3.7.3page隐含对象
page对象代表JSP本身,更准确地说它代表JSP被转译后的Servlet程序,它可以调用Servlet类所定义的方法。
3.7.4pageContext隐含对象
javax.servlet.jsp.PageContext类的实例对象
1.{JSP/Servlet题目}假设web应用的文档根目录为MyApp,那么可以从哪里找到database.jar文件。(选择1项)D A)MyApp目录下 B)MyApp\images目录下 C)MyApp\WEB-INF目录下 D)MyApp\WEB-INF\lib目录下 2.{JSP/Servlet题目}哪一个对象可以用于获得浏览器发送的请求。(选择1项)A A)HttpServletRequest B)HttpServletResponse C)HttpServlet D)Http 3.{JSP/Servlet题目}事务处理的结束方式。(选择2项) BD A)中止 B)提交 C)完成 D)回滚 4.{JSP/Servlet题目}客户端状态管理的解决方案有。(选择3项)C A)URL重写 B)隐藏域 C)Cookie D)以上都不是 5.{JSP/Servlet题目}与HttpSessionListener接口有关的方法是。(选择2项)BD A)SessionInitialized() B)SessionCreated() C)SessionFinialized() D)SessionDestroyed() 6.{JSP/Servlet题目}关于JSP生命周期的叙述,下列哪些为真?(选择2项)AC A)JSP会先解释成Servlet源文件,然后编译成Servlet类文件 B)每当用户端运行JSP时,jspInit()方法都会运行一次 C)每当用户端运行JSP时,_jspService()方法都会运行一次 D)每当用户端运行JSP时,jspDestroy()方法都会运行一次 7.{JSP/Servlet题目}下列哪个为JSP的隐含对象。(选择1项)B A)env B)page C)jspinfo D)context 8.{JSP/Servlet题目}在J2EE中属于Web层的组件有。(选择1项)A
判断题 1.静态网页*。Html中也可以嵌入脚本代码,如JavaScript、vbscript程序段等,但这些程序段不可能在服务器端运行,只能在客户端浏览器中运行。正确 2.动态网页是在服务器端被执行,其中嵌入的代码只能在服务器端运行,不能在客户端浏览器中运行。错误 3.GGI是多进程方式的动态网页技术,而JSP是多线程方式,故GGI系统开销比JSP要小。错误 4.JSP是以Servlet程序方式运行的,而ASP是有ASP引擎解释执行的。正确 5JSP容器对JSP页面中的模板元素不做任何处理,直接用out。Write()输出正确 6<!——>用于对JSP页面的代码段做注释,说明程序员的意图或要实现的功能,注释信不返回客户端。错误 7<!——>中可以使用<% %>动态输出注释内容,同时<!——>中也可以使用<% %>,因为预览JSP页面时没有报错。错误 8 JSP含对象是Servlet容器自动生成并传送给JSP页面Servlet实现类的。正确 9JSP的隐含对象一般是在JSP页面Servlet实现类的-jspService()方法内使用,也可以在Servlet实现类的其他方法中使用。正确 10.用request读取单选框表单元素的值时,用request.getAttribute()方法。错误 11.用request转发给目标资源传递属性数据的优点是目标资源不需要用代码释放属性数据,目标资源输出缓冲区被刷新后request对象中的属性数据自动丢失。正确 12.编写Servlet程序时,一般是继承HttpServlet并建议把业方法内务逻辑代码写在service()方法内。错误 13一个HttpServlet程序被调用后,doXXX()方法执行结束表示此Servlet程序被销毁。错误 14.如果在Servlet的
华南农业大学期末考试试卷(A 卷) 2011学年第2学期 考试科目: 软件开发基础(Java ) 考试类型:(闭卷)考试 考试时间: 120 分钟 学号 姓名 年级专业 答题说明:所有答案必须写在答卷的指定位置,考试结束时只交答卷。 一、选择题(本大题共20小题,每小题1分,共20分) 说明:将选项答案按序号写在答卷上。 1. HTML 页面中,定义浏览器标题的