版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课题课题 JSP/ServLet编程技巧编程技巧 目的要求目的要求 掌握掌握JSP/ServLet编程技巧编程技巧 教学重点教学重点JSP与与ServLet编程中的编程中的Cookie处理、处理、在在servlet的的init()方法中缓存数据等技巧方法中缓存数据等技巧教学难点教学难点 applet 与与servlet通信通信教学课时教学课时 4(含(含2课时上机)课时上机)教学方法教学方法 讲解、示例与启发式教学相结合讲解、示例与启发式教学相结合教学内容和步骤教学内容和步骤15.1 JSP/ServLet编程技巧编程技巧15.1.1 用用JSP操作操作CookieCookie应该是一种应用较
2、久的技术了。早在应该是一种应用较久的技术了。早在HTML刚刚刚出现的时候,在每个独立的页面之间没有办法记录和刚出现的时候,在每个独立的页面之间没有办法记录和标识不同的用户。后来人们就发明了标识不同的用户。后来人们就发明了Cookie技术,当用技术,当用户访问网页时,它能够在访问者的机器上创立一个文件,户访问网页时,它能够在访问者的机器上创立一个文件,我们把它叫作我们把它叫作Cookie,写一段内容进去,来标识不同的,写一段内容进去,来标识不同的用户。如果下次用户再访问这个网页的时候,它又能够用户。如果下次用户再访问这个网页的时候,它又能够读出这个文件里面的内容,这样网页就知道上次这个用读出这个
3、文件里面的内容,这样网页就知道上次这个用户已经访问过该网页了。户已经访问过该网页了。 虽然现在网页的制作技术比起虽然现在网页的制作技术比起几年以前已经发展了许多。不过有些时候,几年以前已经发展了许多。不过有些时候,Cookie还是还是能够帮我们很多忙的。接下来,我们就来看看,如何在能够帮我们很多忙的。接下来,我们就来看看,如何在写写JSP文件的时候,用文件的时候,用JSP操作操作Cookie。 写入写入Cookie 其实用其实用JSP操作操作Cookie是非常简单的,我们来看是非常简单的,我们来看下面一段下面一段JSP程序:程序: 例例1:.(中间略中间略) .(其他内容其他内容) 这样我们就
4、设置了一个这样我们就设置了一个Cookie,很简单吧?,很简单吧? 我们来仔细研究一下这段代码:我们来仔细研究一下这段代码: Cookie cookie=new Cookie(cookieName, Test_Content); 这一行建立了一个这一行建立了一个Cookie对象,初始化有两个参数,对象,初始化有两个参数,第一个参数第一个参数cookieName定义了定义了Cookie的名字,后一个参的名字,后一个参数,也是一个字符串,定义了数,也是一个字符串,定义了Cookie的内容。也就是我们的内容。也就是我们希望网页在用户的机器上标识的文件内容。希望网页在用户的机器上标识的文件内容。 接下
5、来一行:接下来一行:cookie.setMaxAge(10),调用了,调用了Cookie中的中的setMaxAge方法,设定方法,设定Cookie在用户机器硬盘上的存活期为在用户机器硬盘上的存活期为10秒。秒。一个一个Cookie在用户的硬盘里面存在的时间并不是无限期的,在用户的硬盘里面存在的时间并不是无限期的,在建立在建立Cookie对象的时候,我们必须制定对象的时候,我们必须制定Cookie的存活的存活期,超过了这个存活期后,期,超过了这个存活期后,Cookie文件就不再起作用,会文件就不再起作用,会被用户的浏览器自行删除。如果我们希望用户在下次访问被用户的浏览器自行删除。如果我们希望用户
6、在下次访问这个页面的时候,这个页面的时候,Cookie文件仍然有效而且可以被网页读文件仍然有效而且可以被网页读出来的话,我们可以将出来的话,我们可以将Cookie的存活期设得稍微长一些。的存活期设得稍微长一些。比如比如cookie.setMaxAge(365*24*60*60)可以让可以让Cookie文文件在一年内有效。件在一年内有效。 读出读出Cookie Cookie文件创建好后,自然还需要我们把它读文件创建好后,自然还需要我们把它读出来,否则我们不是白费力气吗?接下来我们看看如出来,否则我们不是白费力气吗?接下来我们看看如何读出在用户硬盘上的何读出在用户硬盘上的Cookie。 例例2:
7、.(中间略中间略) Namevalue % Cookie cookies=request.getCookies();Cookie sCookie=null; Sing svalue=null; Sing sname=null; for(int i=0;i .(其他内容其他内容) 这一小段这一小段JSP文件可以读出用户硬盘上的所有有效文件可以读出用户硬盘上的所有有效的的Cookie,也就是仍然在存活期内的,也就是仍然在存活期内的Cookie文件。并文件。并用表格的形式列出每个用表格的形式列出每个Cookie的名字和内容。的名字和内容。 我们来逐行分析一下这段代码:我们来逐行分析一下这段代码: C
8、ookie cookies=request.getCookies() 我们用我们用request.getCookies()读出用户硬盘上的读出用户硬盘上的Cookie,并将,并将所有的所有的Cookie放到一个放到一个cookie对象数组里面。对象数组里面。 接下来我们用一个循环语句遍历刚才建立的接下来我们用一个循环语句遍历刚才建立的Cookie对象对象数组,我们用数组,我们用sCookie=cookiesi取出数组中的一个取出数组中的一个Cookie对象,然后我们用对象,然后我们用sCookie.getValue()和和sCookie.getName()两个方法来取得这个两个方法来取得这个C
9、ookie的名字和的名字和内容。内容。 通过将取出来的通过将取出来的Cookie的名字和内容放在字符串变的名字和内容放在字符串变量中,我们就能对其进行各种操作了。在上面的例子里,可量中,我们就能对其进行各种操作了。在上面的例子里,可通过循环语句的遍历,将所有通过循环语句的遍历,将所有Cookie放在一张表格中进行放在一张表格中进行显示。显示。 需要注意的一些问题需要注意的一些问题 通过上面两个简单的例子,可以看到,用通过上面两个简单的例子,可以看到,用JSP进行进行Cookie的操作,是非常简单的。不过我们在实际操作中还的操作,是非常简单的。不过我们在实际操作中还要注意一些问题:要注意一些问题
10、: Cookie的兼容性问题的兼容性问题 Cookie的格式有的格式有2个不同的版本,第一个版本,我们个不同的版本,第一个版本,我们称为称为Cookie Version 0,是最初由,是最初由Netscape公司制定的,公司制定的,也被几乎所有的浏览器支持。而较新的版本,也被几乎所有的浏览器支持。而较新的版本,Cookie Version 1,则是根据,则是根据RFC 2109文档制定的。为了确保兼容文档制定的。为了确保兼容性,性,JAVA规定,前面所提到的涉及规定,前面所提到的涉及Cookie的操作都是针对的操作都是针对旧版本的旧版本的Cookie进行的。而新版本的进行的。而新版本的Cook
11、ie目前还不被目前还不被Javax.servlet.http.Cookie包所支持。包所支持。 Cookie的内容的内容 同样的同样的Cookie的内容的字符限制针对不同的的内容的字符限制针对不同的Cookie版版本也有不同。在本也有不同。在Cookie Version 0中,某些特殊的字符,中,某些特殊的字符,例如:空格,方括号,圆括号,等于号(例如:空格,方括号,圆括号,等于号(=),逗号,双引),逗号,双引号,斜杠,问号,号,斜杠,问号,符号,冒号,分号都不能作为符号,冒号,分号都不能作为Cookie的内容。这也就是为什么我们在例子中设定的内容。这也就是为什么我们在例子中设定Cookie
12、的内容的内容为为“Test_Content”的原因。的原因。15.1.2 在在JSP中获得中获得Application对象对象getServletContext().setAttribute(counter,new foo.Counter();15.1.3 在在JSP中处理中处理On Appliction Start和和On Sessio Start事件事件 (1) 可以使用可以使用HttpSessinBindingListener类:类:/添加添加sessionsession.putValue(bindings.listener,new MyListener(getServletContex
13、t();/定义定义MyListener类类import javax.servlet.http.*; import javax.servlet.*; public class MyListener implements HttpSessionBindingListener SerletContext context; pullic ODSessionListener(ServletContent context)this.context=context; public void valueBound(HttpSessionBindingEvent event) /called when this
14、 class is putputValue into the session public void valueUnbound(HttpSessionBindingEvent event) /called when this class is removedremoveValue or invalidate from the session (2) 在在JRUN中,可以使用中,可以使用global,jsa文件文件(类似于类似于ASP中的中的global.asa文件文件),在该文件中处理,在该文件中处理application和和session的的初始化和结束事件,支持初始化和结束事件,支持app
15、licationInit(),seeionInit(),applicationDestroy(),sessionDestroy()等方法。等方法。15.1.4 获取获取JSP源文件最后修改的日期源文件最后修改的日期15.1.5 获取获取JSP、Servlet Enginr信息信息/ServletString thisServer=getServletConfig().getServletContext().getServerInfo();/JSP15.1.6 在在servlet的的init()方法中缓存数据方法中缓存数据 当应用服务器初始化当应用服务器初始化servlet实例之后,为客户端请求
16、实例之后,为客户端请求提供服务之前,它会调用这个提供服务之前,它会调用这个servlet的的init()方法。在一方法。在一个个servlet的生命周期中,的生命周期中,init()方法只会被调用一次。通方法只会被调用一次。通过在过在init()方法中缓存一些静态的数据或完成一些只需要执方法中缓存一些静态的数据或完成一些只需要执行一次的、耗时的操作,就可大大地提高系统性能。行一次的、耗时的操作,就可大大地提高系统性能。例如,通过在例如,通过在init()方法中建立一个方法中建立一个JDBC连接池是连接池是一个最佳例子,假设我们是用一个最佳例子,假设我们是用jdbc2.0的的DataSource
17、接口来取得数据库连接,在通常的情况下,我们需要接口来取得数据库连接,在通常的情况下,我们需要通过通过JNDI来取得具体的数据源。我们可以想象在一个来取得具体的数据源。我们可以想象在一个具体的应用中,如果每次具体的应用中,如果每次SQL请求都要执行一次请求都要执行一次JNDI查询的话,那系统性能将会急剧下降。解决方法是如查询的话,那系统性能将会急剧下降。解决方法是如下代码,它通过缓存下代码,它通过缓存DataSource,使得下一次,使得下一次SQL调调用时仍然可以继续利用它:用时仍然可以继续利用它: 例例3:public class ControllerServlet extends Http
18、Servletprivate javax.sql.DataSource testDS = null; public void init(ServletConfig config) throws ServletExceptionsuper.init(config); Context ctx = null;Try ctx = new InitialContext();testDS = (javax.sql.DataSource)ctx.lookup(jdbc/testDS);catch(NamingException ne)ne.printStackTrace(); catch(Exception
19、 e)e.printStackTrace();public javax.sql.DataSource getTestDS()return testDS;. 15.1.7 禁止禁止servlet和和JSP 自动重载自动重载(auto-reloading)Servlet/JSP提供了一个实用的技术,即自动重载提供了一个实用的技术,即自动重载技术,它为开发人员提供了一个好的开发环境,当你技术,它为开发人员提供了一个好的开发环境,当你改变改变servlet和和JSP页面后而不必重启应用服务器。然页面后而不必重启应用服务器。然而,这种技术在产品运行阶段对系统的资源是一个极而,这种技术在产品运行阶段对系统
20、的资源是一个极大的损耗,因为它会给大的损耗,因为它会给JSP引擎的类装载器引擎的类装载器(classloader)带来极大的负担。因此关闭自动重载功带来极大的负担。因此关闭自动重载功能对系统性能的提升是一个极大的帮助。能对系统性能的提升是一个极大的帮助。15.1.8 将页面输出进行压缩将页面输出进行压缩 压缩是解决数据冗余的一个好的方法,特别是在网压缩是解决数据冗余的一个好的方法,特别是在网络带宽不够发达的今天。有的浏览器支持络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)进行来对进行来对HTML文件进行压缩,这种方法可以戏剧性地文件进行压缩,这种方法可以戏剧性地减少减少HTML
21、文件的下载时间。因此,如果你将文件的下载时间。因此,如果你将servlet或或JSP页面生成的页面生成的HTML页面进行压缩的话,那用户就会觉页面进行压缩的话,那用户就会觉得页面浏览速度会非常快。但不幸的是,不是所有的浏得页面浏览速度会非常快。但不幸的是,不是所有的浏览器都支持览器都支持gzip压缩,但你可以通过在你的程序中检查压缩,但你可以通过在你的程序中检查客户的浏览器是否支持它。下面就是关于这种方法实现客户的浏览器是否支持它。下面就是关于这种方法实现的一个代码片段:的一个代码片段:例例4:public void doGet(HttpServletRequest request, Http
22、ServletResponse response)throws IOException, ServletException OutputStream out = nullString encoding = request.getHeader(Accept-Encoding); if (encoding != null & encoding.indexOf(gzip) != -1)request.setHeader(Content-Encoding , gzip);out = new GZIPOutputStream(request.getOutputStream();else if (enco
23、ding != null & encoding.indexOf(compress) != -1)request.setHeader(Content-Encoding , compress);out = new ZIPOutputStream(request.getOutputStream(); Elseout = request.getOutputStream();.15.1.9使用线程池使用线程池 应用服务器缺省地为每个不同的客户端请求创建一应用服务器缺省地为每个不同的客户端请求创建一个线程进行处理,并为它们分派个线程进行处理,并为它们分派service()方法,当方法,当service()
24、方法调用完成后,与之相应的线程也随之撤消。方法调用完成后,与之相应的线程也随之撤消。由于创建和撤消线程会耗费一定的系统资源,这种缺省由于创建和撤消线程会耗费一定的系统资源,这种缺省模式降低了系统的性能。但所幸的是我们可以通过创建模式降低了系统的性能。但所幸的是我们可以通过创建一个线程池来改变这种状况。另外,我们还要为这个线一个线程池来改变这种状况。另外,我们还要为这个线程池设置一个最小线程数和一个最大线程数。在应用服程池设置一个最小线程数和一个最大线程数。在应用服务器启动时,它会创建数量等于最小线程数的一个线程务器启动时,它会创建数量等于最小线程数的一个线程池,当客户有请求时,相应地从池从取出
25、一个线程来进池,当客户有请求时,相应地从池从取出一个线程来进行处理,当处理完成后,再将线程重新放入到池中。如行处理,当处理完成后,再将线程重新放入到池中。如果池中的线程不够地话,系统会自动地增加池中线程的果池中的线程不够地话,系统会自动地增加池中线程的数量,但总量不能超过最大线程数。通过使用线程池,数量,但总量不能超过最大线程数。通过使用线程池,当客户端请求急剧增加时,系统的负载就会呈现的平滑当客户端请求急剧增加时,系统的负载就会呈现的平滑的上升曲线,从而提高的系统的可伸缩性。的上升曲线,从而提高的系统的可伸缩性。15.1.10 选择正确的页面包含机制选择正确的页面包含机制 在在JSP中有两种
26、方法可以用来包含另一个页面:中有两种方法可以用来包含另一个页面: 使用使用include指示符指示符(% includee file=”test.jsp” %)。 使用使用jsp指示符指示符(jsp:include page=”test.jsp” flush=”true”/)。在实际中我发现,如果使用第一种。在实际中我发现,如果使用第一种方法的话,可以使得系统性能更高。方法的话,可以使得系统性能更高。 JSP的一个强大的地方就是对的一个强大的地方就是对javabean的支持。通的支持。通过在过在JSP页面中使用页面中使用jsp:useBean标签,可以将标签,可以将javabean直接插入到一
27、个直接插入到一个JSP页面中。它的使用方法页面中。它的使用方法如下:如下:jsp:useBean id=name scope=page|request|session|application class=package.className type=typeName/jsp:useBean 其中其中scope属性指出了这个属性指出了这个bean的生命周期。缺省的生的生命周期。缺省的生命周期为命周期为page。如果你没有正确地选择。如果你没有正确地选择bean的生命周期的生命周期的话,它将影响系统的性能。的话,它将影响系统的性能。举例来说,如果你只想在一次请求中使用某个举例来说,如果你只想在一次
28、请求中使用某个bean,但,但你却将这个你却将这个bean的生命周期设置成了的生命周期设置成了session,那当这次,那当这次请求结束后,这个请求结束后,这个bean将仍然保留在内存中,除非将仍然保留在内存中,除非session超时或用户关闭浏览器。这样会耗费一定的内存,超时或用户关闭浏览器。这样会耗费一定的内存,并无谓的增加了并无谓的增加了JVM垃圾收集器的工作量。因此为垃圾收集器的工作量。因此为bean设设置正确的生命周期,并在置正确的生命周期,并在bean的使命结束后尽快地清理它的使命结束后尽快地清理它们,会使用系统性能有一个提高。们,会使用系统性能有一个提高。 15.2 applet
29、 与与servlet通信通信 在在WEB开发中,我们假设有一个开发中,我们假设有一个applet要与要与server进行进行通信。这种情况经常存在,例如,通信。这种情况经常存在,例如,Java Web Server的的administrator applet用来管理整个用来管理整个 Web Server ,它在客,它在客户端的执行,却管理服务器。要完成这项工作,户端的执行,却管理服务器。要完成这项工作,applet和和server之间要建立一个连续的通信。再来看另外的一个例之间要建立一个连续的通信。再来看另外的一个例子,当今最流行的子,当今最流行的applet聊天室,一个客户发出的消息,聊天室
30、,一个客户发出的消息,其它的人都看得到。它们是怎么工作的呢?当然不是其它的人都看得到。它们是怎么工作的呢?当然不是applet与与applet通信,而是每个通信,而是每个applet把它的消息发送给一把它的消息发送给一个中央个中央server,中央,中央server负责把消息更新到每个客户端。负责把消息更新到每个客户端。还有,我们假设用一个还有,我们假设用一个applet来显示一系列的股票的价格来显示一系列的股票的价格并提供一个连续(实时)的更新,还有更重要的是,并提供一个连续(实时)的更新,还有更重要的是,applet怎么知道股票的价格发生了变化,答案是它和它的怎么知道股票的价格发生了变化,
31、答案是它和它的服务器进行的通信。服务器进行的通信。15.2.1 applet 与与server通信的几种方式通信的几种方式applet有两种方式,有两种方式,trusted 和和untrusted,它们的主要,它们的主要不同是不同是untrusted applet 在在SecurityManger管理下运行,管理下运行,它不能向客户端的文件系统中写入内容,也不能访问系它不能向客户端的文件系统中写入内容,也不能访问系统的特定的属性、接受新的连接请求、建立到除统的特定的属性、接受新的连接请求、建立到除server外的其它外的其它socket等。等。通常我们说的通常我们说的applet与与servl
32、et 的通信指的是的通信指的是untrusted的的 applet。概括来讲,。概括来讲,applet与与server 的通信有以下几的通信有以下几种方式:种方式: HTTP :用:用applet和服务器上的和服务器上的CGI程序建立一个程序建立一个HTTP连接,在这种通信方式中,连接,在这种通信方式中,applet像一个浏览器,像一个浏览器,请求一个页面,并分析服务器的响应来为请求一个页面,并分析服务器的响应来为applet使用。使用。applet可以用可以用POST方法向服务器提供信息也能接收服方法向服务器提供信息也能接收服务器在返回的页面中的信息。务器在返回的页面中的信息。 套接口(套接
33、口(socket):):applet可以在没有可以在没有HTTP服务服务的的server的机器上建立一个原始的套接口连接来实现的机器上建立一个原始的套接口连接来实现applet-server通信。通信。server 在特定的端口监听,用它在特定的端口监听,用它们特定的协议进行通信。们特定的协议进行通信。 servlet和对象串行化和对象串行化java servlet 和对象串行化技术是一种新的和对象串行化技术是一种新的applet-server通信技术。通信技术。Servlet正在取代运行速度较慢的正在取代运行速度较慢的CGI程序,提高基于程序,提高基于HTTP的的applet-server通
34、信的效果,使通信的效果,使经常发生经常发生applet-server通信变的可能。虽然通常通信变的可能。虽然通常applet和和servlet为每一个为每一个request和和response建立连接仍需要建立连接仍需要时间,但是,时间,但是,applet不需要等待不需要等待CGI程序运行来再来处理程序运行来再来处理request的时间。的时间。Java的对象串行化简化了有关格式化的对象串行化简化了有关格式化response的问题。的问题。由于由于servlet和和applet都是用都是用java写的,很自然的它们之写的,很自然的它们之间的通信可以通过交换间的通信可以通过交换java 对象来实
35、现。对象来实现。 JDBC、RMI、CORBAJDBC(Java DataBase Connectivity )API,允允许许java程序访问本机或其它机器上相关的数据库。程序访问本机或其它机器上相关的数据库。JDBC允许允许applet直接访问数据库,而不通过直接访问数据库,而不通过applet-servlet 方式。但是方式。但是applet通过通过servlet来访来访问数据库比直接访问数据库更具有优势。问数据库比直接访问数据库更具有优势。RMI(Remote Method Invocation)API ,允许允许applet调用服务器上运行的调用服务器上运行的java 对象的方法,在
36、某对象的方法,在某些情况下,它也允许服务器调用些情况下,它也允许服务器调用applet的方法的方法15.2.2 applet与与servlet通信示例通信示例 applet与与servlet通过普通通过普通HTTP方式通信方式通信例例5:略略 通过通过HTTP对象串行化方式通信对象串行化方式通信例例6:略略 通过套接口直接传递参数和传递对象(对象通过套接口直接传递参数和传递对象(对象串行化)串行化)作业作业 :自编:自编JSP代码完成在客户端硬盘上建立与读代码完成在客户端硬盘上建立与读取取COOKIE的程序。的程序。:将例:将例3代码补充完整并上机调试运行。代码补充完整并上机调试运行。教学总结
37、:教学总结:上机实验十五:上机实验十五:JSP/ServLet编程技巧(编程技巧(2课时)课时)一、实验目的及要求一、实验目的及要求1掌握掌握JSP/ServLet中的关于中的关于COOKIE的使用技巧的使用技巧2掌握在掌握在servlet的的init()方法中缓存数据等技巧方法中缓存数据等技巧3掌握掌握applet 与与ServLet通过通过HTTP通信的技巧通信的技巧二、实验环境二、实验环境Myeclipse、Tomcat、JDK三、实验内容三、实验内容1. 给定如下代码,请上机调试运行:给定如下代码,请上机调试运行:DaytimeServlet.javaimport java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论