Servlet应用开发高级技术.ppt

上传人:牧羊曲112 文档编号:6518959 上传时间:2023-11-08 格式:PPT 页数:39 大小:296.49KB
返回 下载 相关 举报
Servlet应用开发高级技术.ppt_第1页
第1页 / 共39页
Servlet应用开发高级技术.ppt_第2页
第2页 / 共39页
Servlet应用开发高级技术.ppt_第3页
第3页 / 共39页
Servlet应用开发高级技术.ppt_第4页
第4页 / 共39页
Servlet应用开发高级技术.ppt_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《Servlet应用开发高级技术.ppt》由会员分享,可在线阅读,更多相关《Servlet应用开发高级技术.ppt(39页珍藏版)》请在三一办公上搜索。

1、第二讲:Servlet 高级编程过滤、事件(2),陈旺虎,Servlets高级编程,Servlet 过滤概述实例学习Eclipse编写Servlet过滤应用和会话事件概述Eclipse编写实现时间监听,Servlets高级编程,Servlet 过滤概述实例学习Eclipse编写Servlet过滤应用和会话事件概述Eclipse编写实现时间监听,事件的作用,当一个事件发生时,代码可以被自动调用,因此可用于:当ServletContext对象被创建时,可以装载JDBC驱动或者创建一个数据库连接对象 当ServletContext对象被销毁,可以进行一些清除工作,例如:关闭文件、或者断开数据库联接监

2、控ServletContext的属性变化 在HttpSession对象被创建、无效以及增加、移除和替换其属性时可以得到通知,说明:session,新客户端向服务器第一次发送请求的时,server端会创建一个session对象,并分配一个sessionID,serssion对象会保存在服务器端。此时session的状态处于new state状态,如果调用session.isNew(),则返回true当服务器段处理完毕后,将此sessionID同response一同传回到客户端,并将其存入到cookie中当客户端再次发送请求时,会将sessionID同request一起发送,传递给服务器端服务器端

3、可以根据传递过来的sessionID将这次请求(request)与保存在服务器端的session对象联系起来,此时的session已不处于new state状态,如果调用session.isNew(),则返回false循环上述三步,直到session超时或者销毁结束,Web应用的事件监听器,Web应用生命周期监听器监控或者对三个不同范围的变化 做出反应Request监听器,在一个请求对象被创建、销毁或者修改时被调用HTTP session监听器,在一个会话被创建、销毁或者修改时被调用Servlet context监听器,当应用范围(servlet context)被创建、销毁或者修改时被调用,

4、监听应用事件,在应用层面,javax.servlet包提供两个监听器接口,支持ServletContext对象状态改变的事件通知:ServletContextListener接口ServletContextAttributesListener接口,选择监听器接口,根据要监控的对象或者活动,选择要实现的监听器接口,为ServletContext事件选择方法,监控生命周期事件使用ServletContextListener接口:contextInitialized(ServletContextEvent e)当Web应用准备好处理请求时调用contextDestroyed(ServletConte

5、xtEvent e)当Web应用将被关闭时调用监控属性事件,使用ServletContextAttributesListener接口:attributeAdded(ServletContextAttributeEvent e)在为ServletContext增加一个属性后调用attributeRemoved(ServletContextAttributeEvent e)在移除ServletContext的一个属性后调用attributeReplaced(ServletContextAttributeEvent e)在替换ServletContext的一个属性后调用,为HttpSession事件

6、选择方法,监控生命周期事件,使用HttpSessionListener接口:sessionCreated(HttpSessionEvent e)当创建一个会话时调用sessionDestroyed(HttpSessionEvent e)当销毁一个会话时调用监控属性事件,使用HttpSessionAttributesListener接口:attributeAdded(HttpSessionBindingEvent e)在为一个session增加一个属性后调用attributeRemoved(HttpSessionBindingEvent e)在移除session的一个属性后调用attribute

7、Replaced(HttpSessionBindingEvent e)在session中的属性被另一属性替换后调用,为 ServletRequest事件选择方法,监控生命周期事件,使用ServletRequestListener接口:requestInitialized(ServletRequestEvent e)当一个请求将要进入Web应用的范围时调用requestDestroyed(ServletRequestEvent e)当一个请求将要离开Web应用的范围时调用监控属性事件,使用ServletRequestAttributesListener 接口:attributeAdded(Ser

8、vletRequestAttributeEvent e)在为一个ServletRequest增加属性后调用attributeRemoved(ServletRequestAttributeEvent e)在移除ServletRequest的一个属性后调用attributeReplaced(ServletRequestAttributeEvent e)在ServletRequest的属性被另一属性替换后调用,部署描述符,要使用servlet监听器类,必须通过在部署描述符中注册监听器类,来告诉servlet容器 元素必须包含一个元素,如下:,AppLifeCycleEvent,注意:元素必须出现在部

9、分之前,实例1:装载JDBC驱动和设置ServletContext属性,下面的实例使用ServletContextListener 接口中的contextInitialized方法来:装载JDBC驱动,并且设置一个ServletContext属性,属性名为“dbUrl”,属性值为jdbc:mysql/Fred 实例有两个类:一个监听器类:AppLifeCycleEventDemo 一个servlet:ApplicationEventDemoServlet,AppLifeCycleEventDemo,import javax.servlet.ServletContext;import javax

10、.servlet.ServletContextListener;import javax.servlet.ServletContextEvent;public class AppLifeCycleEventDemo implements ServletContextListener public void contextInitialized(ServletContextEvent sce)System.out.println(Initializing Application);/装载 JDBC驱动 try Class.forName(org.gjt.mm.mysql.Driver);catc

11、h(ClassNotFoundException e)System.out.println(e.toString();,/获取ServletContext对象 ServletContext servletContext=sce.getServletContext();/设置 ServletContext属性 servletContext.setAttribute(dbUrl,jdbc:mysql/Fred);System.out.println(Application initialized);public void contextDestroyed(ServletContextEvent c

12、se)System.out.println(Application shut down);,Servlet:ApplicationEventDemoServlet,import javax.servlet.*;import javax.servlet.http.*;import java.io.*;public class ApplicationEventDemoServlet extends HttpServlet public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletE

13、xception,IOException response.setContentType(text/html);PrintWriter out=response.getWriter();out.println();out.println();out.println(Application Event Demo Servlet);out.println();out.println();,out.println(Your database connection is);/获取 ServletContext 对象 ServletContext servletContext=getServletCon

14、text();/显示“dbUrl”属性 out.println(servletContext.getAttribute(dbUrl);out.println();out.println();上面方法中,dbUrl属性的输出为“jdbc:mysql/Fred”,为什么?,部署描述符,AppLifeCycleEventDemo ApplicationEventDemo ApplicationEventDemoServlet,实例2:ServletContextAttribute监听器,PageCounterServlet每接收到一次请求,servlet增加一次计数器的值 计数器的值作为Servle

15、tContext对象的一个属性进行保存,因此可被该应用的每个servlet访问 然而,如果servlet容器崩溃,将不会丢失该值,因为其被同时写入一个文本文件counter.txt.该应用有两个类构成:一个监听器类:AppAttributeEventDemo 一个servlet:PageCounterServlet.,AppAttributeEventDemo,import javax.servlet.ServletContext;import javax.servlet.ServletContextListener;import javax.servlet.ServletContextEve

16、nt;import javax.servlet.ServletContextAttributeListener;import javax.servlet.ServletContextAttributeEvent;import java.io.*;public class AppAttributeEventDemo implements ServletContextListener,ServletContextAttributeListener int counter;String counterFilePath=C:counter.txt;,public void contextInitial

17、ized(ServletContextEvent cse)try BufferedReader reader=new BufferedReader(new FileReader(counterFilePath);counter=Integer.parseInt(reader.readLine();reader.close();System.out.println(Reading+counter);catch(Exception e)System.out.println(e.toString();ServletContext servletContext=cse.getServletContex

18、t();servletContext.setAttribute(pageCounter,Integer.toString(counter);System.out.println(Application initialized);,public void contextDestroyed(ServletContextEvent cse)System.out.println(Application shut down);public void attributeAdded(ServletContextAttributeEvent scae)System.out.println(ServletCon

19、text attribute added);public void attributeRemoved(ServletContextAttributeEvent scae)System.out.println(ServletContext attribute removed);public void attributeReplaced(ServletContextAttributeEvent scae)System.out.println(ServletContext attribute replaced);writeCounter(scae);,synchronized void writeC

20、ounter(ServletContextAttributeEvent scae)ServletContext servletContext=scae.getServletContext();counter=Integer.parseInt(String)servletContext.getAttribute(pageCounter);try BufferedWriter writer=new BufferedWriter(new FileWriter(counterFilePath);writer.write(Integer.toString(counter);writer.close();

21、System.out.println(Writing);catch(Exception e)System.out.println(e.toString();,PageCounterServlet,import javax.servlet.*;import javax.servlet.http.*;import java.io.*;public class PageCounterServlet extends HttpServlet public void doGet(HttpServletRequest request,HttpServletResponse response)throws S

22、ervletException,IOException response.setContentType(text/html);PrintWriter out=response.getWriter();out.println();out.println();out.println(Page Counter);out.println();out.println();,ServletContext servletContext=getServletContext();int pageCounter=Integer.parseInt(String)servletContext.getAttribute

23、(pageCounter);pageCounter+;out.println(You are visitor number+pageCounter);servletContext.setAttribute(pageCounter,Integer.toString(pageCounter);out.println();out.println();,监听HttpSession事件,javax.servlet.http包提供两个接口,可通过实现监听HttpSession事件:HttpSessionListener支持监听一个会话的生命周期事件事件在一个HttpSession对象创建时被触发事件在一个

24、HttpSession对象被销毁时被raisedHttpSessionAttributeListener当一个HttpSession的属性被增加、移除、修改时,提供事件的触发,HttpSessionListener接口,HttpSessionListener接口有两个方法:public void sessionCreated(HttpSessionEvent se)该方法当HttpSession对象被创建时,被自动调用public void sessionDestroyed(HttpSessionEvent se)当一个HttpSession对象变得无效时,被自动调用两个方法都将在一个Http

25、SessionEvent对象类中被传递HttpSessionEvent类继承自java.util.EventObject类 HttpSessionEvent类定义了一个getSesssion方法,可用于获取被改变的HttpSession对象,示例:Servlet监听器应用(1/2),public class SessionCounter implements ServletContextListener,HttpSessionListener/Called when web app ready to process requests/Initialize current session and

26、 max session counts to 0public void contextInitialized(ServletContextEvent arg0)ServletContext sc=arg0.getServletContext();setCurrentSessions(sc,0);setMaxSessions(sc,0);/Called when web application is about to be shutdown/Print out max session count at the consolepublic void contextDestroyed(Servlet

27、ContextEvent arg0)System.out.println(Max sessions:+getMaxSessions(arg0.getServletContext();,示例:Servlet监听器应用(1/2),/Called when a session is created/Increment session count and compare to max sessionspublic void sessionCreated(HttpSessionEvent arg0)ServletContext sc=arg0.getSession().getServletContext

28、();int currentSessions=getCurrentSessions(sc)+1;int maxSessions=getMaxSessions(sc);if(currentSessions maxSessions)setMaxSessions(sc,currentSessions);setCurrentSessions(sc,currentSessions);/Called when a session is destroyed/Decrement session countpublic void sessionDestroyed(HttpSessionEvent arg0)Se

29、rvletContext sc=arg0.getSession().getServletContext();setCurrentSessions(sc,getCurrentSessions(sc)-1);,实例:用户计数器(HttpSessionListener),下面的实例是一个计数器,计算当前会话中的不同用户的个数为一个用户初次请求servlet,创建一个HttpSession对象 如果用户返回同一servlet,不会再次创建第二个 HttpSession对象。因此,计数器只有当HttpSession对象创建时才累加一个HttpSession对象被销毁时,计数器累减 由于该计数器要被所有用

30、户访问,因此作为ServletContext对象的属性保存,该实例有两个类,一个监听器类:SessionLifeCycleEventDemo 实现ServletContextListener和 HttpSessionListener接口一个servlet类,用于显示计数器的值,计数器实现方法,首先,创建一个ServletContext属性,取初值为0 注意:ServletContext对象被赋予一个 servletContext变量,可在类中的任何位置使用,监听HttpSession事件,当一HttpSession被创建或者销毁时,计数器需要递增或者递减,计数器实现方法(续),incremen

31、tUserCounter方法首先,从ServletContext对象获取属性userCounter然后,计数器递增,将其保存回userCounter属性,SessionLifeCycleEventDemo类,import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionListener;import javax.servlet.http.HttpSessionEvent;import javax.servlet.ServletContextListener;import javax.servlet.Serv

32、letContext;import javax.servlet.ServletContextEvent;public class SessionLifeCycleEventDemo implements ServletContextListener,HttpSessionListener ServletContext servletContext;int counter=0;public void contextInitialized(ServletContextEvent sce)servletContext=sce.getServletContext();servletContext.se

33、tAttribute(userCounter),Integer.toString(counter);public void contextDestroyed(ServletContextEvent sce)public void sessionCreated(HttpSessionEvent hse)System.out.println(Session created.);incrementUserCounter();,public void sessionDestroyed(HttpSessionEvent hse)System.out.println(Session destroyed.)

34、;decrementUserCounter();synchronized void incrementUserCounter()counter=Integer.parseInt(String)servletContext.getAttribute(userCounter);counter+;servletContext.setAttribute(userCounter),Integer.toString(counter);System.out.println(User Count:+counter);synchronized void decrementUserCounter()int cou

35、nter=Integer.parseInt(String)servletContext.getAttribute(userCounter);counter-;servletContext.setAttribute(userCounter),Integer.toString(counter);System.out.println(User Count:+counter);,userCounterServlet Servlet,import javax.servlet.*;import javax.servlet.http.*;import java.io.*;public class UserC

36、ounterServlet extends HttpServlet public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException ServletContext servletContext=getServletContext();HttpSession session=request.getSession(true);int userCounter=0;userCounter=Integer.parseInt(String)servlet

37、Context.getAttribute(userCounter);response.setContentType(text/html);PrintWriter out=response.getWriter();,out.println();out.println();out.println(User Counter);out.println();out.println();out.println(There are+userCounter+users.);out.println();out.println();,总结,介绍了application和session事件,及其应用实例 对这些事件的监听能力并不苛刻,但是,非常有用,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号