Chinaunix首页 | 论坛 | 博客
  • 博客访问: 338806
  • 博文数量: 329
  • 博客积分: 2633
  • 博客等级: 少校
  • 技术积分: 3633
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-22 15:43
文章分类

全部博文(329)

文章存档

2013年(244)

2012年(46)

2011年(39)

我的朋友

分类: 系统运维

2012-03-06 16:07:20

3JSP隐含对象

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.BufferedWriterjava.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对象可以操作客户端请求参数、属性和客户端输入流等数据。参数一般是GETHTTP POST提交过来的,属性主要是服务器产生的数据。

3.3.1request读取客户端传递来的参数

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程序BArequestresponse隐含对象被自动转发给B.

Request转发器(RequestDispatcher)的作用是活的目标资源的转发器,通过转发器将当前servlet程序的resquestresponse对象转发给目标资源,并跳转至目标资源上运行程序。这样目标资源就可以用request对象获得上一资源给它的属性。

public requestDispatcher getRequestDispatcher(java.lang.String path)获得目标资源的RequestDispatcher对象。

RequestDispatcher的主要方法有:

forward()方法.把当前Servletresquestresponse对象转发给目标资源,并跳转至目标资源运行代码,且forward()response对象提交前调用,不能再提交前刷新输出缓冲区。

include()方法.用于包含目标资源,如果目标资源是jsp页面,它会被编译成servlet程序后再运行,包含操作前运行刷新输出缓冲区。

removeAttribute().作用是从request作用范围中删除指定名字的属性。

setCharacterEncoding().用来定义request对象中的参数的字符编码标准。

3.3.3request读取系统信息

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.4request读取HTTP请求报头信息

客户端浏览器向服务器求情资源的过程一般有三步:1).发出请求2).HTTP报头信息交换.3).信息传输(传输方向由报头决定)。

Jsp中读取HTTP报头信息可以使用getHeader()getHeaderNames

3.3.5request读取cookie

Javax.servlet.http.Cookie用来生成一个cookie对象。用Cookie c[]=request.getCookies()来获取Cookie对象。再用c.getName()c.getValue()来拿到值。

3.3.6request选择国际化信息

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.3response实现JSP页面重定向

重定向使得目标资源的URL从服务器传到客户端浏览器,再从客户端通过HTTP请求传回服务器,其中有一定的网络延迟。

Jsp页面转换中有转发跳转(forward)和重定向跳转(redirect;resquestDispather.forward()实现转发跳转,response.sendRedirect()实现的是重定向跳转。

重定向通过客户端重新发送URL来实现,会导致浏览器地址更新,转发跳转在服务器切换程序,在浏览器不变。

转发能够把当前jsp页面中的resquestresponse对象转发给目标资源,而重定向会导致jsprequestresponse对象生命期结束。如果要重定向跳转要拿数据,只有在url中写入参数。

3.4.4response实现文件下载

1).二进制文件的下载用FileInputStreamgetOutputStream()来是实现。

2).文本文件的下载用FileReaderBufferedReader来实现。

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.1application访问Web应用的初始参数

3.5.2application作用范围变量

Application作用范围 变量能够在web应用中的所有程序共享。

getAttributeNames()getAttribute(),setAttribute(),removeAttribute()等方法。

3.5.3application对象读取Servlet容器信息

getMajorVersion()读取Servlet主版本号。

getMinorVersion()读取子版本号。

getServerInfo()返回Servlet容器的名字与版本号。

3.5.4application记录操作日志

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.1URL重写实现session跟踪

URL重写就是把session数据编码成”name=value”对,当做URL的查询串附在URL后面。

3.6.2cookie实现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号,并用cookieID传回客户端存储,通过查询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()
:打印完整的错误信息到标准输出,或者打印到指定的PrintStreamPrintWriter

3.7.3page隐含对象

page对象代表JSP本身,更准确地说它代表JSP被转译后的Servlet程序,它可以调用Servlet类所定义的方法。

3.7.4pageContext隐含对象

javax.servlet.jsp.PageContext类的实例对象

 

阅读(968) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~