第3章 隐含对象_第1页
第3章 隐含对象_第2页
第3章 隐含对象_第3页
第3章 隐含对象_第4页
第3章 隐含对象_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章

JSP隐含对象本章主要内容out隐含对象HTTP请求与request隐含对象HTTP响应与response隐含对象Cookies管理session隐含对象与session跟踪application隐含对象3.1JSP页面中的隐含对象在JSP页面中,经常要处理request请求、response响应等信息,为了简化程序设计,JSP规范定义了常用的隐含对象,这些隐含对象不需要在JSP页面中用new关键字来创建,而是由Servlet容器来创建与管理,并传递给JSP页面的Servlet实现类使用。3.1JSP隐含对象变量名主要功能out用于JSP页面输出信息request可获得用户端请求参数response发输出信息给客户端session终端用户与后台系统交互aplication同一应用不同程序间数据共享exceptionJSP页面产生的异常对象config用于传送和获取初始化参数page当前JSP页面所表示的对象pageContext获取其他的隐含对象及实现跳转3.1JSP隐含对象在JSP页面Servlet实现类的_jspService()方法内部,自动初始化JSP隐含对象的代码段如下:publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse)throwsjava.io.IOException,ServletException{//……HttpSessionsession=null;ServletContextapplication=null;ServletConfigconfig=null;JspWriterout=null;Objectpage=this;try{//……application=pageContext.getServletContext();config=pageContext.getServletConfig();session=pageContext.getSession();out=pageContext.getOut();}}3.2out隐含对象out对象属于javax.servlet.jsp.JspWriter类型3.2.1显示输出主要方法1、print()和println()print()和println()用于打印输出信息,前者输出的信息在返回客户端的源代码中不换行,后者输出的信息在返回客户端的源代码中换行。被打印的信息可以是基本数据类型(如int、double等),也可以是对象(如字符串等)。

3.2out隐含对象例如,在JSP页面中有以下代码:<body><% out.print("123"); out.print("456"); %></body>3.2out隐含对象2、newLine()newLine()表示输出一个回车换行符,例如:<body><% out.print("123"); out.newLine(); out.print("456"); %></body>3.2out隐含对象3.2.2缓冲区相关的方法

1、flush()方法Java中把I/O操作转化为流操作。out.write()输出的信息暂时存储在流对象缓冲区中,flush()刷新操作把缓冲区中的信息传递给目标对象处理。如果缓冲区满了,这个方法被自动调用,输出缓冲区中的信息。

3.2out隐含对象如果流已经关闭,调用print()或flush()会引发一个IOException异常,例如:在Tomcat命令行窗口中显示“警告:Internalerrorflushingthebufferinrelease()”的异常信息。

<%out.close();out.flush(); %>3.2out隐含对象2、clear()方法clear()表示清除缓冲区中的信息。如果缓冲区是空的,执行此方法会引发IOException异常。3、clearBuffer()clearBuffer()的功能与clear()相似,它将输出缓冲区清除后返回,与clear()不同的是它不抛出异常。3.2out隐含对象4、getBufferSize()getBufferSize()返回输出缓冲区的大小,单位字节,如果没有缓冲区,则返回0。5、getRemaining()getRemaining()返回缓冲区剩余的空闲空间,单位字节。3.2out隐含对象6、isAutoFlush()isAutoFlush()返回一个真假值,用于标示缓冲区是否自动刷新。例:<%out.print("缓冲区总容量="+out.getBufferSize()+"<br>");out.print(“缓冲区空闲容量="+out.getRemaining()+"<br>");out.print("缓冲区是否自动刷新="+out.isAutoFlush());%>3.3request隐含对象Request对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息。Request所依赖的接口javax.servlet.http.HttpServletRequest3.3.1用request读取客户端传递来的参数客户端传递给服务器的参数最常见的是表单数据或附在URL中的参数。例http://localhost/exam.jsp?useId=admin中的“useId=admin”为查询串参数。

3.3request隐含对象1、用request读取单值参数所谓单值参数是指:一个变量最多有一个值。用request对象的getParameter()方法读取这些参数。方法的定义为:方法的形参是参数的变量名,以String形式返回变量的值。如果request对象中没有指定的变量,则返回null。

例如下面操作varValue的值为admin。StringvarValue=request.getParameter(useId)

publicStringgetParameter(java.lang.Stringname)3.3request隐含对象参数变量名硬编码问题用request.getParameter()读取表单传来的参数时,必须要给出参数的变量名,参数变量名是以硬编码形式嵌在代码中的,即在程序中参数变量名是给定的,当表单提交数据中参数变量名发生变化时,需要改变程序。为了提高程序的灵活性,可以利用getParameterNames()方法,该能方法能够返回request对象中的参数变量名,从而实现程序中变量的灵活设置。3.3request隐含对象参数变量名硬编码问题<%@pageimport="java.util.*"%><%Enumeratione=request.getParameterNames();//将request对象中的变量名置于集合中

While(e.hasMoreElements()){StringvarName=(String)e.nextElement();StringvarValue=request.getParameter(varName);//获取集合中的变量值

out.print(varName+"="+varValue);out.print(“<br>”);}%>3.3request隐含对象【例3-1】制作一个用户登录应用,用户在表单中输入用户名和密码后提交给本JSP页面,读取并显示用户输入信息。3.3request隐含对象<body><%if(request.getParameter(“submit”!=null){Stringname=request.getParameter(“name”);Stringpw=request.getParameter(“pw”);if(name==null||name.length()==0)name=“用户名为空“

if(pw==null||pw.length()==0)pw=“口令为空“

}%>3.3request隐含对象<formaction=“UserLogin.jsp”method=“post”><table><tr><tdalign=“center”>用户登录界面</td></tr><tr><tdalign=“right“>用户名</td><td><inputtpye=“text”name=“name”/></td></tr><tr><tdalign=“right“>密码</td><td><inputtpye=“password”name=“pw”/></td></tr><tr><td></td><td><inputtpye=“submit”name=“submit”value=“登录”/></td></tr><tr><td>用户名参数为:<%=name%></td><td>密码参数为:<%=pw%></td></tr></table>/form></body>3.3request隐含对象乱码处理在显示从request对象读取的中文参数时可能会出现乱码。原因是Java在默认情况下采用的是Unicode编码标准,一般是UTF-8,而中文的编码标准通常是GB2312。解决乱码问题的方法是把UTF-8转换为GB2312简体中文编码即可。具体方法是写一个转换方法,显示字符串前,把字符串转换成简体中文后再显示。JSP程序如下,转换方法为StringtoChinese(Stringstr)。

【例3-2】解决从request对象读取参数时显示中文乱码问题。3.3request隐含对象<%!publicstaticStringtoChinese(Stringstr){//UTF-8转换为GB2312方法

try{bytes1[]=str.getBytes("ISO8859-1");returnnewString(s1,"gb2312");}catch(Exceptione){returnstr;}}%><body><%if(request.getParameter("submit"!=null){Stringname=request.getParameter("userName");Stringpw=request.getParameter("password");if(name==null||name.length()==0)name="用户名为空";elsename=toChinese(name));//把字符串转换成简体中文后再显示

if(pw==null||pw.length()==0)pw="口令为空";}%></body>3.3request隐含对象2、用request读取多值参数多值参数的典型代表是表单复选框,例如上一章会员注册例子中的“教育程度”同名表单就是多值参数,教育程度选项中的表单变量名均为“education”,用户可以选定多个教育程度。在服务器端读取多值参数,要用到如下方法:String[]request.getParameterValues(Stringname)形参为多值参数的变量名,多个参数值返回后存储在一个字符串数组中3.3request隐含对象<%@pageimport="java.util.*"%><%Enumeratione=request.getParameterNames();While(e.hasMoreElements()){StringvarName=(String)e.nextElement();if(!varName.equals("education")){StringvarValue=request.getParameter(varName);out.print(toChinese(varName)+”=”+toChinese(varValue));out.print(“<br>”)}else{StringvarValue[]=request.getParameterValues(varName);

out.print(varName+”=”);

for(intn=0;n<varValue.length;n++){out.print(””+toChinese(varValue[n]));}out.print(“<br>”)}%>3.3request隐含对象3.3.2request作用范围变量服务器端的两个JSP/Servlet程序间要交换数据时,可通过request作用范围变量来实现。request作用范围变量也叫request属性,是类似于“name=value”的属性对,由属性名和属性值构成,属性值一般是一个Java对象,不是Java基本数据类型数据。3.3request隐含对象Servlet程序A要把数据对象传递给Servlet程序B时,程序A通过调用request.setAttribute()把数据对象写入request作用范围,并通过request转发跳转到程序B,程序A的request对象被转发给程序B,在程序B中通过request.getAttribute()从request作用范围读取数据对象。3.3request隐含对象属性值对象本身的生命周期和request对象的生命周期直接相关,在当前request隐含对象有效的范围内,与之绑定的属性值对象也是有效的,当request对象生命期结束时,与之绑定的request属性变量会变成垃圾对象而被回收。3.3request隐含对象在JSP中,除了request作用范围变量外,还有page、session和application作用范围变量,它们的基本含义都是把属性值对象与某个有生命周期的JSP隐含对象相绑定,使属性值对象有一定的生命周期,或者说使属性值对象在一定的作用范围内有效。3.3request隐含对象

定义作用范围变量一般是调用相应JSP隐含对象中的setAttribute()方法,读取作用范围变量一般是调用getAttribute()方法voidsetAttribute(Stringname,Objecto)用于把一个属性对象按指定的名字写入request作用范围ObjectgetAttribute(Stringname)用于从request作用范围读出指定名字的属性对象<%Useru=newUser();request.setAttribute("loginName",u);

Users=(User)request.getAttribute("loginName");out.print(s);%>3.3request隐含对象2、getRequestDispatcher(Stringtarget)两个Servlet程序间要利用request作用范围变量来传递数据时,要用转发跳转操作实现从第一个Servlet程序A跳转到第二个Servlet程序B。3.3request隐含对象request转发器(RequestDispatcher)的作用是获得目标资源的转发器,通过转发器将当前Servlet程序的request和response对象转发给目标资源,并跳转至目标资源上运行程序,这样,目标资源就可通过request对象读取上一资源传递给它的request属性。3.3request隐含对象request.getRequestDispatcher()的作用是返回目标资源的RequestDispatcher对象,语法为:形参是当前Web应用目标资源的URI,可以使用相对路径或绝对路径。publicRequestDispatchergetRequestDispatcher(java.lang.Stringpath)3.3request隐含对象RequestDispatcher中主要的方法有:publicvoidforward(ServletRequestrequest,ServletResponseresponse)throwsServletException,java.io.IOException该方法能够把当前Servlet程序的request和response隐含对象转发给目标资源,并跳转至目标资源运行代码。形参是当前Servlet程序的request和response隐含对象。3.3request隐含对象publicvoidinclude(ServletRequestrequest,ServletResponseresponse)throwsServletException,java.io.IOException该方法用于包含目标资源。形参是当前JSP/Servlet程序的request、response对象。如果目标资源是JSP页面,它会被编译成Servlet程序后再运行。进行包含操作前,允许对当前JSP/Servlet程序的response输出缓冲区进行刷新。3.3request隐含对象【例3-3】利用request作用范围变量在两个JSP页面间传递数据。操作步骤如下:<body>//jsp程序A<%request.setAttribute("loginName","tom");RequestDispatchergo=request.getRequestDispatcher("exam.jsp");go.forward(request,response);%></body><body>//jsp程序B(exam.jsp)<%Strings=(String)request.getAttribute("loginName");out.print(s)%></body>3.3request隐含对象3、removeAttribute()此方法的作用是从request作用范围中删除指定名字的属性,它的语法为:形参是属性名。例如:publicvoidremoveAttribute(Stringname)request.removeAttribute(“name”);3.3request隐含对象3.3.3用request读取系统信息1、StringgetProtocol()返回request请求使用的协议及版本号2、StringgetRemoteAddr()返回客户端或最后一个客户端代理服务器的地址3.3request隐含对象3、StringgetRemoteHost()

返回客户端主机名或最后一个客户端代理服务器的主机名,如果主机名读取失败,则返回主机的IP地址。4、StringgetScheme()返回当前request对象的构造方案,例如http、https和ftp等,不同的构造方案有不同的URL构造规则。5、StringgetQueryString()返回URL的查询字串,即URL中“?”后面的“name=value”对。3.3request隐含对象6、StringgetReuquestURI()返回URL请求中目标资源的URI。7、StringgetMethod()返回request请求的提交方式,如:GET、POST等。8、StringgetServletPath()返回调用Servlet程序的URL请求。9、StringgetRealPath()返回虚拟路径在服务器上的真实绝对路径。3.4response隐含对象3.4.1输出缓冲区与响应提交输出缓冲区用于暂存Servlet程序的输出信息,减少服务器与客户端的网络通信次数。传送给客户端的信息称之为响应信息(response),如果输出缓冲区中的响应信息已经传递给客户端,称响应是已经提交。刷新操作强制把输出缓冲区中的内容传送回客户端。3.4response隐含对象response对象中和输出缓冲区相关的方法有:1、publicvoidflushBuffer()throwsjava.io.IOException刷新输出缓冲区,把信息传回客户端。2、publicvoidsetBufferSize(intsize)定义输出缓冲区的大小,单位字节。3、publicbooleanisCommitted()返回缓冲区中的响应信息是否已经提交。3.4response隐含对象3.4.2HTTP响应报头设置服务器通过HTTP响应报头向客户端浏览器传送通信信息。JSP服务器在默认情况下,响应信息是以字符形式传送。如果要用HTTP响应报头传输二进制数据,应该通过response.getOutputStream()获得一个ServletOutputStream输出流对象输出二进制信息。

3.4response隐含对象1、publicvoidsetContentType(java.lang.Stringtype)定义返回客户端的信息类型及编码标准,默认是“text/html;charset=UTF-8”。如果返回给客户端的是二进制信息,则应该调用此方法作适当的设置。信息类型为MIME-type中定义的类型,浏览器会根据信息类型自动调用匹配的软件来处理,或将信息另存为一个文件。例:response.setContentType("text/html;charset=gb2312");3.4response隐含对象<%@pageimport="java.io.*"%><%response.setContentType("application/vnd.ms-excel");try{PrintWriterout=response.getWrite();out.println("学号\t姓名\t平时成绩\t考试成绩\t期末成绩");out.println("s001\t张平\t78\t69\t=round(C2*0.3+D2*0.7,0)");out.println("s001\t李丽\t88\t96\t=round(C2*0.3+D2*0.7,0)");out.println("s001\t王宏\t63\t72\t=round(C2*0.3+D2*0.7,0)");}catch(Exceptione){Out.print("错误信息:"+e);}%>用response返回Excel文档形式的学生成绩表。IE浏览器接收到返回的Excel数据后,会自动嵌入Excel软件显示数据,如果Excel启动失败,浏览器提示把接收到的信息另存为磁盘文件。3.4response隐含对象2、publicvoidsetCharacterEncoding(java.lang.Stringcharset)

定义返回客户端信息的编码标准。如果已经用response.setContentType()定义字符集,则调用此方法将重新设置字符集。信息字符集的定义要在缓冲区刷新前进行。3.4response隐含对象3、publicvoidsendError(intsc)throwsjava.io.IOException向客户端返回HTTP响应码,并清空输出缓冲区。HTTP响应码由三位的十进制数构成:1xx:请求收到,继续处理。2xx:成功,行为被成功地接受、理解和接受。3xx:重定向,为了完成请求,必须进一步执行的动作。4xx:客户端错误。5xx:服务器出错。3.4response隐含对象例如在IE浏览器地址栏中输入::8080/aabb.jsp,企图访问Tomcat服务器中不存在的资源aabb.jsp,则Tomcat会给客户端返回一个HTTP响应码404,在IE浏览器上显示HTTP响应码及错误信息。3.4response隐含对象如果要人为地返回HTTP响应码,则调用sendError(intsc)方法,如:<body><%out.print(“返回一个404响应码”);response.sendError(404);%></body>

预览后,在IE浏览器中显示404状态码信息。3.4response隐含对象4、publicvoidsetHeader(java.lang.Stringname,java.lang.Stringvalue)第一个形参为报头名,第二个形参是报头值。HTTP报头中有一个名为“Refresh”的响应报头,它的作用是使IE浏览器在若干秒后自动刷新当前网页或跳转至指定的URL资源。3.4response隐含对象这个报头的语法为:

Response.setHeader("Refresh","定时秒数",url=目标资源的URL)方法的第一个形参是响应报头名"Refresh",第二个形参由两部分组成:第一部分定义秒数,即:若干秒后自动刷新,第二部分为目标资源的URL,缺少时默认刷新当前页。3.4response隐含对象<%!Staticintnumber=0;%><body><%number=number+1;out.print("number="+number);response.setHeader("Refresh","2");%></body>3.4response隐含对象3.4.3用response实现JSP页面重定向重定向是JSP中实现JSP/Servlet程序跳转至目标资源的方法之一。它的基本思想是:服务器将目标资源完整的URL通过HTTP响应报头发送给客户端浏览器,浏览器接收到URL后更新至地址栏中,并将目标资源的URL提交给服务器。重定向使目标资源的URL从服务器传到客户端浏览器,再从客户端通过HTTP请求传回服务器,其中有一定的网络时延。

3.4response隐含对象实现JSP页面跳转的主要方法有转发跳转(forward)和重定向跳转(redirect),RequestDispatcher.forward()实现的是转发跳转,response.sendRedirect()实现的是重定向跳转。两者的最大区别在于:1、重定向是通过客户端重新发送URL来实现,会导致浏览器地址更新,而转发是直接在服务器端切换程序,目标资源的URL不出现在浏览器的地址栏中;3.4response隐含对象2、转发能够把当前JSP页面中的request、response对象转发给目标资源,而重定向会导致当前JSP页面的request、response对象生命期结束,在目标资源中无法取得上一个JSP页面的request对象;3、转发跳转直接在服务器端进行,基本上没有网络传输时延,重定向有网络传输时延。3.4response隐含对象如果要实现服务器中两个Servlet程序间跳转,并且要使用request作用范围变量交换数据,应该优先使用request转发跳转。用重定向实现程序跳转时,如果要求传递数据给目标资源,一个简单、可行的方法是把数据编码在URL查询串中。例如::8080/exam.jsp?name=tom3.4response隐含对象用response实现重定向,要调用的方法为:形参是目标资源的URL,可以是相对路径或绝对路径。例如:<%response.sendRedirect(“:8080/exam.jsp?name=tom”);%>publicvoidsendRedirect(Stringlocation)throwsjava.io.IOException3.4response隐含对象3.4.4用response实现文件下载在JSP中实现文件下载最简单的方法是定义超链接指向目标资源,用户单击超链接后直接下载资源,但直接暴露资源的URL也会带来一些负面的影响,例如容易被其它网站盗链,造成本地服务器下载负载过重。3.4response隐含对象另外一种下载文件的方法是使用文件输出流实现下载,首先通过response报头告知客户端浏览器,将接收到的信息另存为一个文件,然后用输出流对象给客户端传输文件数据,浏览器接收数据完毕后将数据另存为文件。使用文件输出流下载方法的优点是服务器端资源路径的保密性好,并可控制下载的流量以及日志登记等。3.4response隐含对象二进制文件的下载首先将源文件封装成字节输入流对象,通过该对象读取文件数据,获取response对象的字节输出流对象,通过输出流对象将二进制的字节数据传送给客户端。把源文件封装成字节输入流对象将源文件封装成字节输入流,用JDK中的java.io.FileInputStream类,例如:

FileInputStreaminFile=newFileInputStream(“c:\\temp\\my1.exe”);从输入流中读取一定数量的字节数据并将其缓存在数组b中。publicintread(byte[]b)throwsIOException方法返回值是实际读取到的字节数。如果检测到文件尾,返回-1。3.4response隐含对象读取二进制字节数据并传输给客户端response对象的getOutputStream()方法可返回一个字节输出流对象ServletOutputStreamServletOutputStream中输出二进制字节数据的方法write(byte[]b)将数组中的b.length个字节写入输出流。例如:ServletOutputStreammyOut=response.getOutputStream();3.4response隐含对象【例3-6】用response把ROOT\d.zip文件传送回客户端。<%@pagecontentType="application/x-download",import="java.io.*"%><%intstatus=0;byteb[]=newbyte[1024];;FileInputStreamin=null;ServletOutputStreamout=null;try{response.setHeader("content-disposition","attachment;filename=d.zip");in=newFileInputStream("d.zip");out=response.getOutputStream();while(status!=-1){

status=in.read(b)out.write(b);}out.flush();}catch(Exceptione){System.out.println(e);response.sendRedirect("downError.jsp");

//重定向到出错页面}finally{if(in!=null)in.close();if(out!=null)out.close();}%>3.4response隐含对象文本文件的下载文本文件下载时用的是字符流,而不是字节流。首先取得源文件的字符输入流对象,用java.io.FileReader类封装,再把FileReader对象封装为java.io.BufferedReader,以方便从文本文件中一次读取一行。字符输出流直接用JSP的隐含对象out,out能够输出字符数据。用到FileReader类的方法有FileReader(StringfileName),该构造方法取得文件的字符输入流对象,形参fileName是文件的路径和文件名,路径分隔符用“//”或“\\”。如果打开文件出错,会引发一个异常。用到BufferedReader的方法有BufferedReader(Readerin)和readLine(),前者为构造方法,后者从文本文件中一次读取一行。3.4response隐含对象【例3-7】用JSP下载ROOT\ee.txt文件。<%@pagecontentType="application/x-download",import="java.io.*"%><%Stringtemp=null;FileReaderin=null;BufferedReaderin2=null;try{response.setHeader("content-disposition","attachment;filename=exam.txt");response.setCharacterEncoding("gb2312");in=newFileReader("ee.text");in2=newBufferedReader(in);while((temp=in2.readLine())!=null)out.println(temp);out.close();}catch(Exceptione){System.out.println(e);response.sendRedirect("downError.jsp");//重定向到出错页面}finally{if(in2!=null)in2.close();}%>3.5cookie管理Cookie机制Cookie或称Cookies,在Web技术中指Web服务器暂存在客户端浏览器内存或硬盘文件中的少量数据。Web服务器通过HTTP报头来获得客户端中的cookie信息。由于HTTP是无态的,无法记录用户的在线状态信息,利用cookie可以解决这个问题,把待存储的信息封装在cookie对象中并传回客户端保存,需要时再从客户端读取。3.5cookie管理Cookie机制如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效,直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。Cookie信息的基本结构类似于“name=value”对,每个数据有一个变量名。3.5cookie管理WindowsXP中,有一个“C:\DocumentsandSettings\admin\Cookies”文件夹,文件夹中存储有曾经访问过的网站的cookie文件。在此文件夹中,类似于“admin@127.0.0[1].txt”的文件中会看到被保存的cookie数据。3.5cookie管理在JSP中使用cookie的基本过程为:在服务器端生成cookie对象,把待保存信息写入cookie对象中;必要时设置cookie对象的生命期;把cookie对象传给客户端浏览器保存;服务器端程序需要cookie信息时,用代码读取cookie信息。3.5cookie管理Cookie类javax.servlet.http.Cookie类用来生成一个cookie对象,这个类中常用的方法有:构造方法的语法为Cookie(java.lang.Stringname,java.lang.Stringvalue)第一个形参是cookie数据的变量名,第二个形参是待保存的数据,字符串类型。3.5cookie管理publicvoidsetMaxAge(intexpiry)这个方法定义cookie对象的生命期,形参是生命时间数,单位秒。如果生命周期为负整数,表示这个cookie对象是临时的,不要保存在硬盘文件中,关闭IE浏览器后cookie数据自动丢失。如果生命期为零,表示删除这个cookie。默认值为-1。Cookie的生命期定义要在cookie对象传回客户端前进行。publicintgetMaxAge()用publicintgetMaxAge()方法可读取cookie对象的生命周期时间。3.5cookie管理publicvoidsetSecure(booleanflag)形参取值true时,表示用https或SSL安全协议将cookie传回服务器;取false时表示用当前默认的协议传回cookie。publicjava.lang.StringgetName()返回当前cookie对象的变量名。publicjava.lang.StringgetValue()返回当前cookie对象的值。3.5cookie管理将cookie对象传回客户端将cookie对象传回客户端,要用到JSP隐含对象response,用到的方法为:publicvoidaddCookie(Cookiecookie)形参是待保存的cookie对象。例如<%Cookiemsg=newCookie("login","tom");msg.setMaxAge(60*60*60*60);response.addCookie(msg);%>3.5cookie管理读取cookie对象读取客户端存储的cookie,用request对象的getCookies()方法,它的语法为:

publicCookie[]getCookies()返回的是一个cookie对象数组,当前浏览器中所有有效的cookie会通过HTTP请求报头返回给服务器,每个数组分量是一个返回的cookie对象。如果客户端没有有效的cookie,则返回null值。3.5cookie管理例如:<%Cookiec[]=request.getCookies();if(c!=null){for(inti=0;i<c.length;i++)out.print(c[i].getName+”=”+c[i].getValue()+”<br>”);}elseout.print(“没有返回cookie”);%>3.5cookie管理【例3-6】定义一个cookie对象,存储用户的登录名,生命期为30天。在另一个页面中查询这个cookie,如果读取的cookie不为空,则显示用户登录名,否则显示“没有登录”信息。再定义一个cookie对象,记录客户最近浏览过的五本图书的书号:AB001、KC981、DE345、RD332和PC667,如果已经登录,则显示书号,cookie生命期为30天。3.5cookie管理<body><%StringmyName="John";StringvisitedBook="AB001,KC981,DE345,RD332,PC667"Cookiec1=newCookie("loginName",myName);c1.setMaxAge(30*24*60*60);Cookiec2=newCookie(myName,visitedBook);C2.setMaxAge(30*24*60*60);response.addCookie(c1);response.addCookie(c2);out.print("成功将用户名、书目Cookie传回客户端,有效期30天");%></body>预览程序执行后网页上显示信息“成功将用户名、书目cookie传回客户端,有效期30天”。3.5cookie管理<body><% StringmyName=null; StringvisitedBook=null;Cookiec[]=request.getCookies(); if(c==null){out.print("没有返回cookie"); } else{ for(inti=0;i<c.length;i++){ Stringtemp=c[i].getName(); if(temp.equals("loginName")) myName=c[i].getValue(); if(myName!=null&&temp.equals(myName)) visitedBook=c[i].getValue(); }if(myName!=null){ out.print("您已经登录,用户名="+myName+"<br>")if(visitedBook!=null)out.print("您最近浏览过的图书书号是:"+visitedBook);}else out.print("您没有登录");}%></body>

3.5cookie管理预览执行结果页面,浏览器中显示的信息为:您已经登录,用户名=John

您最近浏览过的图书书号是:AB001,KC981,DE345,RD332,PC6673.7application隐含对象一个Web服务器通常有多个Web服务目录(网站),当Web服务器启动时,它自动为每个Web服务目录都创建一个application对象,这些application对象各自独立,而且和Web服务目录一一对应。访问同一个网站的客户都共享一个application对象。具体来说:不管哪个客户来访问网站A,也不管客户访问网站A下哪个页面文件,都可以对网站A的application对象进行操作。因此,当在application对象中存储数据后,所有访问网站A的客户都能够对其进行访问,实现了多个客户之间的数据共享。访问不同网站的客户,对应的application对象不同。与out、request、response只作用于当前页不同,application对象的有效范围是当前应用,即在同一应用程序中,只要应用服务器不关闭,这个对象就一直有效。3.7application隐含对象application作用范围变量(属性)

application作用范围变量也叫application属性,是类似于“name=value”的属性对,由属性名和属性值构成,属性值一般是一个Java对象,不是Java基本数据类型数据。application属性能够被Web应用中的所有程序共享。3.7application隐含对象application对象和session对象的比较两者的作用范围不同session对象是用户级的对象,而application对象是应用程序级的对象。一个用户一个session对象,每个用户的session对象不同,在用户所访问网站的多个页面之间共享同一个session对象。一个Web应用程序一个application对象,每个Web应用程序的application对象不同,但一个Web应用程序的多个用户之间共享同一个application对象。在同一个网站下,每个用户的session对象不同,所用用户的application对象相同。在不同网站下,每个用户的session对象不同,每个用户的application对象不同。两者的生命周期不同session对象的生命周期是用户首次访问网站创建,用户离开该网站(不一定要关闭浏览器)消亡。application对象的生命周期是启动Web服务器创建,关闭Web服务器销毁。3.7application隐含对象1、publicjava.util.EnumerationgetAttributeNames()返回当前上下文中所有可用的appliaction作用范围变量名,并存储在枚举型对象中。2、publicjava.lang.ObjectgetAttribute(java.lang.Stringname)从application作用范围中读取指定名字的属性值,返回的属性值是Object类型,一般要进行强制类型转换,还原其原本数据类型。如果指定的属性值对象不存在,则返回null。3.7application隐含对象以下代码段是遍历当前Web应用中所有的application属性:<%@pageimport="java.util.*"%><%Enumeratione=application.getAttributeNames();While(e.hasMoreElements()){StringvarName=(String)e.nextElement();StringvarValue=(String)application.getAttribute(varName);out.print(varName+"="+varValue+"<br>");}%>3.7application隐含对象3、publicvoidsetAttribute(Stringname,Objectobject)把一个属性写入application作用范围。第一个形参name是属性名,第二个形参object是属性值,它是一个Java对象。如果属性值object为null,则相当于删除一个属性名为name的属性。如果容器中已经存在指定名字的属性,写入操作会用当前的属性值替换原有的属性值。4、publicvoidremoveAttribute(java.lang.Stringname)从Servlet容器中删除指定名字的属性。形参是属性名,字符串形式。3.5application隐含对象4、publicvoidremoveAttribute(java.lang.Stringname)从Servlet容器中删除指定名字的属性。形参是属性名,字符串形式。3.7application隐含对象【例3.7】用application实现一个站点计数器。具体要求是当访问JSP页面时,页面进行访问次数统计,并输出当前计数值。用request.getRemoteAddr()来获取用户的IP地址,将访问过的用户IP地址作为application属性保存,只有新的IP地址才进行计数。3.7application隐含对象<body><%@pageimport="java.util.*"%><%intn=0;Stringip=request.getRemoteAddr();

Stringcounter=(String)application.getAttribute("counter");if(counter!=null)n=Integer.parseInt(counter);Enumeratione=application.getAttributeNames();while(e.hasMoreElements()){StringvarName=(String)e.nextElement();StringvarValue=(String)application.getAttribute(varName);if(!ip.equals(varValue)){n=n+1;out.print("您是第"+n+"位访客");counter=String.valueOf(n);application.setAttribute("counter",counter);application.setAttribute("ip"+n,ip);}else{out.print("您已经访问过本站");}}<%</body>3.6session隐含对象

HTTP协议是一种无状态协议,一次请求和响应客户端与服务器端的连接就会关闭,服务器并不保存相关的信息,再次交换数据需要建立新的连接。而通常一个Web应用是由多个web页面组成的一个完整的页面访问链条。一个用户对一个Web应用包含的多个web页面的访问过程称为一个会话。保存和跟踪一个会话过程的各页面信息并实现共享是十分重要的。session对象是JSP技术是为解决会话问题而专门提供的一种解决方案。下面的讨论中会话和session对象的概念会交替出现,要注意区分它们。3.6session隐含对象session生命期及跟踪方法通常把从用户登录进入系统到注销退出系统所经历的时间,称为一个session生命周期。生命期结束,则session对象被删除,与之绑定的session属性也随之丢失。影响session对象生命期的主要因素有:客户端浏览器窗口关闭,服务器关闭,session超时,程序主动结束session。要跟踪该会话,必须引入一种机制,就是如何把一个操作步中产生的有用信息保存下来,供后续的操作步使用,以及如何标识当前session通信等,这些问题称之为session跟踪问题。实现session跟踪有多种方法,通过session隐含对象属性设置是实现session跟踪最直接和简捷的方法。3.6session隐含对象用URL重写实现session跟踪URL重写(URLRewriting)就是把session数据编码成“name=value”对,当作URL的查询串附在URL后,用带有查询串的URL访问下一个目标资源时,附在URL查询串中的session数据自然被传送给下一页。用cookie实现session跟踪用cookie实现session跟踪的基本原理是:把一个session数据封装在一个cookie对象中,将cookie对象传回客户端存储,需要用到时用代码从客户端读取。用隐藏表单域实现session跟踪隐藏表单域在页面上不可视,它相当于一个变量,如果把一个session数据存储在其中,则提交表单时,隐藏表单域中的数据也会被提交给服务器。3.6session隐含对象session对象和cookie对象的比较

sessionid当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个sessionid;如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是唯一的,这个sessionid将被在本次响应中返回给客户端保存;如果已包含一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用。3.6session隐含对象session对象和cookie对象的比较

cookie机制和session机制异同cookie机制和session机制是保存客户端与服务器端连接状态的两种解决方案。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。3.6session隐含对象session对象主要方法

1、publicbooleanisNew()判断session对象是新创建的,还是已经存在。返回true时,表示session对象是刚创建的,也表示本次客户端发出的请求是本次session通信的第一次请求。这个方法返回true,并不表示客户端浏览器窗口是新打开的。2、publicjava.lang.StringgetId()返回当前session对象的ID号。3.6session隐含对象3、publiclonggetLastAccessedTime()返回客户端最后一次请求的发送时间,是一个long型的整数,单位毫秒,是从格林威治时间1970-1-100:00:00到当前所经历的毫秒数。例如,以下代码可以取得session通信中最后一次请求时间并将毫秒时间格式转换为年月日时分秒(Calendar)格式。longa=session.getLastAccessedTime();Calendartime=Calendar.getInstance();time.setTimeInMillis(a);3.6session隐含对象4、publicvoidsetMaxInactiveInterval(intinterval)形参是一个整数,定义session对象的超时时间,单位秒。如果客户端从最后一次请求开始,在连续的interval秒内一直没有再向服务器发送HTTP请求,则服务器认为出现了session超时,将删除本次的session对象。如果超时时间为负数,表示永不超时。session对象的超时检测由服务器实现,这会增加系统开销。Tomcat默认的超时时间是30分钟。3.6session隐含对象5、publicintgetMaxInactiveInterval()读取当前的session超时时间,单位秒。6、publicvoidinvalidate()使当前session无效,session作用范围变量也会随之丢失。3.6session隐含对象session隐含对象属性的相关方法为:7、publicvoidsetAttribute(java.lang.Stringname,java.lang.Objectvalue)定义session作用范围变量,第一个形参name是session作用范围变量名,第二个形参value是session属性。如果value为null,则表示取消session属性和session的绑定关系。

8、publicjava.lang.ObjectgetAttribute(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论