ServletContextListener使用详解
来源:互联网 发布:注册淘宝企业店铺 编辑:程序博客网 时间:2024/05/07 07:26
概述
在 Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。
当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由 ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法。
- contextInitialized(ServletContextEvent sce) :当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。
- contextDestroyed(ServletContextEvent sce) :当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。
举例
例一:在服务启动时,将数据库中的数据加载进内存,并将其赋值给一个属性名,其它的 Servlet 就可以通过 getAttribute 进行属性值的访问。有如下两个步骤:
ServletContext 对象是一个为整个 web 应用提供共享的内存,任何请求都可以访问里面的内容
如何实现在服务启动的时候就动态的加入到里面的内容:我们需要做的有:
- 实现 servletContextListerner 接口 并将要共享的通过 setAttribute ( name,data )方法提交到内存中去
- 应用项目通过 getAttribute(name) 将数据取到
package ServletContextTest; import Java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import util.ConnectTool; public class ServletContextLTest implements ServletContextListener{ // 实现其中的销毁函数 public void contextDestroyed(ServletContextEvent sce) { System.out.println("this is last destroyeed"); } // 实现其中的初始化函数,当有事件发生时即触发 public void contextInitialized(ServletContextEvent sce{ ServletContext sct=sce.getServletContext(); Map<Integer,String> depts=new HashMap<Integer,String>(); Connection connection=null; PreparedStatement pstm=null; ResultSet rs=null; try{ connection=ConnectTool.getConnection(); String sql="select deptNo,dname from dept"; pstm=connection.prepareStatement(sql); rs=pstm.executeQuery(); while(rs.next()){ depts.put(rs.getInt(1), rs.getString(2)); } // 将所取到的值存放到一个属性键值对中 sct.setAttribute("dept", depts); System.out.println("======listener test is beginning========="); }catch(Exception e){ e.printStackTrace(); }finally{ ConnectTool.releasersc(rs, pstm, connection); } } }
在完成上述编码后,仍需在 web.xml 中进行如下配置,以使得该监听器可以起作用。
<listener> <listener-class>ServletContextTest.ServletContextLTest</listener-class></listener>
在完成上述配置后, web 服务器在启动时,会直接加载该监听器,通过以下的应用程序就可以进行数据的访问。
package ServletContextTest; import java.io.IOException; import java.io.PrintWriter; import java.util.*; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CreateEmployee extends HttpServlet{ @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext sct=getServletConfig().getServletContext(); // 从上下文环境中通过属性名获取属性值 Map<Integer,String> dept=(Map<Integer,String>)sct.getAttribute("dept"); Set<Integer> key=dept.keySet(); response.setContentType("text/html;charset=utf-8"); PrintWriter out=response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<form action='/register' action='post'>"); out.println("<table alignb='center'>"); out.println("<tr>"); out.println("<td>"); out.println("username:"); out.println("</td>"); out.println("<td>"); out.println("<input type='text' name='username'"); out.println("</tr>"); out.println("<tr>"); out.println("<td>"); out.println("city:"); out.println("</td>"); out.println("<td>"); out.println("<select name='dept'"); for(Integer i:key){ out.println("<option value='"+i+"'>"+dept.get(i)+"</option>"); } out.println("</select>"); out.println("</td>"); out.println("<tr>"); out.println("</table>"); out.println("</form>"); out.println("</body>"); out.println("</html>"); out.flush(); } }
即可以非常清楚的了解到 ServletContextListener 接口的使用方法及技巧。 在Container 加载Web 应用程序时(例如启动 Container 之后),会呼叫contextInitialized() ,而当容器移除Web 应用程序时,会呼叫contextDestroyed () 方法。 通过 Tomcat 控制台的打印结果的先后顺序,会发现当 Web 应用启动时,Servlet 容器先调用contextInitialized() 方法,再调用lifeInit 的init() 方法;当Web 应用终止时,Servlet 容器先调用lifeInit 的destroy() 方法,再调用contextDestroyed() 方法。由此可见,在Web 应用的生命周期中,ServletContext 对象最早被创建,最晚被销毁。
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener作用、使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- ServletContextListener使用详解
- 多线程/多进程的使用场景-Android
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- java socket
- 机器学习(二) - 一个最简单的线性分类模拟人脑神经工作
- 他们是有组织有预谋的
- ServletContextListener使用详解
- java/oracle日期处理
- 【bzoj1857】 Scoi2010—传送带
- Linux命令行与shell编程笔记-13处理用户输入
- HashMap、HashTable
- 进入组策略编辑器
- AngularJS 的小demo——表头排序+表格搜索(过滤器)
- Mysql入门(四)之数据高级操作
- JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue .