分类: 系统运维
2012-03-06 16:07:20
3.1JSP的隐含对象
隐含对象 |
类 型 |
作用域 |
描述 |
request |
javax.servlet.http.HttpServletRequest |
request |
表示的是调用JSP页面的请求 |
response |
javax.servlet.http.HttpServletResponse |
page |
表示的是返回给客户的响应 |
pageContext |
javax.servlet.jsp.PageContext |
page |
存储指定页面的属性 |
session |
javax.servlet.http.HttpSession |
session |
表示的是客户端正参与的HTTP会话 |
application |
javax.servlet.ServletContext |
application |
表示的是JSP页面所驻留的Web应用程序 |
out |
javax.servlet.jsp.JspWriter |
page |
一个缓冲的输出流,用来给客户返回信息 |
config |
javax.servlet.ServletConfig |
page |
包含与页面servlet有关的配置信息 |
page |
java.lang.Object |
page |
表示页面servlet的一个实例 |
exception |
java.lang.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 java.lang.String getParameter(java.lang.String name)来获得resquest对象中的参数。
用public java.util.Enumeration getParameterNames()来获得resquest对象中的参数变量名
用public java.lang.String[] getParameterValues(java.lang.String name) 来获得resquest对象中的多值参数。
3.3.2request作用范围变量
1).服务器端的两个jsp/servlet程序间要交换数据时,可以通过request属性来实现。
用public void setAttribute (java.lang.String name,java.lang.Object o)用于把一个属性对象按指定的名字写入request作用范围。
public java.lang.Object getAttribute (java.lang.String name)从request作用范围独处指定名字的属性对象。
2).两个servlet程序间要利用request作用范围变量来传递数据时,要用转发跳转操作实现从第一个servlet程序A跳转到第二个servlet程序B,A的request和response隐含对象被自动转发给B.
Request转发器(RequestDispatcher)的作用是活的目标资源的转发器,通过转发器将当前servlet程序的resquest和response对象转发给目标资源,并跳转至目标资源上运行程序。这样目标资源就可以用request对象获得上一资源给它的属性。
用public requestDispatcher getRequestDispatcher(java.lang.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之后,会对应至java.lang.Throwable型态的对象,也就是异常处理相关对象。exception隐含对象并不总是可用的,它只在错误页面中可用。exception隐含对象提供了检索错误或异常信息的方法:
getMessage():返回描述错误信息的一个字符串
toString():返回包含了错误或异常类的名字以及错误信息的一个字符串
printStackTrace():打印完整的错误信息到标准输出,或者打印到指定的PrintStream和PrintWriter流
3.7.3page隐含对象
page对象代表JSP本身,更准确地说它代表JSP被转译后的Servlet程序,它可以调用Servlet类所定义的方法。
3.7.4pageContext隐含对象
javax.servlet.jsp.PageContext类的实例对象