Presentation is loading. Please wait.

Presentation is loading. Please wait.

第4章 Servlet、过滤器与侦听器.

Similar presentations


Presentation on theme: "第4章 Servlet、过滤器与侦听器."— Presentation transcript:

1 第4章 Servlet、过滤器与侦听器

2 本章主要内容 Servlet 2.4 API的基本构成 Servlet生命周期及编程方法 Servlet程序实现session跟踪的方法
过滤器和侦听器

3 4.1 Servlet包的构成与Servlet生命周期
Servlet是Java服务器端的小程序,是Java环境下实现动态网页的基本技术。 Servlet程序能够调用JavaBean、JDBC、其它Servlet、RMI、EJB、SOAP和JNI等程序完成指定的功能,计算结果以HTML/XML等形式返回给客户端。 在应用中,Servlet起到中间层的作用,将客户端和后台的资源隔离开来。Servlet的API类主要放在javax.servlet和javax.servlet.http这两个包中。

4

5 4.1 Servlet包的构成与Servlet生命周期
一、GenericServlet抽象类 GenericServlet抽象类定义了一个与协议无关的通用Servlet程序,其中最关键的方法有: 1、service() Public abstract void service(ServletRequest request, ServletResponse response)throws ServletException, java.io.IOException 形参中的request和response对象是ServletRequest和ServletResponse类型的,强制类型转换为HttpServletRequest和HttpServletResponse类型后,对象的作用和用法同JSP隐含对象中的request和response

6 4.1 Servlet包的构成与Servlet生命周期
2、public ServletConfig getServletConfig() 返回一个ServletConfig对象。 3、public ServletContext getServletContext() 返回当前ServletContext对象。 4、public void init(ServletConfig config) throws ServletException Servlet程序的初始化方法。Servlet容器在加载一个Servlet类时,会自动调用此方法完成初始化操作。

7 4.1 Servlet包的构成与Servlet生命周期
5、public void destroy() Servlet容器在销毁一个Servlet对象前,会自动调用此方法,这个方法的执行表示Servlet程序被停止了服务。 6、public java.util.Enumeration getInitParameterNames() 返回web.xml中给Servlet程序配置的初始化变量名。 7、public java.lang.String getInitParameter(java.lang.String name) 返回web.xml中定义的初始化参数值,形参是参数名。如果找不到指定的参数,则返回null。

8 4.1 Servlet包的构成与Servlet生命周期
二、HttpServlet抽象类 1、service() HttpServlet中处理客户端请求的业务逻辑代码是在doXXX()方法中实现,不是在service()方法内实现 HttpServlet类对service()方法作了重置,它实现的业务逻辑功能是:根据客户端HTTP请求的类型决定应该调用哪个doXXX()方法来处理客户端的请求

9 4.1 Servlet包的构成与Servlet生命周期
2、protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException 当客户端以GET方式提交请求时,该方法被自动调用来处理客户端的请求。形参request和response的含义同JSP隐含对象中的request和response。

10 4.1 Servlet包的构成与Servlet生命周期
3、 protected void doPost(HttpServletRequestrequest, HttpServletResponse response) throws ServletException, java.io.IOException 当客户端以POST方式提交请求时,该方法被自动调用来处理客户端的请求。 HTTP POST方式允许客户端给Web服务器发送不限长度的数据。 形参中的request和response含义同JSP隐含对象。

11 4.1 Servlet包的构成与Servlet生命周期
生命周期大致分为三个生命阶段:初始化阶段、处理请求阶段、销毁阶段,如图4-2示 :

12

13 4.1 Servlet包的构成与Servlet生命周期
1、初始化阶段 public void init(ServletConfig config) throws ServletException Servlet程序被实例化后,Servlet容器自动调用init()方法,成功调用后,Servlet对象进入等待服务请求状态。

14 4.1 Servlet包的构成与Servlet生命周期
init()方法的一般写法为: public void init(ServletConfig config) throws ServletException { super.init(config); }

15 4.1 Servlet包的构成与Servlet生命周期
如果不调用super.init()把ServletConfig对象保存在父类对象中,则Servlet程序要将此对象保存在类成员变量中 : ServletConfig config=null; public void init(ServletConfig config) throws ServletException { this.config=config; }

16 4.1 Servlet包的构成与Servlet生命周期
init()方法能够读取web.xml部署文件中定义的Servlet初始化参数,例如在web.xml中有如下定义:

17 4.1 Servlet包的构成与Servlet生命周期
这段信息是Servlet程序 com.abc.mis.MyServlet的部署信息,其中<init-param></init-param>元素为Servlet程序定义了一个初始化参数“loginName=tom”,这个初始化参数可在HttpServlet的init()中读取,代码片段如下:

18

19 4.1 Servlet包的构成与Servlet生命周期
这个Servlet程序正确部署后,运行时会在Tomcat命令窗口中显示如下的信息: MyServlet开始初始化 loginName=tom

20 4.1 Servlet包的构成与Servlet生命周期
Servlet程序在被加载时,程序的init()方法会被Servlet容器自动调用。 例如,以下代码是希望在启动Web应用时,预先生成一个c:\log.txt文件:

21 4.1 Servlet包的构成与Servlet生命周期
public void init(ServletConfig config) throws ServletException { try File a=new File("c:\\log.txt") a.createNewFile(); }catch(Exception e) System.out.println("出错:"+e); }

22 4.1 Servlet包的构成与Servlet生命周期
<servlet-name>test</servlet-name> <servlet-class> com.abc.mis.MyServlet </servlet-class> <load-on-startup>0</load-on-startup> </servlet>

23 4.1 Servlet包的构成与Servlet生命周期
2、处理请求阶段 服务器收到调用Servlet程序的请求后,HttpServlet的service()将被执行,service()方法分析请求的类型,调用相应的doXXX()方法处理请求。 在HttpServlet中,doXXX()不是抽象方法,用户程序应该根据需要重置某个doXXX()方法

24 4.1 Servlet包的构成与Servlet生命周期
doGet()方法的定义为: protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, java.io.IOException doPost()方法的定义为: HttpServletResponse response) throws ServletException, request和response的含义同JSP页面中的request、response隐含对象

25 4.1 Servlet包的构成与Servlet生命周期
要向客户端返回“Hello,world!”,在doGet()中的代码为:

26 4.1 Servlet包的构成与Servlet生命周期

27 4.1 Servlet包的构成与Servlet生命周期
在doGet()/doPost()方法中获得常用JSP隐含对象的方法如下示:

28 4.1 Servlet包的构成与Servlet生命周期
3、 销毁阶段 销毁阶段表示在撤消一个Servlet对象之前,释放init()在初始化阶段创建的资源,HttpServlet中用destroy()方法表示销毁阶段的执行,destroy()方法运行结束表示Servlet生命周期结束。 destroy()方法的定义如下: public void destroy()

29 4.2 Servlet编程 一、Servlet程序的编程过程
Servlet程序的编写过程大致分为三步:代码编辑与编译、部署和重载Web应用。 1、代码编辑与编译 代码编辑与编译步骤是写一个Servlet程序,一般直接继承HttpServlet类,根据情况选择适当的doXXX()方法进行重置,实现期望的功能。

30 4.2 Servlet编程 2、部署Servlet 部署Servlet程序是指在WEB-INF\web.xml中书写Servlet部署信息。web.xml文档对大小写敏感。Servlet2.4规范的web.xml部署文件格式如下:

31 4.2 Servlet编程

32 4.2 Servlet编程 (1)<servlet>元素
<servlet>元素的作用是在Web应用中注册一个Servlet程序,注册信息包括为Servlet程序定义一个唯一的别名、初始化参数、加载优先级别等参数 一个<servlet>元素注册一个Servlet程序。<servlet>元素的使用格式如下:

33 4.2 Servlet编程 <servlet>
<servlet-name>test</servlet-name> <servlet-class>my.MyServlet</servlet-class> <init-param> <param-name>loginName</param-name> <param-value>tom</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet>

34 4.2 Servlet编程 (2)<servlet-mapping>元素
<servlet-mapping>元素为一个Servlet程序定义URL映射名,客户端浏览器或其它JSP/Servlet程序通过映射名调用此Servlet程序。<servlet-mapping>的使用格式如下: <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>

35 4.2 Servlet编程 在Servlet2.3的部署文件中,要求所有Servlet程序的<servlet>元素集中写在一起,所有的<servlet-mapping>集中写在一起,例如有三个Servlet程序的部署信息如下:

36 4.2 Servlet编程 <servlet>
<servlet-name>my1</servlet-name> <servlet-class>com.abc.mis.MyServlet1</servlet-class> </servlet> <servlet-name>my2</servlet-name> <servlet-class>com.abc.mis.MyServlet2</servlet-class> <servlet-name>my3</servlet-name> <servlet-class>com.abc.mis.MyServlet3</servlet-class>

37 4.2 Servlet编程 <servlet-mapping>
<servlet-name>my1</servlet-name> <url-pattern>/test1</url-pattern> </servlet-mapping> <servlet-name>my2</servlet-name> <url-pattern>/test2</url-pattern> <servlet-name>my3</servlet-name> <url-pattern>/test3</url-pattern>

38 4.2 Servlet编程 在Servlet2.4的部署文件中,允许逐个书写Servlet的部署信息,例如上例还可写为:
<servlet-name>my1</servlet-name> <servlet-class>com.abc.mis.MyServlet1</servlet-class> </servlet> <servlet-mapping> <url-pattern>/test1</url-pattern> </servlet-mapping>

39 4.2 Servlet编程 <servlet>
<servlet-name>my2</servlet-name> <servlet-class>com.abc.mis.MyServlet2</servlet-class> </servlet> <servlet-mapping> <url-pattern>/test2</url-pattern> </servlet-mapping>

40 4.2 Servlet编程 <servlet>
<servlet-name>my3</servlet-name> <servlet-class>com.abc.mis.MyServlet3</servlet-class> </servlet> <servlet-mapping> <url-pattern>/test3</url-pattern> </servlet-mapping>

41 4.2 Servlet编程 (3)<context-param>元素
<init-param>元素只能给一个Servlet程序定义初始化参数,<context-param>是给Web应用中所有的Servlet程序定义一个公共初始化参数。一个<context-param>元素定义一个参数。<context-param>的用法如下示:

42 4.2 Servlet编程 <context-param>
<param-name>DBName</param-name> <param-value>bookshop</param-value> </context-param> <param-name>admin</param-name> <param-value>tom</param-value>

43 4.2 Servlet编程 公共参数存储在Servlet容器中,读取这些参数要用到ServletContext对象或JSP隐含对象application。例如,以下代码是在doGet()方法内读出当前上下文中定义的所有公共参数并显示在网页上: ServletContext application=getServletContext() ; Enumeration e=application.getInitParameterNames(); while(e.hasMoreElements()) { String s1=(String)e.nextElement(); String s2=application.getInitParameter(s1); out.print(s1+"="+s2+"<br>"); }

44 4.2 Servlet编程 3、重载Web应用 Tomcat在启动时,自动发布已经注册的Web应用或webapps文件夹下的各个Web应用。
此后如果重新编译或生成了新的Servlet程序类*.class,需要通过重载Web应用来实现重新加载、更新*.class到Servlet容器中。 关闭Tomcat后再重启,也可实现重载Web应用,如果不关闭Tomcat,则通过以下方法重载指定的Web应用。

45 4.2 Servlet编程 (1) 定义管理员角色及相应的用户
编辑c:\tomcat\conf\tomcat-users.xml文件,增加一个名为“manager”的管理员角色,并为manager角色定义一个具体的用户admin,相关的代码如下示: <?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="manager"/> <user username="admin" password="123" roles="manager"/> </tomcat-users>

46 OK - Reloaded application at context path /
4.2 Servlet编程 (2) 重载Web应用 用(1)步中定义的admin用户来重载默认Web应用“/”的方法是:在IE浏览器的地址栏中输入: OK - Reloaded application at context path / 表示已经成功重载上下文路径名为“/”的Web应用。

47 4.2 Servlet编程 二、第一个Servlet程序
【例4-1】写一个验证用户登录名的Servlet程序。在JSP页面的表单中输入用户名和口令,表单提交给URL映射名为“/loginCheck”的Servlet程序,如果用户名为tom且口令为123,显示登录成功的信息,否则显示用户名和口令不正确的提示信息。

48 4.2 Servlet编程 操作步骤如下: (1)启动DW8,新建JSP文件exam401.jsp。
(2)在exam401.jsp中添加表单,表单中插入文本域和按钮:用户名文本域的名字为“loginName”,口令文本域的名字“pw”,在【密码】项中选中“密码”。表单提交给一个引用名为“/loginCheck”的Servlet程序处理,【方法】项取默认值“POST”。

49 4.2 Servlet编程 (3)编辑、编译Servlet程序。启动JCreator 4,新建一个类,使用类向导菜单【File】→【New】→【Class…】,弹出如图4-3示的对话框,在其中填写类名和包名后单击【Next】按钮。

50 4.2 Servlet编程

51 4.2 Servlet编程 第二步弹出接口的树型列表,如图4-4示,直接单击【Finish】按钮结束,此时生成了一个LoginServlet.java并进入代码编辑状态。也可以在图4-3中直接单击【Finish】按钮进入代码编辑状态。

52

53 4.2 Servlet编程 在源代码编辑窗口中输入以下代码:

54

55 4.2 Servlet编程 (4)在c:\tomcat\webapps\ROOT\WEB-INF\web.xml中写Servlet部署信息如下: <servlet> <servlet-name>login</servlet-name> <servlet-class>my.LoginServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/loginCheck</url-pattern> </servlet-mapping>

56 4.2 Servlet编程 (5)重启Tomcat或重载“/”Web应用。
(6)预览。预览exam401.jsp页面,输入正确的用户名和口令时,Servlet显示正确信息;输入的用户名和口令错误时,显示错误提示信息。Servlet程序工作正常。 以上操作录相请参考电子资源包demo\ch4\exam401.exe文件。

57 4.2 Servlet编程 三、 Servlet与HTML表单
【例4-2】在【例2-2】中有一个会员注册的JSP页面,现要求用Servlet读取表单中的数据并打印在网页上,操作步骤如下: (1)在DW8中修改exam202.jsp页面。在设计视图中,将表单提交给引用名为“/regServlet”的Servlet程序。 (2)启动JC4,新建一个类,使用类向导菜单【File】→【New】→【Class…】,类名为“RegServlet”,包名为“my”。完成后在代码编辑窗口中输入如下的代码:

58 4.2 Servlet编程

59 4.2 Servlet编程

60 4.2 Servlet编程

61 4.2 Servlet编程

62 4.2 Servlet编程 (3)编译Servlet程序。使用JC4的菜单【Build】→【Compile File】,编译成功后,RegServlet.class文件会被JC4自动存放至c:\tomcat\webapps\ROOT\WEB-INF\classes文件夹下。 (4)部署Servlet。编辑c:\tomcat\webapps\ROOT\WEB-INF\web.xml文件,加入如下的部署信息:

63 4.2 Servlet编程 <servlet>
<servlet-name>reg</servlet-name> <servlet-class>my.RegServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <url-pattern>/regServlet</url-pattern> </servlet-mapping>

64 4.2 Servlet编程 (5)重启Tocmat或重载“/”Web应用。
(6)预览。在浏览器中预览exam202.jsp,填写表单并提交,regServlet显示了表单中的内容。

65 4.2 Servlet编程 四、Servlet通信
Servlet通信是指:Servlet和JSP间、Servlet和Servlet间如何传递信息 比较通用的数据传递方法是利用JSP的request、session、application作用范围变量实现

66 4.2 Servlet编程 【例4-3】在Servlet程序中产生10个0~1间的随机小数,传送给exam402.jsp页面显示。用request作用范围变量实现数据传递。操作步骤如下: (1)启动JC4,新建一个类RNDServlet,在代码编辑窗口中输入如下的代码:

67 4.2 Servlet编程

68 4.2 Servlet编程

69 4.2 Servlet编程

70 4.2 Servlet编程

71 4.2 Servlet编程 (2)编译Servlet程序。使用JC4的菜单【Build】→【Compile File】,编译成功后,RNDServlet.class文件会被JC4自动存放至c:\tomcat\webapps\ROOT\WEB-INF\classes文件夹下,用“我的电脑”查看并核实。

72 4.2 Servlet编程 (3)部署Servlet。编辑c:\tomcat\webapps\ROOT\
WEB-INF\web.xml文件,加入如下的部署信息: <servlet> <servlet-name>rnd</servlet-name> <servlet-class>my.RNDServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/rnd</url-pattern> </servlet-mapping>

73 4.2 Servlet编程 (4)启动DW8,新建JSP文件exam402.jsp。
(5)在<body></body>内录入以下代码:

74 4.2 Servlet编程

75 4.2 Servlet编程 (6)重启Tocmat或重载“/”Web应用。
(7)预览。在浏览器中使用

76 4.2 Servlet编程 五、Servlet的session跟踪
在Servlet中实现session跟踪的方法主要有隐藏表单域、cookie、URL重写、session隐含对象等实现,编程的方法基本上同JSP。 【例4-4】用JSP/Servlet设计一个简单的购物车:设计一个商品列表页exam403.jsp如图4-5所示

77 4.2 Servlet编程

78 4.2 Servlet编程 在表单的列表框中列出可供选择的商品,选择其中一个商品后单击【提交】按钮,则商品的ID号itemID及数量quantity被传给商品添加模块“/addItem“ 用Servlet程序实现商品添加模块 用Servlet设计一个购物车商品列表模块“/listItems”,它把当前购物车中的商品ID号及数量显示在网页上,如图4-6示。

79 4.2 Servlet编程

80 4.2 Servlet编程 操作步骤如下: (1)启动DW8,新建JSP文件exam403.jsp。
(2) 设计如图4-5的表单。商品列表框的名字为“itemID”,列表值如图4-7示。

81 4.2 Servlet编程

82 4.2 Servlet编程 (3)编写添加商品的Servlet程序。启动JC4,新建一个类 AddItemServlet,在代码编辑窗口中输入如下的代码:

83 4.2 Servlet编程

84 4.2 Servlet编程

85 4.2 Servlet编程

86 4.2 Servlet编程

87 4.2 Servlet编程 (4)编译AddItemServlet程序。
(5)部署Servlet。编辑c:\tomcat\webapps\ROOT\WEB-INF\web.xml文件,加入如下的部署信息:

88 4.2 Servlet编程 <servlet>
<servlet-name>addItem</servlet-name> <servlet-class>my.AddItemServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/addItem</url-pattern> </servlet-mapping>

89 4.2 Servlet编程 (6)编写添加商品的Servlet程序。启动JC4,新建一个类 ListItemServlet,在代码编辑窗口中输入如下的代码:

90 4.2 Servlet编程

91 4.2 Servlet编程

92 4.2 Servlet编程

93 4.2 Servlet编程 (7)编译ListItemServlet程序。
(8)部署Servlet。编辑c:\tomcat\webapps\ROOT\WEB-INF\web.xml文件,加入如下的部署信息:

94 4.2 Servlet编程 <servlet>
<servlet-name>listItem</servlet-name> <servlet-class>my.ListItemServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <url-pattern>/listItem</url-pattern> </servlet-mapping>

95 4.2 Servlet编程 (9) 重启Tocmat或重载“/”Web应用。
(10)预览。在浏览器中访问exam403.jsp页面,选择好商品及数量后,单击【提交】按钮把商品添加至购物车中,添加成功后自动返回商品列表页;单击页面上的【查看购物车】超链接,则列出添加的商品ID号及数量。实现了用session对象进行Servlet程序的session跟踪。

96 4.2 Servlet编程 六、用JSP页面作Servlet程序
JSP页面最终会被编译成Servlet程序运行,所以也可以直接把JSP页面当作Servlet程序用,在JSP页面中完成程序设计后,在web.xml中的部署信息如下示:

97 4.2 Servlet编程 <servlet>
<servlet-name>test</servlet-name> <jsp-file>/my1.jsp</servlet-class> <load-on-start>2</load-on-start> </servlet> <servlet-mapping> <url-pattern>/test</url-pattern> </servlet-mapping>

98 4.2 Servlet编程 【例4-5】把【例4-4】中的两个Servlet程序用JSP页面实现。操作步骤如下:
(1)新建exam404.jsp,在代码视图,输入如下的代码:

99 4.2 Servlet编程

100 4.2 Servlet编程

101 4.2 Servlet编程 (2)部署exam404.jsp。在WEB-INF\web.xml中将addItem程序的部署信息改为:
<servlet-name>addItem</servlet-name> <jsp-file>/exam404.jsp</jsp-file> <load-on-start>2</load-on-start> </servlet> <servlet-mapping> <url-pattern>/addItem</url-pattern> </servlet-mapping>

102 4.2 Servlet编程 (3)编写JSP页面实现显示购物车内容的Servlet程序。新建exam405.jsp,在<body></body>间输入如下的代码:

103 4.2 Servlet编程

104 4.2 Servlet编程 (4) 部署exam405.jsp。在WEB-INF\web.xml中将listItem的部署信息改为:
<servlet-name>listItem</servlet-name> <jsp-file>/exam405.jsp</jsp-file> <load-on-start>2</load-on-start> </servlet> <servlet-mapping> <url-pattern>/listItem</url-pattern> </servlet-mapping>

105 4.2 Servlet编程 (5)重启Tomcat或重载“/”Web应用。 (6)在浏览器预览exam403.jsp,效果同【例4-4】。

106 4.3 过滤器 一、过滤器的基本工作原理 1、过滤器的基本工作原理 过滤器的基本工作原理如图4-8示。

107 4.3 过滤器 过滤器程序的基本结构如下: public class XXXFilter implements Filter
4.3 过滤器 过滤器程序的基本结构如下: public class XXXFilter implements Filter { public void init(FilterConfig config) throws ServletException { ...其它操作... } public void destroy()

108 4.3 过滤器 } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ...程序段1... chain.doFilter(request, response); ...程序段2...

109 <jsp:include page="ff.htm"/>
4.3 过滤器 在图4-8中,假定客户端请求了目标资源“/a.jsp”,而在a.jsp中用RequestDispatcher调用另一个资源ff.htm,则会发生过滤器嵌套调用,例如,a.jsp有以下资源调用代码: <jsp:include page="ff.htm"/> 请求过程如图4-9示 :

110 4.3 过滤器

111 4.3 过滤器 2、过滤器的特点 过滤器具备有以下特点: (1)它是声明式的 (2)它是动态的 (3)它是模块化的 (4)它是可移植的
4.3 过滤器 2、过滤器的特点 过滤器具备有以下特点: (1)它是声明式的 (2)它是动态的 (3)它是模块化的 (4)它是可移植的 (5)它是可重用的 (6)它是透明的

112 4.3 过滤器 二、过滤器的API接口及部署信息 1、javax.servlet.Filter接口
4.3 过滤器 二、过滤器的API接口及部署信息 1、javax.servlet.Filter接口 (1)public void init(FilterConfig filterConfig) throws ServletException init()方法执行初始化操作 (2) public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws java.io.IOException,ServletException 过滤器的业务逻辑代码在doFilter()方法内实现 (3)public void destroy() 在销毁一个过滤器对象之前,此方法被调用来释放init()中申请的资源,这个方法的执行,表示一个过滤器的生命期结束

113 4.3 过滤器 2、 javax.servlet.FilterConfig接口
4.3 过滤器 2、 javax.servlet.FilterConfig接口 (1)public java.util.Enumeration getInitParameterNames() 将初始化参数的变量名读至枚举型对象中。 (2)public java.lang.String getInitParameter(java.lang.String name) 读取指定变量名的初始化参数值,如果没有此参数,则返回Null值。 (3)public ServletContext getServletContext() 获得当前Web应用的ServletContext对象。

114 4.3 过滤器 3、javax.servlet. FilterChain接口 接口中关键的方法为:
4.3 过滤器 3、javax.servlet. FilterChain接口 接口中关键的方法为: public void doFilter(ServletRequest request, ServletResponse response) throws java.io.IOException,ServletException

115 4.3 过滤器 4、过滤器的部署 在WEB-INF\web.xml中部署一个过滤器的过程有:注册过滤器、映射过滤器 (1)注册过滤器
4.3 过滤器 4、过滤器的部署 在WEB-INF\web.xml中部署一个过滤器的过程有:注册过滤器、映射过滤器 (1)注册过滤器 过滤器在Web应用中注册后才会被容器加载运行。在web.xml中注册过滤器的方法如下示:

116 4.3 过滤器 <filter> <filter-name>my1</filter-name>
4.3 过滤器 <filter> <filter-name>my1</filter-name> <filter-class>com.abc.mis.Filter1</filter-class> <init-param> <param-name>password</param-name> <param-value>123</param-value> </init-param> </filter>

117 4.3 过滤器 容器为一个<filter></filter>元素创建一个过滤器实例,同一个过滤器类可以生成多个实例,此时只需要部署多个<filter></filter>元素,例如: <filter> <filter-name>my1</filter-name> <filter-class>com.abc.mis.Filter1</filter-class> <init-param> <param-name>password</param-name> <param-value>123</param-value> </init-param> </filter>

118 4.3 过滤器 <filter> <filter-name>my2</filter-name>
4.3 过滤器 <filter> <filter-name>my2</filter-name> <filter-class>com.abc.mis.Filter1</filter-class> <init-param> <param-name>password</param-name> <param-value>456</param-value> </init-param> </filter>

119 4.3 过滤器 (2)映射过滤器 过滤器映射就是定义此过滤器的激活条件,一般是通过目标资源的URI模式和请求的类型来定义。URI中可以使用通配符“*”来表达请求的URI模式。过滤器映射的基本方法如下示: <filter-mapping> <filter-name>my1</filter-name> <url-pattern>/test/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>

120 4.3 过滤器 三、第一个过滤器程序 过滤器的基本编程过程是:
4.3 过滤器 三、第一个过滤器程序 过滤器的基本编程过程是: 第一步:编辑与编译过滤器程序,把编译后得到的包文件夹及*.class类发布到ROOT\WEB-INF\classes文件夹下。 第二步:编辑WEB-INF\web.xml文件,添加过滤器的部署信息。 第三步:重启Tomcat或重载Web应用,使过滤器生效。

121 4.3 过滤器 【例4-6】定义三个过滤器: 如果用户访问“/test”下的资源时,过滤器1被激活,它判断用户是否已经登录,如果没有登录则中断请求,并返回404错误信息,如果已经登录则将请求转发给下一个过滤器。 定义过滤器2,当请求“/*”资源并且请求是来自客户端时它才被激活,显示提示信息,然后把请求转发给下一个过滤器。 过滤器3的功能同过滤器2,但它的请求类型为REQUEST或FORWARD。

122 4.3 过滤器 操作步骤如下: (1) 启动JC4,新建一个类“Filter1”,在代码编辑窗口中输入如下的代码:

123 4.3 过滤器

124 4.3 过滤器

125 4.3 过滤器

126 4.3 过滤器 (2)编译Filter1程序,成功后,Filter1.class文件会被JC4自动存放至c:\tomcat\webapps\ROOT\WEB-INF\classes文件夹下,用“我的电脑”查看并核实。 (3)启动JC4,新建一个类“Filter2”,在代码编辑窗口中输入如下的代码:

127 4.3 过滤器

128 4.3 过滤器

129 4.3 过滤器 (4)编译Filter2程序。 (5)启动JC4,新建一个类 “Filter3”,在代码编辑窗口中输入如下的代码:

130 4.3 过滤器

131 4.3 过滤器

132 4.3 过滤器 (6)编译Filter3程序。 (7)部署以上三个过滤器,得到一个过滤器链为:过滤器3→过滤器1→过滤器2。
4.3 过滤器 (6)编译Filter3程序。 (7)部署以上三个过滤器,得到一个过滤器链为:过滤器3→过滤器1→过滤器2。 编辑WEB-INF\web.xml文件,添加如下的部署信息:

133 4.3 过滤器

134 4.3 过滤器

135 4.3 过滤器 (8)定义实验用JSP资源。启动DW8,完成以下任务:
4.3 过滤器 (8)定义实验用JSP资源。启动DW8,完成以下任务: 新建exam406.jsp,在设计视图中输入提示文字“当前是/exam406.jsp 资源”。 新建exam407.jsp,在代码视图中输入以下代码: <body> <% session.setAttribute("loginName","tom"); out.print("成功登录,可以访问/test下的资源了!"); %> </body>

136 4.3 过滤器 新建exam408.jsp,在设计视图中,将站点中的“ROOT\tomcat.gif”图片插入文档中。
4.3 过滤器 新建exam408.jsp,在设计视图中,将站点中的“ROOT\tomcat.gif”图片插入文档中。 在站点根文件夹下新建一个/test下级文件夹。 在/test文件夹下建立一个index.jsp文件,在设计视图中输入提示文字“/test的首页”。 新建exam409.jsp,在代码视图中输入以下代码:

137 4.3 过滤器 <body> <%
4.3 过滤器 <body> <% RequestDispatcher go=application.getRequestDispatcher("/exam406.jsp"); go.forward(request,response); %> </body>

138 4.3 过滤器 (9)启动Tomcat,完成以下测试:
4.3 过滤器 (9)启动Tomcat,完成以下测试: 测试一:在IE浏览器中输入URL并回车: 客户端浏览器上显示的信息为: 第1行: 请求到达目标资源前过滤器3添加的信息 第2行: 请求到达目标资源前过滤器2添加的信息 第3行: 当前是/exam406.jsp 资源。 第4行: 目标资源输出信息返回时过滤器2添加的信息 第5行: 目标资源输出信息返回时过滤器3添加的信息

139 4.3 过滤器 测试二:在IE浏览器中输入URL并回车:

140 4.3 过滤器 在Tomcat命令行窗口中看到以下信息: 第1行: 过滤器3工作,请求转下一个处理...
4.3 过滤器 在Tomcat命令行窗口中看到以下信息: 第1行: 过滤器3工作,请求转下一个处理... 第2行: 过滤器2工作,请求转下一个处理... 第3行: 目标资源输出信息返回到过滤器2... 第4行: 目标资源输出信息返回到过滤器3... 第5行: 过滤器3工作,请求转下一个处理... 第6行: 过滤器2工作,请求转下一个处理... 第7行: 目标资源输出信息返回到过滤器2... 第8行: 目标资源输出信息返回到过滤器3..

141 4.3 过滤器 测试三:在IE浏览器输入URL并回车:http://127.0.0.1:8080/exam409.jsp
4.3 过滤器 测试三:在IE浏览器输入URL并回车: 浏览器上显示的信息是: 请求到达目标资源前过滤器2添加的信息 当前是/exam406.jsp 资源。 目标资源输出信息返回时过滤器2添加的信息 Tomcat命令行窗口上显示: 第1行: 过滤器3工作,请求转下一个处理... 第2行: 过滤器2工作,请求转下一个处理... 第3行: 过滤器2工作,请求转下一个处理... 第4行: 目标资源输出信息返回到过滤器2... 第5行: 目标资源输出信息返回到过滤器2... 第6行: 目标资源输出信息返回到过滤器3...

142 4.3 过滤器 测试四:在IE浏览器输入URL并回车:http://127.0.0.1:8080/test 在浏览器上显示信息:
4.3 过滤器 测试四:在IE浏览器输入URL并回车: 在浏览器上显示信息: 请求到达目标资源前过滤器3添加的信息 请求到达目标资源前过滤器1添加的信息 您没有登录,无权访问资源 目标资源输出信息返回时过滤器3添加的信息 在Tomcat后台窗口上显示: 过滤器3工作,请求转下一个处理... 过滤器1工作,请求转下一个处理... 目标资源输出信息返回到过滤器3...

143 4.3 过滤器 测试五:在IE浏览器上输入URL并回车: 在Tomcat后台窗口上显示: 第1行: 过滤器3工作,请求转下一个处理... 第2行: 过滤器2工作,请求转下一个处理... 第3行: 目标资源输出信息返回到过滤器2... 第4行: 目标资源输出信息返回到过滤器3... 第5行: 过滤器3工作,请求转下一个处理... 第6行: 过滤器1工作,请求转下一个处理... 第7行: 过滤器2工作,请求转下一个处理... 第8行: 目标资源输出信息返回到过滤器2... 第9行: 目标资源输出信息返回到过滤器1... 第10行: 目标资源输出信息返回到过滤器3...

144 4.3 过滤器 四、用过滤器解决request中文乱码问题
4.3 过滤器 四、用过滤器解决request中文乱码问题 客户端的数据一般是通过HTTP GET/POST方式提交给服务器,在服务器端用request.getParameter()读取参数时,很容易出现中文乱码现象。 用过滤器解决request中文乱码问题

145 4.3 过滤器 【例4-7】用过滤器解决request中文乱码问题。操作步骤如下:
4.3 过滤器 【例4-7】用过滤器解决request中文乱码问题。操作步骤如下: (1) 启动JC4,新建类 “ChineseFilter”,在代码编辑窗口中输入如下的代码:

146 4.3 过滤器

147 4.3 过滤器

148 4.3 过滤器 (2)编译ChineseFilter程序。 (3)部署过滤器。编辑WEB-INF\web.xml文件,添加以下内容:
4.3 过滤器 (2)编译ChineseFilter程序。 (3)部署过滤器。编辑WEB-INF\web.xml文件,添加以下内容: <filter> <filter-name>cf</filter-name> <filter-class>my.ChineseFilter</filter-class> </filter> <filter-mapping> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping>

149 4.3 过滤器 (4)启动DW8,新建exam410.jsp。 在设计视图中添加表单。 在表单中插入一个文本域,文本域名为data。
4.3 过滤器 (4)启动DW8,新建exam410.jsp。 在设计视图中添加表单。 在表单中插入一个文本域,文本域名为data。 单击选中表单红色边框,在属性面板上的【动作】项中输入“exam411.jsp”,表示表单提交给exam411.jsp处理。 添加一个提交按钮。 保存文档并关闭。

150 4.3 过滤器 (5)启动DW8,新建exam411.jsp,在代码视图中添加如下代码: <body> <%
4.3 过滤器 (5)启动DW8,新建exam411.jsp,在代码视图中添加如下代码: <body> <% String s=request.getParameter("data"); out.print(s); %> </body> 保存文档并关闭。

151 4.3 过滤器 (6)测试。启动Tomcat。 在IE浏览器地址栏中输入URL: 在DW8中,打开exam410.jsp,单击选中表单的红色边框,在属性面板上的【方法】项中,选择“GET”方式,保存并预览。在表单中输入一些中文文字,提交表单后,exam411.jsp中显示中文,说明GET方式没有中文乱码。

152 4.4 侦听器 侦听器主要侦听Servlet容器中的事件,所侦听的事件发生后,容器激活侦听器,执行预定的操作。
4.4 侦听器 侦听器主要侦听Servlet容器中的事件,所侦听的事件发生后,容器激活侦听器,执行预定的操作。 侦听器侦听的事件主要是JSP隐含对象application、session、request对象上发生的事件,主要有隐含对象的创建与销毁事件,相关作用范围变量的创建、修改和销毁事件。

153 4.4 侦听器 编译好的侦听器类要在web.xml中部署,部署信息相对简单,给出侦听器的类名即可,基本格式如下示:
4.4 侦听器 编译好的侦听器类要在web.xml中部署,部署信息相对简单,给出侦听器的类名即可,基本格式如下示: <listener> <listener-class>my.TestListener</listener-class> </listener>

154 4.4 侦听器 一、Servlet Context侦听器 1、javax.servlet.ServletContextListener接口
4.4 侦听器 一、Servlet Context侦听器 1、javax.servlet.ServletContextListener接口 ServletContextListener接口的实现类主要侦听Web应用Sevlet上下文的初始化事件和销毁事件。 ServletContextListener中声明的方法有:

155 4.4 侦听器 (1)public void contextInitialized(ServletContextEvent sce)方法
4.4 侦听器 (1)public void contextInitialized(ServletContextEvent sce)方法 处理上下文初始化事件的业务逻辑在此方法内实现 (2)public void contextDestroyed(ServletContextEvent sce)方法 处理上下文销毁事件的业务逻辑在此方法内实现

156 4.4 侦听器 【例4-8】写一个Servlet上下文侦听器,在Web应用启动时,激活一个定时器,此定时器每隔10秒钟在后台显示“定时器工作…”信息。当关闭Web应用时,将关闭定时器。 (1) 启动JC4,新建一个类“MyTask”,在代码编辑窗口中输入如下的代码:

157 4.4 侦听器

158 4.4 侦听器 (2)编译MyTask程序。 (3)启动JC4,新建一个“ContextListener”,
4.4 侦听器 (2)编译MyTask程序。 (3)启动JC4,新建一个“ContextListener”, 在代码编辑窗口中输入如下的代码:

159 4.4 侦听器

160 4.4 侦听器

161 4.4 侦听器 (4)编译ContextListener程序。 (5)部署侦听器。编辑web.xml文件,书写如下的部署信息:
4.4 侦听器 (4)编译ContextListener程序。 (5)部署侦听器。编辑web.xml文件,书写如下的部署信息: <listener> <listener-class>my.ContextListener</listener-class> </listener> 保存并关闭文件。

162 4.4 侦听器 (6)测试。启动Tomcat,Tomcat的命令行窗口中显示了如下的信息: Web应用初始开始....
4.4 侦听器 (6)测试。启动Tomcat,Tomcat的命令行窗口中显示了如下的信息: Web应用初始开始.... Thu Mar 22 20:14:23 CST 2007,定时器工作… 此后,每隔10秒钟,命令行窗口中继续显示定时器工作的信息。 关闭Tomcat命令行窗口,查看c:\mylog.txt文件,记录有Tomcat的启动和关闭时间。

163 4.4 侦听器 2、javax.servlet.ServletContextAttributeListener接口
4.4 侦听器 2、javax.servlet.ServletContextAttributeListener接口 JSP的application隐含对象可以存储全局属性,这些属性实际上是存储在Servlet容器 ServletContextAttributeListener类型的侦听器专门侦听application属性事件,包括新添加属性、删除属性、修改属性事件。接口中声明的方法有:

164 4.4 侦听器 (1)void attributeAdded(ServletContextAttributeEvent scab)
4.4 侦听器 (1)void attributeAdded(ServletContextAttributeEvent scab) 当有新的application属性添加到Servlet上下文中时,触发属性添加事件,侦听此事件的侦听器激活后执行此方法 (2)public void attributeRemoved(ServletContextAttributeEvent scab) 当一个application属性被删除时,触发属性删除事件,侦听此事件的侦听器激活后执行此方法 (3)public void attributeReplaced(ServletContextAttributeEvent scab) 当一个application属性被修改时,触发属性修改事件,侦听此事件的侦听器激活后执行此方法

165 4.4 侦听器 上述三个方法的形参是ServletContextAttributeEvent对象,此对象中常用的方法有:
4.4 侦听器 上述三个方法的形参是ServletContextAttributeEvent对象,此对象中常用的方法有: String getName():返回发生变化属性的属性名 Object getValue():返回发生变化属性的属性值

166 4.4 侦听器 【例4-9】设计一个ServletAttributeContext侦听器,侦听上下文属性的变化。操作步骤如下:
4.4 侦听器 【例4-9】设计一个ServletAttributeContext侦听器,侦听上下文属性的变化。操作步骤如下: (1) 启动JC4,新建一个类 “Listener2”,在代码编辑窗口中输入如下的代码:

167 4.4 侦听器

168 4.4 侦听器

169 4.4 侦听器 (2)编译Listener2程序。 (3)部署侦听器。编辑web.xml文件,书写如下的部署信息:
4.4 侦听器 (2)编译Listener2程序。 (3)部署侦听器。编辑web.xml文件,书写如下的部署信息: <listener> <listener-class>my. Listener2</listener-class> </listener> 保存并关闭文件。

170 4.4 侦听器 (4)启动DW8,新建exam412.jsp,在代码视图中输入以下代码:

171 4.4 侦听器 (5)测试。启动Tomcat,打开浏览器,访问:http://127.0.0.1:8080/exam412.jsp。
4.4 侦听器 (5)测试。启动Tomcat,打开浏览器,访问: 在Tomcat后台命令行窗口中显示: 第1行: 上下文中新添加了一个新属性:login=tom 第2行: 上下文中一个属性的值被修改,旧的值:login=tom新的值:login=John 第3行: 上下文中删除了一个属性:login=John

172 4.4 侦听器 二、ServletRequest侦听器 1、javax.servlet.ServletRequestListener接口
4.4 侦听器 二、ServletRequest侦听器 1、javax.servlet.ServletRequestListener接口 ServletRequestListener侦听器主要侦听request隐含对象的创建与销毁事件。 接口中的相关方法有:

173 4.4 侦听器 (1)public void requestInitialized(ServletRequestEvent sre)
4.4 侦听器 (1)public void requestInitialized(ServletRequestEvent sre) 当产生request准备进入Web应用作用范围事件时,侦听此事件的侦听器被激活,此方法被执行 (2) public void requestDestroyed(ServletRequestEvent sre) 当产生request准备超出Web应用作用范围事件时,侦听此事件的侦听器被激活,此方法被激活

174 4.4 侦听器 上述两个方法的形参都是ServletRequestEvent sre 对象,ServletRequestEvent中关键的方法有: ServletContext getServletContext() :返回当前Web应用的上下文对象。 ServletRequest getServletRequest():返回当前请求对应的ServletRequest对象。

175 4.4 侦听器 【例4-10】用ServletRequestListener接口实现一个侦听器,把用户请求资源的URI登记在日志文件中。
4.4 侦听器 【例4-10】用ServletRequestListener接口实现一个侦听器,把用户请求资源的URI登记在日志文件中。 (1) 启动JC4,新建一个类“RequestListener1”,在代码编辑窗口中输入如下的代码:

176 4.4 侦听器

177 4.4 侦听器

178 4.4 侦听器 (2)部署侦听器。编辑web.xml文件,书写如下的部署信息: <listener>
4.4 侦听器 (2)部署侦听器。编辑web.xml文件,书写如下的部署信息: <listener> <listener-class>my. RequestListener1</listener-class> </listener> 保存并关闭文件。

179 4.4 侦听器 (3)测试。启动Tomcat,在浏览器上访问默认首页: Fri Mar 23 10:40:16 CST / Fri Mar 23 10:40:16 CST /tomcat.gif Fri Mar 23 10:40:16 CST /asf-logo-wide.gif Fri Mar 23 10:40:16 CST /tomcat-power.gif

180 4.4 侦听器 2、ServletRequestAttributeListener接口
4.4 侦听器 2、ServletRequestAttributeListener接口 这个接口的侦听器主要侦听request属性的变化,包括添加新的属性、删除一个已有的属性、修改一个已有属性值事件。相关的方法有:

181 4.4 侦听器 (1)attributeAdded(ServletRequestAttributeEvent srae)
4.4 侦听器 (1)attributeAdded(ServletRequestAttributeEvent srae) 当上下文中添加了新的request属性事件时,侦听器激活,这个方法被执行 (2)void attributeRemoved(ServletRequestAttributeEvent srae) 当删除了一个已有的request属性时,侦听器激活,这个方法被执行 (3)void attributeReplaced(ServletRequestAttributeEvent srae) 当修改一个已有的request属性时,侦听器激活,这个方法被执行

182 4.4 侦听器 以上三个方法的形参都是ServletRequestAttributeEvent srae。ServletRequestAttributeEvent类中的方法有: String getName():返回属性名。 Object getValue():返回属性值(对象)。

183 4.4 侦听器 三、 HttpSession侦听器 1、javax.servlet.http.HttpSessionListener接口
4.4 侦听器 三、 HttpSession侦听器 1、javax.servlet.http.HttpSessionListener接口 这个接口的侦听器侦听上下文中session对象的创建与销毁事件,接口中声明的方法有:

184 4.4 侦听器 (1) public void sessionCreated(HttpSessionEvent se)
4.4 侦听器 (1) public void sessionCreated(HttpSessionEvent se) 当发生创建一个session对象的事件时,侦听器激活,此方法被执行 (2) public void sessionDestroyed(HttpSessionEvent se) 当一个已有的session对象超出作用而失效时,侦听器激活,此方法被执行 以上两个方法的形参都是HttpSessionEvent se。HttpSessionEvent中关键的方法有: public HttpSession getSession() 这个方法返回一个HttpSession对象。

185 4.4 侦听器 【例4-11】用session侦听器设计一个站点计数器,当有新的session对象创建时,站点计数器自动加1。操作步骤如下:
4.4 侦听器 【例4-11】用session侦听器设计一个站点计数器,当有新的session对象创建时,站点计数器自动加1。操作步骤如下: (1) 启动JC4,新建一个类 “SessionListener”,在代码编辑窗口中输入如下的代码:

186 4.4 侦听器

187 4.4 侦听器

188 4.4 侦听器 (2)编译SessionListener程序。 (3)部署侦听器。编辑web.xml文件,书写如下的部署信息:
4.4 侦听器 (2)编译SessionListener程序。 (3)部署侦听器。编辑web.xml文件,书写如下的部署信息: <listener> <listener-class>my.SessionListener </listener-class> </listener> 保存并关闭文件。

189 4.4 侦听器 (4)启动DW8,新建exam413.jsp,在代码视图中输入以下代码: <body> <%
4.4 侦听器 (4)启动DW8,新建exam413.jsp,在代码视图中输入以下代码: <body> <% String c=(String)application.getAttribute("counter"); out.print("访问人数:"+c); %> </body> 保存文档并关闭。

190 4.4 侦听器 (5)测试。启动Tomcat,完成以下测试:
4.4 侦听器 (5)测试。启动Tomcat,完成以下测试: 新建一个浏览器窗口,在地址栏中输入 新建另一个浏览器窗口,在地址栏中输入

191 4.4 侦听器 这个接口的侦听器侦听session属性的变化,包括session属性的创建、销毁和修改事件。接口中声明的方法有:
4.4 侦听器 2、javax.servlet.http. HttpSessionAttributeListener接口 这个接口的侦听器侦听session属性的变化,包括session属性的创建、销毁和修改事件。接口中声明的方法有:

192 4.4 侦听器 当添加一个新的session属性时,侦听器激活,此方法被执行
4.4 侦听器 (1)public void attributeAdded(HttpSessionBindingEvent se) 当添加一个新的session属性时,侦听器激活,此方法被执行 (2)public void attributeRemoved(HttpSessionBindingEvent se) 当一个已有的session属性被删除后,侦听器激活,此方法被执行 (3)public void attributeReplaced(HttpSessionBindingEvent se) 当一个session属性的值被修改时,会导致此方法被执行

193 4.4 侦听器 上述三个方法的形参都是HttpSessionBindingEvent se。HttpSessionBindingEvent接口中的方法 public HttpSession getSession() 获得当前发生变化的session对象。 public java.lang.String getName() 获得发生变化的session属性名。 public java.lang.Object getValue() 获得发生变化的session属性值,如果是修改属性事件,返回的是旧属性值。

194 4.4 侦听器 【例4-12】测试session属性事件。操作步骤如下:
4.4 侦听器 【例4-12】测试session属性事件。操作步骤如下: (1) 启动JC4,新建一个类“Listener6”,在代码编辑窗口中输入如下的代码:

195 4.4 侦听器

196 4.4 侦听器

197 4.4 侦听器 (2)编译Listener6程序。 (3)部署侦听器。编辑web.xml文件,书写如下的部署信息:
4.4 侦听器 (2)编译Listener6程序。 (3)部署侦听器。编辑web.xml文件,书写如下的部署信息: <listener> <listener-class>my. Listener6 </listener-class> </listener> 保存并关闭文件。

198 4.4 侦听器 (4)启动DW8,新建exam414.jsp,在代码视图中输入以下代码:

199 4.4 侦听器 (5)测试。启动Tomcat,打开一个浏览器窗口,在地址栏中输入 新加一个session属性,ID=DF31F2DBF57ED CD2B login=tom 修改了一个session属性,ID=DF31F2DBF57ED CD2B pw=123 删除一个session属性,ID=DF31F2DBF57ED CD2B login=John 以上信息说明侦听器侦听到了容器中发生的session属性事件。

200 4.4 侦听器 3、 javax.servlet.http. HttpSessionListener接口
4.4 侦听器 3、 javax.servlet.http. HttpSessionListener接口 这个接口与HttpSessionAttributeListener接口相似,但它只侦听session属性的添加、移除事件。 4、javax.servlet.http. HttpSessionActiveListener接口 这个接口侦听的是session转移事件。 当一台JVM中的session隐含对象被存储并等待转移至另一台JVM时,此时称发生了passivate事件(钝化事件)。当session隐含对象被成功转移至另一台JVM后,容器激活接收到的session隐含对象,此时称发生了Active事件(激活事件)。

201 4.5 小 结  Servlet 2.4 API包中,GenericServlet是一个协议无关的Servlet通用抽象类。HttpServlet也是一个抽象类,它继承了GenericServlet,增加了对HTTP的支持,是使用HTTP协议工作的Servlet程序的父类。用户自己写的Servlet程序一般直接继承HttpServlet。 Servlet程序的生命周期大致分为初始化阶段、请求处理阶段、销毁阶段三个阶段

202 4.5 小 结 侦听器主要侦听Servlet容器中发生的事件,一般与JSP隐含对象application、session、request相关。Servlet 2.4 API中提供了侦听不同事件的接口,通过实现这些接口编写出相应的事件侦听器,将侦听器部署到Web应用后,用户自定义的侦听器就可实施事件侦听。


Download ppt "第4章 Servlet、过滤器与侦听器."

Similar presentations


Ads by Google