Servlet应用开发高级技术.ppt_第1页
Servlet应用开发高级技术.ppt_第2页
Servlet应用开发高级技术.ppt_第3页
Servlet应用开发高级技术.ppt_第4页
Servlet应用开发高级技术.ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

第二讲:Servlet 高级编程 过滤、事件(2),陈旺虎,Servlets高级编程,Servlet 过滤 概述 实例学习 Eclipse编写Servlet过滤 应用和会话事件 概述 Eclipse编写实现时间监听,Servlets高级编程,Servlet 过滤 概述 实例学习 Eclipse编写Servlet过滤 应用和会话事件 概述 Eclipse编写实现时间监听,事件的作用,当一个事件发生时,代码可以被自动调用,因此可用于: 当ServletContext对象被创建时,可以装载JDBC驱动或者创建一个数据库连接对象 当ServletContext对象被销毁,可以进行一些清除工作,例如:关闭文件、或者断开数据库联接 监控ServletContext的属性变化 在HttpSession对象被创建、无效以及增加、移除和替换其属性时可以得到通知,说明:session,新客户端向服务器第一次发送请求的时,server端会创建一个session对象,并分配一个sessionID,serssion对象会保存在服务器端。此时session的状态处于new state状态,如果调用session.isNew(),则返回true 当服务器段处理完毕后,将此sessionID同response一同传回到客户端,并将其存入到cookie中 当客户端再次发送请求时,会将sessionID同request一起发送,传递给服务器端 服务器端可以根据传递过来的sessionID将这次请求(request)与保存在服务器端的session对象联系起来,此时的session已不处于new state状态,如果调用session.isNew(),则返回false 循环上述三步,直到session超时或者销毁结束,Web应用的事件监听器,Web应用生命周期监听器监控或者对三个不同范围的变化 做出反应 Request监听器,在一个请求对象被创建、销毁或者修改时被调用 HTTP session监听器,在一个会话被创建、销毁或者修改时被调用 Servlet context监听器,当应用范围(servlet context)被创建、销毁或者修改时被调用,监听应用事件,在应用层面,javax.servlet包提供两个监听器接口,支持ServletContext对象状态改变的事件通知: ServletContextListener接口 ServletContextAttributesListener接口,选择监听器接口,根据要监控的对象或者活动,选择要实现的监听器接口,为ServletContext事件选择方法,监控生命周期事件使用ServletContextListener接口: contextInitialized(ServletContextEvent e) 当Web应用准备好处理请求时调用 contextDestroyed(ServletContextEvent e) 当Web应用将被关闭时调用 监控属性事件,使用ServletContextAttributesListener接口: attributeAdded(ServletContextAttributeEvent e) 在为ServletContext增加一个属性后调用 attributeRemoved(ServletContextAttributeEvent e) 在移除ServletContext的一个属性后调用 attributeReplaced(ServletContextAttributeEvent e) 在替换ServletContext的一个属性后调用,为HttpSession事件选择方法,监控生命周期事件,使用HttpSessionListener接口: sessionCreated(HttpSessionEvent e) 当创建一个会话时调用 sessionDestroyed(HttpSessionEvent e) 当销毁一个会话时调用 监控属性事件,使用HttpSessionAttributesListener接口: attributeAdded(HttpSessionBindingEvent e) 在为一个session增加一个属性后调用 attributeRemoved(HttpSessionBindingEvent e) 在移除session的一个属性后调用 attributeReplaced(HttpSessionBindingEvent e) 在session中的属性被另一属性替换后调用,为 ServletRequest事件选择方法,监控生命周期事件,使用ServletRequestListener接口: requestInitialized(ServletRequestEvent e) 当一个请求将要进入Web应用的范围时调用 requestDestroyed(ServletRequestEvent e) 当一个请求将要离开Web应用的范围时调用 监控属性事件,使用ServletRequestAttributesListener 接口: attributeAdded(ServletRequestAttributeEvent e) 在为一个ServletRequest增加属性后调用 attributeRemoved(ServletRequestAttributeEvent e) 在移除ServletRequest的一个属性后调用 attributeReplaced(ServletRequestAttributeEvent e) 在ServletRequest的属性被另一属性替换后调用,部署描述符,要使用servlet监听器类,必须通过在部署描述符中注册监听器类,来告诉servlet容器 元素必须包含一个元素,如下:, AppLifeCycleEvent ,注意: 元素必须出现在部分之前,实例1:装载JDBC驱动和设置ServletContext属性,下面的实例使用ServletContextListener 接口中的contextInitialized方法来: 装载JDBC驱动,并且 设置一个ServletContext属性,属性名为“dbUrl”,属性值为“jdbc:mysql/Fred“ 实例有两个类: 一个监听器类:AppLifeCycleEventDemo 一个servlet:ApplicationEventDemoServlet,AppLifeCycleEventDemo,import javax.servlet.ServletContext; import javax.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 “); catch (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 cse) 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 ServletException, 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 = getServletContext(); / 显示“dbUrl”属性 out.println(servletContext.getAttribute(“dbUrl“); out.println(“); out.println(“); 上面方法中,dbUrl属性的输出为“jdbc:mysql/Fred”,为什么?,部署描述符, AppLifeCycleEventDemo ApplicationEventDemo ApplicationEventDemoServlet ,实例2:ServletContextAttribute监听器,PageCounterServlet 每接收到一次请求,servlet增加一次计数器的值 计数器的值作为ServletContext对象的一个属性进行保存,因此可被该应用的每个servlet访问 然而,如果servlet容器崩溃,将不会丢失该值,因为其被同时写入一个文本文件counter.txt. 该应用有两个类构成: 一个监听器类: AppAttributeEventDemo 一个servlet:PageCounterServlet.,AppAttributeEventDemo,import javax.servlet.ServletContext; import javax.servlet.ServletContextListener; import javax.servlet.ServletContextEvent; 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 contextInitialized(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.getServletContext(); 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(“ServletContext 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 writeCounter(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(); 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 ServletException, 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(“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对象创建时被触发 事件在一个HttpSession对象被销毁时被raised HttpSessionAttributeListener 当一个HttpSession的属性被增加、移除、修改时,提供事件的触发,HttpSessionListener接口,HttpSessionListener接口有两个方法: public void sessionCreated(HttpSessionEvent se) 该方法当HttpSession对象被创建时,被自动调用 public void sessionDestroyed(HttpSessionEvent se) 当一个HttpSession对象变得无效时,被自动调用 两个方法都将在一个HttpSessionEvent对象类中被传递 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 max session counts to 0 public 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 console public void contextDestroyed(ServletContextEvent 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 sessions public void sessionCreated(HttpSessionEvent arg0) ServletContext sc = arg0.getSession().getServletContext(); 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 count public void sessionDestroyed(HttpSessionEvent arg0) ServletContext sc = arg0.getSession().getServletContext(); setCurrentSessions(sc, getCurrentSessions(sc) - 1 ); ,实例: 用户计数器(HttpSessionListener ),下面的实例是一个计数器,计算当前会话中的不同用户的个数 为一个用户初次请求servlet,创建一个HttpSession对象 如果用户返回同一servlet,不会再次创建第二个 HttpSession对象。因此,计数器只有当HttpSession对象创建时才累加 一个HttpSession对象被销毁时,计数器累减 由于该计数器要被所有用户访问,因此作为ServletContext对象的属性保存,该实例有两个类,一个监听器类:SessionLifeCycleEventDemo 实现ServletContextListener和 HttpSessionListener接口 一个servlet类,用于显示计数器的值,计数器实现方法,首先,创建一个ServletContext属性,取初值为0 注意:ServletContext对象被赋予一个 servletContext变量,可在类中的任何位置使用,监听HttpSession事件,当一HttpSession被创建或者销毁时,计数器需要递增或者递减,计数器实现方法(续),incrementUserCounter方法 首先,从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.ServletContext; import javax.servlet.ServletContextEvent; public class SessionLifeCycleEventDemo implements ServletContextListener, HttpSessionListener ServletContext servletContext; int counter = 0; public void contextInitialized(ServletContextEvent sce) servletContext = sce.getServletContext(); servletContext.setAttribute(“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.“); decrementUserCounter(); synchronized void incrementUserCounter() counter = Integer.parseInt( (String)servletContext.getAttribute(“userCounter“); coun

温馨提示

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

评论

0/150

提交评论