资源预览内容
第1页 / 共231页
第2页 / 共231页
第3页 / 共231页
第4页 / 共231页
第5页 / 共231页
第6页 / 共231页
第7页 / 共231页
第8页 / 共231页
第9页 / 共231页
第10页 / 共231页
亲,该文档总共231页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第3章 JSP隐含对象 3.1JSP页面中的八个隐含对象页面中的八个隐含对象在JSP页面中,经常要处理request请求、response响应等信息,为了简化程序设计,JSP规范定义了常用的8个隐含对象(implicit objects),这些隐含对象不需要在JSP页面中用new关键字来创建,而是由Servlet容器来创建与管理,并传递给JSP页面的Servlet实现类使用。这8个隐含对象及所依赖的类/接口如表3-1示。 本章主要内容本章要点:out隐含对象HTTP请求与request隐含对象HTTP响应与response隐含对象session隐含对象与session跟踪application隐含对象cookies技术JSP验证码的生成3.1JSP页面中的八个隐含对象页面中的八个隐含对象3.1JSP页面中的八个隐含对象页面中的八个隐含对象在JSP页面Servlet实现类的_jspService()方法内部,自动初始化JSP隐含对象的代码段如下: 3.1JSP页面中的八个隐含对象页面中的八个隐含对象3.2out隐含对象隐含对象3.2.1输出信息的方法输出信息的方法1、print()和和println()print()和和println()用用于于打打印印输输出出信信息息,前前者者输输出出的的信信息息在在返返回回客客户户端端的的源源代代码码中中不不换换行行,后后者者输输出出的的信信息息在在返返回回客客户户端端的的源源代代码码中中换换行行。被被打打印印的的信信息息可可以以是是基基本本数数据据类类型型(如如int、double等等),也也可可以以是是对对象象(如如字符串等字符串等)。 3.2out隐含对象隐含对象例如,在JSP页面中有以下代码: 3.2out隐含对象隐含对象预览页面后,在IE5浏览器中看到的显示内容为“123456”,服务器返回的HTML代码为: 1234563.2out隐含对象隐含对象如果把JSP页面中的代码改为: 3.2out隐含对象隐含对象预览页面后,在IE5浏览器中看到的显示内容为“123 456”,服务器返回的HTML代码为: 1234563.2out隐含对象隐含对象也就说:在服务器的返回源代码中,信息“123”和“456”是换行的。println()不表示让IE5浏览器换行显示信息,要实现这个功能,应该使用换行符“”。例如: % out.print(123); out.print(); out.print(456); %3.2out隐含对象隐含对象预览后,IE浏览器中显示的内容为:服务器返回的HTML代码为:123456 1234563.2out隐含对象隐含对象2、newLine()newLine()表示输出一个回车换行符,例如:表示输出一个回车换行符,例如: 3.2out隐含对象隐含对象服务器返回的HTML代码为: 1234563.2out隐含对象隐含对象3.2.2 缓冲区相关的方法 1、flush()方法方法flush()用于刷新流。用于刷新流。Java中把中把I/O操作转化为流操作转化为流操作。操作。out.write()输出的信息暂时存储在流对象输出的信息暂时存储在流对象缓冲区中,刷新操作把缓冲区中的信息传递给目缓冲区中,刷新操作把缓冲区中的信息传递给目标对象处理,如果目标对象是另外一个字符流或标对象处理,如果目标对象是另外一个字符流或字节流,同样刷新它,所以,调用字节流,同样刷新它,所以,调用flush()方法会方法会导致刷新所有输出流对象链中的缓冲区。如果缓导致刷新所有输出流对象链中的缓冲区。如果缓冲区满了,这个方法被自动调用,输出缓冲区中冲区满了,这个方法被自动调用,输出缓冲区中的信息。的信息。 3.2out隐含对象隐含对象如果流已经关闭,调用print()或flush()会引发一个IOException异常,例如:在Tomcat命令行窗口中显示“警告: Internal error flushing the buffer in release()”的异常信息。 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()+); out.print(缓冲区空闭容量=+out.getRemaining()+); out.print(缓冲区是否自动刷新=+out.isAutoFlush(); %3.2out隐含对象隐含对象预览后,显示的信息为:缓冲区总容量=8192缓冲区空闭容量=7883缓冲区是否自动刷新=true3.3request隐含对象隐含对象3.3.1用用request读取客户端传递来的参数读取客户端传递来的参数客客户户端端传传递递给给服服务务器器的的参参数数最最常常见见的的是是表表单单数数据据或或附附在在URL中中的的参参数数,其其中中URL中中的的参参数数是是指指URL“?”后后面面的的参参数数,称称之之为为查查询询串串(querystring)参参数数,例例如如http:/localhost/exam.jsp?name=tomcat中的中的“name=tomcat”。 3.3request隐含对象隐含对象1、用、用request读取单值参数读取单值参数 所谓单值参数是指:一个变量最多有一个值。用request对象的getParameter()方法读取这些参数。getParameter()用于读取指定变量名的参数值,方法的定义为:方法的形参是参数的变量名,以String形式返回变量的值。如果request对象中没有指定的变量,则返回null。 public java.lang.String getParameter(java.lang.String name)3.3request隐含对象隐含对象【例3-1】制作一个用户登录应用,用户在表单中输入用户名和口令后提交给下一个JSP页面读取并显示。操作步骤如下:1、启动DW8,新建JSP文件exam301.jsp。在设计视图的工作区中插入登录表单:3.3request隐含对象隐含对象插入表单:使用菜单【插入】【表单】【表单】。在工作区中,表单提交给 “exam302.jsp”。在表单中添加用户名文本域,文本域名为“userName”。在表单中添加口令文本域,文本域的名字为“password”,在【类型】项中选定“密码”。在表单中添加提交按钮。保存文档。3.3request隐含对象隐含对象在DW8中新建JSP文件exam302.jsp。在代码视图中找到标记,输入如下的代码:3.3request隐含对象隐含对象(3)预览。启动Tocmat,预览exam301.jsp,在表单中输入用户名和口令,提交后exam302.jsp中显示接收到的用户名和口令。关于从request对象读取参数时的中文乱码问题。在本例中,如果用户名是中文,例如“张历进”,则exam302.jsp显示的是中文乱码。原因是Java在默认情况下采用的是Unicode编码标准,一般是UTF-8,把它转换为GB2312简体中文编码即可。 3.3request隐含对象隐含对象解决方法是写一个转码方法,在显示字符串前,把字符串转换成简体中文后再显示,转码方法为toChinese()。exam302.jsp中的代码修改为: 3.3request隐含对象隐含对象3.3request隐含对象隐含对象在上述的例子中,exam302.jsp读取的参数来自客户端表单。参数也可以来自URL查询串,例如,在IE浏览器的地址栏中输入以下URL并回车:http:/127.0.0.1:8080/exam302.jsp?userName=tom&password=333.3request隐含对象隐含对象在上述的例子中,用request.getParameter()读取表单传来的参数时,必须要给出参数的变量名,参数变量名是以硬编码形式嵌在代码中,缺乏灵活性。getParameterNames()能返回request对象中的参数变量名,它的定义为: public java.util.Enumeration getParameterNames()3.3request隐含对象隐含对象把例3-1改用getParameterNames()读取表单参数,代码为: 3.3request隐含对象隐含对象3.3request隐含对象隐含对象预览exam301.jsp,提交表单后,修改后的代码运行结果:结果中多了一个提交按钮参数,它也属于exam301.jsp中的表单元素,它默认的变量名为“Submit”。password=123Submit=提交userName=tom3.3request隐含对象隐含对象2、用、用request读取多值参数读取多值参数多值参数的典型代表是表单复选框,例如多值参数的典型代表是表单复选框,例如在第在第2章的章的【例例2-2】中,会员注册信息中中,会员注册信息中的的“爱好爱好”同名表单就是多值参数,爱好同名表单就是多值参数,爱好选项中的表单变量名均为选项中的表单变量名均为“hobby”,用户,用户可以选定多个爱好。在服务器端读取多值可以选定多个爱好。在服务器端读取多值参数,要用到参数,要用到request.getParameterValues(),它的定义如下:,它的定义如下:3.3request隐含对象隐含对象形参为多值参数的变量名,多个参数值返回后存储在一个字符串数组中。public java.lang.String getParameterValues(java.lang.String name)3.3request隐含对象隐含对象【例3-2】在第2章的【例2-2】中制作了一个会员注册信息页面,表单提交给exam303.jsp处理。本例中制作exam303.jsp,读取表单中的信息显示在网页上。操作步骤如下:启动DW8,新建JSP文件exam303.jsp。在标记前后添加如下代码:3.3request隐含对象隐含对象3.3request隐含对象隐含对象3.3request隐含对象隐含对象预览exam202.jsp页面,提交表单后,exam303.jsp中显示了表单中的数据。在本例实验中,如果多值表单“hobby”没有选定任何值,则在服务器端的request对象中不存在“hobby”这个参数。如果要用URL传递多值参数,则每个参数值均按“name=value”形式附加在URL查询串中,例如:http:/127.0.0.1:8080/exam303.jsp?hobby=11&hobby=22& hobby=33& hobby=443.3request隐含对象隐含对象3.3.2request作用范围变量作用范围变量服务器端的两个JSP/Servlet程序间要交换数据时,可通过request作用范围变量来实现。request作用范围变量也叫request属性(attributes),是类似于“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.setAttribute()方法将一个属性值对象写入request对象中,或者说把一个属性值对象定义为request作用范围变量,实际上是把属性值对象与request隐含对象绑定,使属性值对象本身的生命周期和request对象的生命周期直接相关,在当前request隐含对象有效的范围内,与之绑定的属性值对象也是有效的,可通过reuqest.getAttribute()方法读取这些有效的属性值对象,当request对象生命期结束时,与之绑定的request属性变量会变成垃圾对象而被回收。3.3request隐含对象隐含对象request作用范围变量的变量名可以采用Java包的命名方式,例如:com.abc.mis.login.name、com.abc.mis.login.pw等,变量名尽可能唯一,并且不要与Java/J2EE的包名/类名相同。 3.3request隐含对象隐含对象在JSP中,除了request作用范围变量外,还有page、session和application作用范围变量,它们的基本含义都是把属性值对象与某个有生命周期的JSP隐含对象相绑定,使属性值对象有一定的生命周期,或者说使属性值对象在一定的作用范围内有效。定义作用范围变量一般是调用JSP隐含对象中的setAttribute()方法,读取作用范围变量一般是调用getAttribute()方法。 3.3request隐含对象隐含对象1、setAttribute()/getAttribute()方法方法request.setAttribute()用于把一个属性对象按指定的名字写入request作用范围,它的语法为:第一个形参是作用范围变量名,名字要唯一,第二个形参是属性值对象。public void setAttribute(java.lang.String name, java.lang.Object o) 3.3request隐含对象隐含对象request.getAttribute()从request作用范围读出指定名字的属性对象,它的语法为:形参是属性值对象的变量名,方法返回的对象是Object类型,一般要进行强制类型转换,还原属性值对象的原本数据类型。例如: public java.lang.Object getAttribute(java.lang.String name) 3.3request隐含对象隐含对象3.3request隐含对象隐含对象2、getRequestDispatcher()两个Servlet程序间要利用request作用范围变量来传递数据时,要用转发跳转操作实现从第一个Servlet程序A跳转到第二个Servlet程序B,跳转时,程序A中的request和response隐含对象会被自动转发给程序B。3.3request隐含对象隐含对象request转发器(RequestDispatcher)的作用是获得目标资源的转发器,通过转发器将当前Servlet程序的request和response对象转发给目标资源,并跳转至目标资源上运行程序,这样,目标资源就可通过request对象读取上一资源传递给它的request属性。3.3request隐含对象隐含对象request. getRequestDispatcher()的作用是返回目标资源的RequestDispatcher对象,语法为: 形参是当前Web应用目标资源的URI,可以使用相对路径或绝对路径。public requestDispatcher getRequestDispatcher(java.lang.String path)3.3request隐含对象隐含对象RequestDispatcher中主要的方法有:public void forward(ServletRequest request, ServletResponse response) throws ServletException,java.io.IOException该方法能够把当前Servlet程序的request和response隐含对象转发给目标资源,并跳转至目标资源运行代码。形参是当前Servlet程序的request和response隐含对象。3.3request隐含对象隐含对象 forward()方法在response信息提交前调用。如果在调用forward()之前已经刷新了response输出缓冲区,那么转发会引发异常。在执行跳转动作前,当前response对象输出缓冲区中的信息将被清空。 例如,假定在a.jsp中有以下代码:3.3request隐含对象隐含对象3.3request隐含对象隐含对象预览a.jsp后,无法跳转至b.jsp,只是显示“a第1次输出”信息。因为第4行在转发前刷新了response输出缓冲区,导致转发跳转失败,但a.jsp第3行中的输出信息在转发动作执行前,已经因刷新而返回给客户端显示。3.3request隐含对象隐含对象public void include(ServletRequest request, ServletResponse response) throws ServletException,java.io.IOException该方法用于包含目标资源。形参是当前JSP/Servlet程序的request、response对象。如果目标资源是JSP页面,它会被编译成Servlet程序后再运行。进行包含操作前,允许对当前JSP/Servlet程序的response输出缓冲区进行刷新。 3.3request隐含对象隐含对象例如,假定有a.jsp页面,代码如下: 3.3request隐含对象隐含对象在b.jsp中假定有以下代码:3.3request隐含对象隐含对象预览a.jsp后,输出信息为:a第1次输出b输出a第2次输出1233.3request隐含对象隐含对象【例3-3】利用request作用范围变量在两个JSP页面间传递数据。操作步骤如下:启动DW8,新建JSP文件exam304.jsp。在代码视图的间输入如下的代码:3.3request隐含对象隐含对象(3)在DW8中,新建JSP文件exam305.jsp。(4)在代码视图的body中输入以下代码:3.3request隐含对象隐含对象(5)预览,IE浏览器显示的内容为:在exam305.jsp中读到exam304.jsp传来的值=tom3.3request隐含对象隐含对象3、removeAttribute()此方法的作用是从request作用范围中删除指定名字的属性,它的语法为:形参是属性名。例如:public void removeAttribute(String name)request.removeAttribute(“name”);3.3request隐含对象隐含对象4、setCharacterEncoding()()定义request对象中的parameter参数的字符编码标准。例如,parameter参数如果有中文,在读取参数前调用此方法,设置参数的编码标准为GB2312,可以解决以POST方式提交参数的中文乱码问题。3.3request隐含对象隐含对象3.3.3用用request读取系统信息读取系统信息1、getProtocol()返回request请求使用的协议及版本号,方法的语法为:例如:public java.lang.String getProtocol()3.3request隐含对象隐含对象2、getRemoteAddr()返回客户端或最后一个客户端代理服务器的IP地址,方法的语法为:例如:预览后显示:127.0.0.1。 public java.lang.String getRemoteAddr()3.3request隐含对象隐含对象3、getRemoteHost()返回客户端主机名或最后一个客户端代理服务器的主机名,如果主机名读取失败,则返回主机的IP地址。方法的语法为:public java.lang.String getRemoteHost()3.3request隐含对象隐含对象4、getScheme()返回当前request对象的构造方案,例如http、https和ftp等,不同的构造方案有不同的URL构造规则。例如:预览后显示:http。3.3request隐含对象隐含对象5、getQueryString()返回URL的查询字串,即URL中“?”后面的“name=value”对。例如,客户端请求的URL为:目标资源untiltled.jsp中有以下代码:预览后显示:dd=22&ff=2。http:/127.0.0.1:8080/untitled.jsp?dd=22&ff=23.3request隐含对象隐含对象6、getReuquestURI()返回URL请求中目标资源的URI。例如,有以下的HTTP请求:目标资源untitled.jsp中有如下的代码:预览后显示:/untitled.jsp。http:/127.0.0.1:8080/untitled.jsp?dd=22&ff=23.3request隐含对象隐含对象7、getMethod()返回request请求的提交方式,如:GET、POST等。8、getServletPath()返回调用Servlet程序的URL请求,例如,对于:http:/127.0.0.1:8080/untitled.jsp3.3request隐含对象隐含对象目标资源untitled.jsp中有如下的代码:预览后显示:/untitled.jsp。3.3request隐含对象隐含对象9、getRealPath()()返回虚拟路径在服务器上的真实绝对路径,例如,对于:目标资源untitled.jsp中有如下的代码:预览后显示:C:tomcatwebappsROOTuntitled.jsp。http:/127.0.0.1:8080/untitled.jsp3.3request隐含对象隐含对象3.3.4用用request读取读取HTTP请求报头信息请求报头信息客户端浏览器向服务器请求资源的过程一般分为三步来完成:第一步:发出请求。浏览器通过HTTP协议向服务器提交请求,例如:http:/127.0.0.1:8080/exam.jsp3.3request隐含对象隐含对象第二步:HTTP报头信息交换。JSP服务器接收到客户端的资源请求后,判断请求是否合法,如果请求有效,则进行报头信息交换。客户机用HTTP协议向服务器传递的报头信息叫HTTP请求报头,服务器给客户机返回的报头信息叫HTTP响应报头。第三步:信息传输,例如把JSP页面的输出信息从服务器上传回浏览器,或把客户机上的文件上传到服务器。3.3request隐含对象隐含对象关于HTTP报头的详细信息请参阅RFC2616文档。在JSP中要读取HTTP请求报头中的信息,可以使用getHeaderNames()和getHeader()等方法。1、getHeader()返回指定的HTTP报头信息,语法为:该方法的形参为报头名字。关于HTTP的报头名字信息请参考相关的RFC文档。publicjava.lang.StringgetHeader(java.lang.Stringname)3.3request隐含对象隐含对象3、getHeaderNames()返回HTTP报头的名字,名字存储在一个枚举型对象中。以下代码读出HTTP请求报头中的信息:3.3request隐含对象隐含对象程序段的运行结果类似于: 3.3request隐含对象隐含对象3.3.5用用request读取读取cookieCookie,或称,或称Cookies,在,在Web技术中指技术中指Web服务器暂存在客户端浏览器内存或硬盘服务器暂存在客户端浏览器内存或硬盘文件中的少量数据。文件中的少量数据。Web服务器通过服务器通过HTTP报头来获得客户端中的报头来获得客户端中的cookie信息。信息。HTTP是无态的,无法记录用户的在线信息,是无态的,无法记录用户的在线信息,利用利用cookie可以解决这个问题,把待存储的可以解决这个问题,把待存储的信息封装在信息封装在cookie对象中并传回客户端保存,对象中并传回客户端保存,需要时再从客户端读取。需要时再从客户端读取。3.3request隐含对象隐含对象Cookie信息的基本结构类似于“name=value”对,每个数据有一个变量名。Cookie信息有一定的有效期,有效期短的直接存于IE浏览器内存中,关闭浏览器后,这些cookie信息也就丢失。有效期长的信息存储在硬盘文件上,例如Windows XP中,用关键字“cookies”搜索C:盘,会发现有一个“C:Documents and SettingsadminCookies”文件夹,文件夹中存储有曾经访问过的网站的cookie文件(*.txt)。3.3request隐含对象隐含对象在JSP中使用cookie的基本过程为:在服务器端生成cookie对象,把待保存信息写入cookie对象中;必要时设置cookie对象的生命期;把cookie对象传给客户端浏览器保存;服务器端程序需要cookie信息时,用代码读取cookie信息。3.3request隐含对象隐含对象1、Cookie类类javax.servlet.http.Cookie类用来生成一个cookie对象,这个类中常用的方法有:构造方法构造方法的语法为: 第一个形参是cookie数据的变量名,第二个形参是待保存的数据,字符串类型。Cookie(java.lang.Stringname,java.lang.Stringvalue)3.3request隐含对象隐含对象public void setMaxAge(int expiry)这个方法定义cookie对象的生命期,形参是生命时间数,单位秒。如果生命周期为负整数,表示这个cookie对象是临时的,不要保存在硬盘文件中,关闭IE浏览器后cookie数据自动丢失。如果生命期为零,表示删除这个cookie。默认值为-1。Cookie的生命期定义要在cookie对象传回客户端前进行。用public int getMaxAge()方法可读取cookie对象的生命时间。 3.3request隐含对象隐含对象public void setSecure(boolean flag)形参取值true时,表示用https或SSL安全协议将cookie传回服务器;取false时表示用当前默认的协议传回cookie。public java.lang.String getName()返回当前cookie对象的变量名。public java.lang.String getValue()返回当前cookie对象的值。3.3request隐含对象隐含对象2、将、将cookie对象传回客户端对象传回客户端将cookie对象传回客户端,要用到另外一个JSP隐含对象response,用到的方法为:形参是待保存的cookie对象。例如: publicvoidaddCookie(Cookiecookie)3.3request隐含对象隐含对象第第1行行:3.3request隐含对象隐含对象3、读取读取cookie对象对象读取客户端存储的cookie,用request对象的getCookies()方法,它的语法为:返回的是一个cookie对象数组,当前浏览器中所有有效的cookie会通过HTTP请求报头返回给服务器,每个数组分量是一个返回的cookie对象。如果客户端没有有效的cookie,则返回null值。例如:publicCookiegetCookies()3.3request隐含对象隐含对象3.3request隐含对象隐含对象【例3-4】定义一个cookie对象,存储用户的登录名,生命期为30天,在另一个页面中查询这个cookie,如果读取的cookie不为空,则显示用户登录名,否则显示“没有登录”信息。再定义一个cookie对象,记录客户最近浏览过的五本图书的书号:AB001、KC981、DE345、RD332和PC667,如果已经登录,则显示书号,cookie生命期为30天。操作步骤如下:(1)启动DW8,新建一个JSP文件 exam306.jsp。(2)在中输入以下代码:3.3request隐含对象隐含对象3.3request隐含对象隐含对象(3)预览exam306.jsp,网页上显示信息“成功将用户名、书目cookie传回客户端,有效期30天”。用WindowsXP的开始菜单在c:盘中搜索有“cookies”关键字的文件夹,会找到类似于“C:Documents and SettingsadminCookies”的文件夹。打开此文件夹,会看到类似于“admin127.0.01.txt”的一个文件,“admin”是当前登录WinXP的登录用户名,“127.0.01”表示本机。打开此文件,会看到被保存的数据。(4)新建一个JSP文件exam307.jsp。(5)在间输入以下代码:3.3request隐含对象隐含对象第第1行行:第第2行行:%第第3行行:StringmyName=null;第第4行行:StringvisitedBook=null;第第5行行:Cookiec=request.getCookies();第第6行行:if(c=null)第第7行行:out.print(没有返回没有返回cookie);第第8行行:else第第9行行:第第10行行: for(inti=0;ic.length;i+)第第11行行:第第12行行:Stringtemp=ci.getName();第第13行行:if(temp.equals(loginName)第第14行行:myName=ci.getValue();第第15行行:第第16行行:if(myName!=null&temp.equals(myName)第第17行行:第第18行行:visitedBook=ci.getValue();第第19行行:第第20行行:3.3request隐含对象隐含对象第第21行行: if(myName!=null)第第22行行: 第第23行行: out.print(您已经登录,用户名您已经登录,用户名=+myName+);第第24行行:if(visitedBook!=null)第第25行行:out.print(您最近浏览过的图书书号是:您最近浏览过的图书书号是:+visitedBook);第第26行行: 第第27行行: else第第28行行: 第第29行行: out.print(您没有登录您没有登录);第第30行行: 第第31行行: 第第32行行:%第第33行行:3.3request隐含对象隐含对象(6)启动Tomcat,预览exam307.jsp,浏览器中显示的信息为:您已经登录,用户名您已经登录,用户名=John您最近浏览过的图书书号是:您最近浏览过的图书书号是:AB001,KC981,DE345,RD332,PC6673.3request隐含对象隐含对象(7)cookie生命期验证。关闭所有的浏览器窗口。关闭Tomcat。重启Tomcat。新打开一个IE浏览器窗口,在地址栏中输入:http:/127.0.0.1:8080/exam307.jsp并回车,浏览器中还能看到用户信息。说明cookie信息是存储在客户端,由客户端浏览器维护。在WindowsXP中,把当前机内日期向前调整两个月以上,例如把三月改为五月。新打开一个IE浏览器窗口,在地址栏中输入:http:/127.0.0.1:8080/exam307.jsp并回车,发现cookie信息因过期而没有返回给服务器显示。3.3request隐含对象隐含对象3.3.6用用request选择国际化信息选择国际化信息request对象可以读取客户端浏览器的语言类型,并据此选择适当的语言信息给客户阅读,这项工作叫信息国际化。request对象中的getLocale()方法返回客户端的语言信息,并存储在public java.util.Locale对象中。java.util.Locale是JDK中的一个类,Locale 对象表示了特定的地理、政治和文化地区。Locale类中定义了一些类属性来表达各国语言,例如中文为Locale.CHINA,英文为Locale. ENGLISH或Locale.US等。 3.3request隐含对象隐含对象以下例子是根据客户端的语言类型决定显示中文还是英文信息:3.4response隐含对象隐含对象3.4.1输出缓冲区与响应提交输出缓冲区与响应提交输输出出缓缓冲冲区区用用于于暂暂存存Servlet程程序序的的输输出出信信息息,减减少少服服务务器器与与客客户户端端的的网网络络通通信信次次数数。传传送送给给客客户户端端的的信信息息称称之之为为响响应应信信息息(response),如如果果输输出出缓缓冲冲区区中中的的响响应应信信息息已已经经传传递递给给客客户户端端,称称响响应应是是已已经经提提交交的的(responsecommitted)。刷刷新新操操作作强强制制把把输输出出缓缓冲冲区区中中的的内内容容传传送送回回客客户户端端。response对象中和输出缓冲区相关的方法有:对象中和输出缓冲区相关的方法有: 3.4response隐含对象隐含对象1、publicvoidflushBuffer()throwsjava.io.IOException刷新输出缓冲区,把信息传回客户端。out.flush()也具有刷新缓冲区的功能。2、publicvoidsetBufferSize(intsize)定义输出缓冲区的大小,单位字节。3、publicbooleanisCommitted()返回缓冲区中的响应信息是否已经提交。3.4response隐含对象隐含对象3.4response隐含对象隐含对象预览的结果为: 3.4response隐含对象隐含对象4、publicjava.io.PrintWritergetWriter()throwsjava.io.IOException返回一个PrintWriter对象,Servlet程序通过此对象向客户端输出字符信息,调用对象中的flush()方法实现响应提交。3.4response隐含对象隐含对象3.4.2HTTP响应报头设置响应报头设置服服务务器器通通过过HTTP响响应应报报头头向向客客户户端端浏浏览览器器传传送送通通信信信信息息。JSP服服务务器器在在默默认认情情况况下下,响响应应信信息息是是以以字字符符形形式式传传送送。如如果果要要用用HTTP响响 应应 报报 头头 传传 输输 二二 进进 制制 数数 据据 , 应应 该该 通通 过过response. getOutputStream()获获 得得 一一 个个ServletOutputStream输输出出流流对对象象输输出出二二进进制信息。制信息。 3.4response隐含对象隐含对象1、publicvoidsetContentType(java.lang.Stringtype)定义返回客户端的信息类型及编码标准,默认是“text/html;charset=UTF-8”。DW8自动生成JSP页面的第1行中,有代码,被翻译成Servlet程序后,在Servlet程序的_jspService()方法中相应的代码为:response.setContentType(text/html;charset=gb2312);3.4response隐含对象隐含对象如果返回给客户端的是二进制信息,则应该调用此方法作适当的设置。信息类型为MIME-type中定义的类型,浏览器会根据信息类型自动调用匹配的软件来处理,或将信息另存为一个文件。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浏览器地址栏中输入:http:/127.0.0.1:8080/aabb.jsp,企图访问Tomcat服务器中不存在的资源aabb.jsp,则Tomcat会给客户端返回一个HTTP响应码404,在IE浏览器上显示HTTP响应码及错误信息。3.4response隐含对象隐含对象如果要人为地返回HTTP响应码,则调用sendError(int sc)方法,如: 预览后,在预览后,在IE浏览器中显示浏览器中显示404状态码信息。状态码信息。3.4response隐含对象隐含对象如果要自定义响应码的返回信息,则调用方法: publicvoidsendError(intsc,java.lang.Stringmsg)throwsjava.io.IOException第一个形参是响应码,第二个形参是响应码的信息。如:第一个形参是响应码,第二个形参是响应码的信息。如:3.4response隐含对象隐含对象预览后,在IE浏览器上看到的信息为:3.4response隐含对象隐含对象如果要自定义一个488响应码,代码如:显示的结果为:显示的结果为:3.4response隐含对象隐含对象如果希望出现某个响应码时,服务器自动转至某页面显示信息,需要在Web应用中的WEB-INFweb.xml部署文件中作出定义。例如,当出现404错误码时,转至e404.jsp显示信息,在web.xml的标记内添加一项部署信息如下示: 3.4response隐含对象隐含对象这项配置信息表示,当出现404响应码时,自动跳转至/e404.jsp页面。e404.jsp页面中的内容如:3.4response隐含对象隐含对象3.4response隐含对象隐含对象4、publicvoidsetHeader(java.lang.Stringname,java.lang.Stringvalue)第一个形参为报头名,第二个形参是报头值。关于HTTP报头的定义请参考RFC 2047(http:/www.ietf.org/rfc/rfc2047.txt)。HTTP报头中有一个名为“Refresh”的响应报头,它的作用是使IE浏览器在若干秒后自动刷新当前网页或跳转至指定的URL资源。 3.4response隐含对象隐含对象这个报头的语法为:方法的第一个形参是响应报头名Refresh,第二个形参由两部分组成:第一部分定义秒数,即:若干秒后自动刷新,第二部分为目标资源的URL,缺少时默认刷新当前页。 3.4response隐含对象隐含对象例如: 3.4response隐含对象隐含对象如果要实现若干秒后自动跳转至目标页,代码如:3.4response隐含对象隐含对象【例3-5】用response返回Excel文档形式的学生成绩表。操作步骤如下:(1)新建JSP文件exam309.jsp。(2)在代码视图录入如下的代码:3.4response隐含对象隐含对象(3)预览exam309.jsp,IE浏览器接收到返回的Excel数据后,会自动嵌入Excel软件显示数据,如果Excel启动失败,浏览器提示把接收到的信息另存为磁盘文件。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查询串中,例如:http:/127.0.0.1:8080/exam.jsp?name=tom。 3.4response隐含对象隐含对象用response实现重定向,要调用的方法为:形参是目标资源的URL,可以是相对路径或绝对路径。例如: 3.4response隐含对象隐含对象3.4.4用用response实现文件下载实现文件下载在JSP中实现文件下载最简单的方法是定义超链接指向目标资源,用户单击超链接后直接下载资源,但直接暴露资源的URL也会带来一些负面的影响,例如容易被其它网站盗链,造成本地服务器下载负载过重。3.4response隐含对象隐含对象另外一种下载文件的方法是使用文件输出流实现下载,首先通过response报头告知客户端浏览器,将接收到的信息另存为一个文件,然后用输出流对象给客户端传输文件数据,浏览器接收数据完毕后将数据另存为文件,这种下载方法的优点是服务器端资源路径的保密性好,并可控制下载的流量以及日志登记等。 3.4response隐含对象隐含对象1、二进制文件的下载、二进制文件的下载用JSP程序下载二进制文件的基本原理是:首先将源文件封装成字节输入流对象,通过该对象读取文件数据,获取response对象的字节输出流对象,通过输出流对象将二进制的字节数据传送给客户端。3.4response隐含对象隐含对象(1)把源文件封装成字节输入流对象把源文件封装成字节输入流对象将源文件封装成字节输入流,用JDK中的java.io.FileInputStream类,常用的方法有:publicFileInputStream(Stringname)throwsFileNotFoundException构造方法,形参是源文件的路径和文件名,注意路径分隔符使用“/”或“”,例如: FileInputStreaminFile=newFileInputStream(“c:tempmy1.exe”);3.4response隐含对象隐含对象publicintread(byteb)throwsIOException从输入流中读取一定数量的字节数据并将其缓存在数组 b 中。方法返回值是实际读取到的字节数。如果检测到文件尾,返回-1。publicvoidclose()throwsIOException关闭输入流并释放相关的系统资源。3.4response隐含对象隐含对象(2)读取二进制字节数据并传输给客户端读取二进制字节数据并传输给客户端response对象的getOutputStream()方法可返回一个字节输出流对象,语法为:返回的字节输出流对象是javax.servlet.ServletOutputStream。ServletOutputStream继承java.io. OutputStream,主要供Servlet程序向客户端传送二进制数据,子类由Servlet容器实现, publicServletOutputStreamgetOutputStream()throwsjava.io.IOException3.4response隐含对象隐含对象如:ServletOutputStream myOut=response. getOutputStream();ServletOutputStream中常用的方法有:publicvoidwrite(byteb)throwsIOException这个方法将数组中的b.length个字节写入输出流。write(b)与调用 write(b, 0, b.length) 的效果相同。publicvoidclose()throwsIOException关闭输出流并释放相关的系统资源。关闭的流不能再执行输出操作,也不能重新打开。3.4response隐含对象隐含对象【例3-6】用response把ROOTd.zip文件传送回客户端。操作步骤如下:(1)新建JSP文件exam310.jsp。(2)在代码窗口输入以下代码:3.4response隐含对象隐含对象(3) 新建JSP文件downError.jsp,输入一些下载出错提示文字。保存文档并关闭。(4) 预览 (5)文件出错实验。3.4response隐含对象隐含对象2.文本文件的下载文本文件的下载文本文件下载时用的是字符流,而不是字节流。首先取得源文件的字符输入流对象,用java.io.FileReader类封装,再把FileReader对象封装为java.io.BufferedReader,以方便从文本文件中一次读取一行。字符输出流直接用JSP的隐含对象out,out能够输出字符数据。 3.4response隐含对象隐含对象FileReader类的基本用法有:publicFileReader(StringfileName)throwsFileNotFoundException构造方法,取得文件的字符输入流对象,形参是文件的路径和文件名,路径分隔符用“/”或“”。如果打开文件出错,会引发一个异常。3.4response隐含对象隐含对象BufferedReader的主要用法有:publicBufferedReader(Readerin)构造方法,形参是字符输入流对象。publicStringreadLine()throwsIOException3.4response隐含对象隐含对象【例3-7】用JSP下载ROOTee.txt文件。操作步骤如下:(1)新建JSP文件exam311.jsp。(2)在代码视图输入以下代码:3.4response隐含对象隐含对象(3)预览。(4)容错测试。(5)其它问题。3.5 application隐含对象 3.5.1用用application访访问问Web应应用用的的初初始始参参数数Tomcat启动时,会自动加载合法的Web应用。在Web.xml文件中,定义一些全局的初始化参数,让Tomcat在启动Web应用时自动加载到Servlet容器中, Web应用中的Servlet程序通过访问Servlet容器获得这些全局初始化参数。 3.5 application隐含对象1、Web应用初始化参数的定义应用初始化参数的定义Web应用初始化参数是在Web应用的部署文件WEB-INFweb.xml中定义,基本语法格式为:3.5 application隐含对象例如,如果要定义三个初始化参数:DBLoginName=user1、DBLoginPassword=123和msg=/msg.properties,相关的代码为: 3.5 application隐含对象2、读取、读取Web应用的初始化参数应用的初始化参数读取Web应用中的初始化参数,要用到的方法有:public java.util.Enumeration getInitParameterNames()。返回初始化参数的变量名,并存储在枚举型对象中,如果没有初始化参数,则返回null。public java.lang.String getInitParameter(java.lang.String name)。方法的形参是初始化参数的变量名,方法返回指定变量名的初始化参数值。3.5 application隐含对象例如,要读取上述定义的三个初始化参数,相关的代码如下:3.5 application隐含对象3.5.2application作用范围变量作用范围变量application作用范围变量能够被作用范围变量能够被Web应用应用中的所有程序共享。中的所有程序共享。application对象提供对象提供的存储方法主要有:的存储方法主要有:1、publicjava.util.EnumerationgetAttributeNames()返回当前上下文中所有可用的返回当前上下文中所有可用的appliaction作用范围变量名,并存储在枚举型对象中。作用范围变量名,并存储在枚举型对象中。3.5 application隐含对象2、publicjava.lang.ObjectgetAttribute(java.lang.Stringname)从从application作用范围中读取指定名字的属作用范围中读取指定名字的属性值,返回的属性值是性值,返回的属性值是Object类型,一般要类型,一般要进行强制类型转换,还原其原本数据类型。进行强制类型转换,还原其原本数据类型。如果指定的属性值对象不存在,则返回如果指定的属性值对象不存在,则返回null。 3.5 application隐含对象以下代码段是遍历当前Web应用中所有的application属性:3.5 application隐含对象3、publicvoidsetAttribute(java.lang.Stringname,java.lang.Objectobject)把一个属性写入application作用范围。第一个形参name是属性名,第二个形参object是属性值,它是一个Java对象。如果属性值object为null,则相当于删除一个属性名为name的属性。如果容器中已经存在指定名字的属性,写入操作会用当前的属性值替换原有的属性值。3.5 application隐含对象4、publicvoidremoveAttribute(java.lang.Stringname)从Servlet容器中删除指定名字的属性。形参是属性名,字符串形式。3.5 application隐含对象【例3-8】用application实现一个简单的站点计数器,当访问JSP页面时,页面进行访问次数统计,并打印当前计数值。操作步骤如下:(1)新建JSP文件exam308.jsp。(2)在标记中录入如下代码:3.5 application隐含对象3.5 application隐含对象(3)启动Tomcat,预览exam308.jsp,出现访问计数值。另打开一个IE窗口,在地址栏中输入访问URL:http:/127.0.0.1:8080/exam308.jsp,发现计数值加1。两个IE窗口表示当前有两个客户端,存储在Servlet容器中的application属性能被Web应用中所有的Servlet程序所共享,计数值会累加。(4)重启Tomcat,再访问exam308.jsp,发现计数从1开始计数。application属性是存储在Servlet容器中(内存中),关闭Tomcat会导致application属性丢失,所以计数器重新计数。3.5 application隐含对象3.5.3用用application对象读取对象读取Servlet容器信息容器信息pplication对象可以读取对象可以读取Servlet容器的系统信息,容器的系统信息,相关方法如下:相关方法如下:1、publicintgetMajorVersion()返回返回Servlet容器支持的容器支持的ServletAPI的主版本号。的主版本号。2、publicintgetMinorVersion()返回返回Servlet容器支持的容器支持的ServletAPI子版本号,对子版本号,对于于Servlet2.4,子版本号为,子版本号为4,故方法返回,故方法返回4。3、publicjava.lang.StringgetServerInfo()返回当前返回当前Servlet容器的名字与版本号。对于容器的名字与版本号。对于Tomcat5.5.17,返回值为:,返回值为:ApacheTomcat/5.5.17。3.5 application隐含对象 3.5.4用用application记录操作日志记录操作日志 Servlet程序运行过程中如果需要把一些信程序运行过程中如果需要把一些信息记录在日志文件中,一个可行的方法是使息记录在日志文件中,一个可行的方法是使用用application中的方法。中的方法。1、publicvoidlog(java.lang.Stringmsg)形参是待记录的日志信息。例如:形参是待记录的日志信息。例如: 3.5 application隐含对象3.5 application隐含对象2、publicvoidlog(java.lang.Stringmessage,java.lang.Throwablethrowable)这个方法用于记录日志信息及异常堆栈信息。第一个形参是用户自定义的日志信息,第二个是异常对象。例如:3.5 application隐含对象3.5.5application的其它应用的其它应用取得目标资源的取得目标资源的RequestDispatcher对象对象用用application对象取得目标资源的对象取得目标资源的RequestDispatcher对象的语法为:对象的语法为:publicRequestDispatchergetRequestDispatcher(java.lang.Stringpath)3.5 application隐含对象形参是目标资源的URI,要以“/”开头,表示是绝对路径,如果无法取得RequestDispatcher对象,则返回null。例如:3.5 application隐含对象2、publicjava.lang.StringgetMimeType(java.lang.Stringfile)返回指定文件的MIME-type,这些MIME-type由Servlet容器定义,如果文件的MIME-type未知,则返回null。例如,在ROOT文件夹下分别建立三个名为d.doc、d.xls、d.zip的空文件,用以下代码查询文件的MIME-type:3.5 application隐含对象3.5 application隐含对象预览后运行结果为:3.5 application隐含对象3、publicjava.lang.StringgetRealPath(java.lang.Stringpath)返回虚拟目录对应的真实绝对路径,例如:运行结果为运行结果为“C:tomcatwebappsROOT”。3.5 application隐含对象4、publicjava.io.InputStreamgetResourceAsStream(java.lang.Stringpath)取得目标资源的输入流对象。目标资源可以是任意文件类型,任意长度。例如:3.6session隐含对象隐含对象session是指一个终端用户与后台某交互式系统进行通信的时间间隔,通常把从登录进入系统到注销退出系统之间所经历的时间,称为一次session通信周期。 如何把一个操作步中产生的有用信息保存下来,供后续的操作步使用,以及如何标识当前session通信等,这些问题称之为session跟踪(Session Tracking)问题。 3.6session隐含对象隐含对象3.6.1用用URL重写实现重写实现session跟踪跟踪URL重写(URL Rewriting)就是把session数据编码成“name=value”对,当作URL的查询串附在URL后,用带有查询串的URL访问下一个目标资源时,附在URL查询串中的session数据自然被传送给下一页。 3.6session隐含对象隐含对象例如,当前的a.jsp页面中程序产生了一个session数据“status=90”,现要重定向至http:/127.0.0.1:8080/k.jsp,并且k.jsp要用到“status=90”这个session数据,则新的URL应该为:http:/127.0.0.1:8080/k.jsp?status=903.6session隐含对象隐含对象在a.jsp中产生此URL的代码为:3.6session隐含对象隐含对象【例3-9】写一个简单的登录页面exam312.jsp,效果如图3-1、3-2示。图3-1图3-23.6session隐含对象隐含对象(1)新建JSP文件exam312.jsp。(2)在设计视图中制作出如图3-1示的表单,用户名文本域的名字为“userName”,口令文本域的名字为“pw”,类型取值为“密码”,整个表单提交给exam313.jsp。(3)切换至代码视图,在标记前一行录入如下代码,实现登录验证和重定向 3.6session隐含对象隐含对象3.6session隐含对象隐含对象(4)新建JSP文件exam313.jsp,在标记中录入以下代码,实现session信息的读取与验证,并动态生成十个超链接。3.6session隐含对象隐含对象(5)启动Tomcat,预览exam312.jsp,输入几个非法用户名或口令,均无法成功登录,输入tom/123后,登录成功,并转至exam313.jsp。在exam313.jsp中,单击10个超链接,发现URL上均带有两个session数据。3.6session隐含对象隐含对象3.6.2用用cookie实现实现session跟踪跟踪用cookie实现session跟踪的基本原理是:把一个session数据封装在一个cookie对象中,将cookie对象传回客户端存储,需要用到时用代码从客户端读回。 【例3-10】题目同【例3-9】,此处要求用cookie保存用户成功登录的session数据“name=tom”。只需要修改exam312.jsp和exam313.jsp中的代码即可。(1)对对exam312.jsp,只需要修改它的,只需要修改它的JSP代码,修改后如下:代码,修改后如下:(2)对对exam313.jsp,只需要修改它的,只需要修改它的JSP代码,修改后如下:代码,修改后如下:3.6session隐含对象隐含对象(3)exam312.jsp,效果同【例3-9】。(4)安全性检验。在【例3-9】,不需要在exam312.jsp页面上登录,在浏览器地址栏中直接手工输入URL:http:/127.0.0.1:8080/exam313.jsp?name=dd就能直接访问exam313.jsp。在本例中,也直接输入此URL后,发现被重定向至登录页,无法通过浏览器地址栏直接访问。此时cookie数据“name=tom”保存在浏览器内存中,不是保存在URL的查询串中,所以数据安全性有所提高。 3.6session隐含对象隐含对象3.6.3用隐藏表单域实现用隐藏表单域实现session跟踪跟踪隐藏表单域在页面上不可视,它相当于一个变量, 如果把一个session数据存储在其中,则提交表单时,隐藏表单域中的数据也会被提交给服务器。 3.6session隐含对象隐含对象【例3-11】设计一个exam314.jsp页面实现猜数游戏,如图3-3示。首次启动页面时,exam314.jsp产生一个0100间的整数让用户猜。用户在表单中输入数据,提交后页面判断是否正确,如果猜小了或猜大了则给出提示,如果猜中,则显示目标数据和用户输入的数据。页面还显示用户总共猜了多少次。3.6session隐含对象隐含对象3.6session隐含对象隐含对象操作步骤如下:(1)新建JSP文件exam314.jsp。(2)切换到代码视图,找到标记,在它前面输入如下代码:3.6session隐含对象隐含对象(3)启动Tomcat,预览本页,出现了图3-3中的猜数游戏,实现了用隐藏表单域保存session数据。以上操作录相请参考电子资源包democh3exam311.exe文件。隐藏域有一定的安全缺陷,例如在本例中,预览页面后,使用IE浏览器的菜单【查看】【源文件】,可查看到隐藏表单域的HTML代码及其取值。3.6session隐含对象隐含对象3.6.4session作用范围变量与作用范围变量与session跟踪跟踪session隐含对象是实现session跟踪最直接的方法。session隐含对象由Web服务器创建,并存储在服务器端,功能强大,在后续的学习中,提到“session”时,如果不特别说明,就是指session对象。session作用范围变量也叫session属性。 3.6session隐含对象隐含对象1、publicbooleanisNew()判断session对象是新创建的,还是已经存在。返回true时,表示session对象是刚创建的,也表示本次客户端发出的请求是本次session通信的第一次请求。这个方法返回true,并不表示客户端浏览器窗口是新打开的 3.6session隐含对象隐含对象【例3-12】在【例3-8】中我们设计了一个站点计数器,但这个计数存在一个缺陷,当刷新当前IE窗口时,计数器的值会增加,这是不合理的。现在用session.isNew()来修订这个缺陷,防止刷新窗口时计数值增加。原理是:isNew()方法返回true值时,表示这是一次新的访问,此时允许计数器加1计数。【例3-8】中的代码修改如下:3.6session隐含对象隐含对象2、publicjava.lang.StringgetId()返回当前session对象的ID号。【例3-13】通过session对象的ID号理解JSP服务器识别session客户端的方法。操作步骤如下:(1)新建JSP文件exam315.jsp。(2)在中输入以下代码:(3)启动Tomcat,打开两个IE浏览器窗口,分别预览exam315.jsp,浏览器上显示的一串字符串就是随机生成的session ID号,两个浏览器窗口中显示的ID号均不相同。说明在JSP中,不同的浏览器窗口表示不同的客户端。3.6session隐含对象隐含对象3、publiclonggetLastAccessedTime()返回客户端最后一次请求的发送时间,是一个long型的整数,单位毫秒,是从格林威治时间1970-1-1 00:00:00到当前所经历的毫秒数。例如,以下代码取得session通信中最后一次请求时间:3.6session隐含对象隐含对象4、publicvoidinvalidate()使当前session无效,session作用范围变量也会随之丢失。5、publicvoidsetMaxInactiveInterval(intinterval)形参是一个整数,定义session对象的超时时间,单位秒。如果客户端从最后一次请求开始,在连续的interval秒内一直没有再向服务器发送HTTP请求,则服务器认为出现了session超时,将删除本次的session对象。如果超时时间为负数,表示永不超时。session对象的超时检测由服务器实现,这会增加系统开销。Tomcat默认的超时时间是30分钟。3.6session隐含对象隐含对象6、publicintgetMaxInactiveInterval()读取当前的session超时时间,单位秒。7、publicvoidsetAttribute(java.lang.Stringname,java.lang.Objectvalue)定义session作用范围变量,第一个形参name是session作用范围变量名,第二个形参value是session属性。如果value为null,则表示取消session属性和session的绑定关系。 3.6session隐含对象隐含对象例如3.6session隐含对象隐含对象8、publicjava.lang.ObjectgetAttribute(java.lang.Stringname)读取一个session作用范围变量,返回一个Object类型的对象,必要时要进行强制类型转换,如果找不到指定名字的数据对象,则返回null。例如:3.6session隐含对象隐含对象9、publicjava.util.EnumerationgetAttributeNames()将当前合法的所有session作用范围变量名读到一个枚举型对象中。10、publicvoidremoveAttribute(java.lang.Stringname)解除指定名字的数据对象与session的绑定关系,即删除一个指定名字的session属性。3.6session隐含对象隐含对象【例3-14】用session保存【例3-9】中登录成功的信息。操作步骤如下:(1)修改exam312.jsp中的代码,修改后如下: (2)修改修改exam313.jsp的代码,修改后如下:的代码,修改后如下:3.6session隐含对象隐含对象11、session失效的主要原因失效的主要原因session对象是有生命期的,生命期结束,则session对象被删除,与之绑定的session作用范围变量也随之丢失。影响session对象生命期的主要因素有:客户端浏览器窗口关闭。一般是用户主动结束session。服务器关闭。session对象存在服务器内存中,关闭服务器会直接导致session对象丢失。session超时。用户从最后一次请求开始,在指定的时间内若未向服务器发出过HTTP请求,会导致session超时,服务器发现超时后,会删除超时的session对象。程序主动结束session。程序调用session.invalidate()等结束session。3.6session隐含对象隐含对象3.6.5动态生成验证码动态生成验证码在登录应用中,为防止恶意登录,常常需要服务器动态生成验证码并存储在session作用范围中,最后以图像形式返回给客户端显示。【例3-15】写一个JSP页,动态生成一个验证码,存储在session作用范围内,并以图像形式返回给客户端显示。另写一个JSP页面,引用此JSP页面生成的验证码。操作步骤如下:(1)新建JSP文件authen.jsp,在代码视图输入以下代码:3.6session隐含对象隐含对象 (2)新建JSP文件test.jsp,在间输入以下调用验证码页面的代码:(3)启动启动Tomcat,预览,预览test.jsp页,页面显示了生成的验证码。页,页面显示了生成的验证码。3.7其它其它JSP隐含对象隐含对象3.7.1config隐含对象隐含对象config隐含对象是javax.servlet.ServletConfig类型的,常用于给一个Servlet程序传送初始化参数。如果将JSP页面当作Servlet程序用,需要在ROOTweb.xml中写出部署信息。 例如,把a.jsp当作URL名为“/go”的Servlet程序用,在web.xml中的部署信息为: 3.7其它其它JSP隐含对象隐含对象在JSP页面中读取中定义的初始化参数要用到config隐含对象。config对象中关键的方法有:publicjava.lang.StringgetInitParameter(java.lang.Stringname)形参为初始化参数名,本例中是“loginName”,返回初始化参数值,本例中是“tom”。如果找不到指定的初始化参数,则返回null。3.7其它其它JSP隐含对象隐含对象publicjava.util.EnumerationgetInitParameterNames()读取所有的初始化参数名并存于枚举型对象中。要在本例的a.jsp中打印所有初始化参数值,代码为:3.7其它其它JSP隐含对象隐含对象3.7其它其它JSP隐含对象隐含对象预览后显示:3.7其它其它JSP隐含对象隐含对象3.7.2exception隐含对象隐含对象JSP页页面面在在运运行行时时发发生生异异常常,系系统统会会生生成成一一个个异异常常对对象象,把把相相关关的的运运行行时时异异常常信信息息封封装装在在异异常常对对象象中中,这这个个异异常常对对象象被被传传递递给给异异常常处理页作进一步处理。处理页作进一步处理。 exception隐含对象是java.lang.Throwable类型的,Throwable是Java中所有异常类的父类,Throwable中关键的方法有: 3.7其它其它JSP隐含对象隐含对象publicStackTraceElementgetStackTrace()这个方法返回堆栈跟踪元素的数组,每个元素表示一个堆栈帧。数组的第零号元素(假定数据的长度为非零)表示堆栈顶部,堆栈顶部的帧表示生成堆栈跟踪的执行点,异常信息一般是通过访问数组的零号元素而得。3.7其它其它JSP隐含对象隐含对象StackTraceElement类中常用的方法有:public String getClassName()返回发生异常的类名。public String getMethodName()返回发生异常的方法名。public String getFileName()返回发生异常的文件名。public int getLineNumber()返回异常发生点在*.java源码文件中的行号。3.7其它其它JSP隐含对象隐含对象3.7.3page隐含对象隐含对象JSP页面会被翻译成Servlet程序运行,最终会以一个“对象”的身份运行在JVM中,page对象表示“当前”Servlet程序对象,相当于Java中的“this”关键字。3.7其它其它JSP隐含对象隐含对象3.7.4pageContext隐含对象隐含对象pageContext对对象象是是javax.servlet.jsp.PageContext类类型型的的,在在JSP页页面面的的Servlet实实现现类类中中调调用用JspFactory.getPageContext()取取得得一一个个PageContext对对象象。PageContext中常用的方法有:中常用的方法有: 3.7其它其它JSP隐含对象隐含对象1、获得其它隐含对象、获得其它隐含对象调用pageContext对象中的getException()、getPage() 、getRequest()、getResponse()、 getSession()和getServletConfig()方法可获得相应的JSP隐含对象。 3.7其它其它JSP隐含对象隐含对象例如,在JSP页面的Servlet实现类中,发现如下的初始化操作:3.7其它其它JSP隐含对象隐含对象2、实现转发跳转或包含、实现转发跳转或包含实现转发跳转的方法为:3.7其它其它JSP隐含对象隐含对象relativeUrlPath为目标资源的URI,例如,在a.jsp中有以下代码:3.7其它其它JSP隐含对象隐含对象在b.jsp中读取request属性的代码为: 3.7其它其它JSP隐含对象隐含对象实现包含的方法为:3.7其它其它JSP隐含对象隐含对象例如,在a.jsp中有以下代码:3.7其它其它JSP隐含对象隐含对象在b.jsp中读取属性的代码为:
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号