首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【转载】ServletContextListener施用详解

2012-10-30 
【转载】ServletContextListener使用详解/** * 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后

【转载】ServletContextListener使用详解

/** * 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化, * 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。 */contextInitialized(ServletContextEvent sce) /** * 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。 */contextDestroyed(ServletContextEvent sce)?

?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服务器在启动时,会直接加载该监听器,通过以下的应用程序就可以进行数据的访问。

?

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();     } }

?

例二:书写一个类用于统计当Web应用启动后,网页被客户端访问的次数。如果重新启动Web应用,计数器不会重新从1开始统计访问次数,而是从上次统计的结果上进行累加。

?

在实际应用中,往往需要统计自Web应用被发布后网页被客户端访问的次数,这就要求当Web应用被终止时,计数器的数值被永久存储在一个文件中或者数据库中,等到Web应用重新启动时,先从文件或数据库中读取计数器的初始值,然后在此基础上继续计数。

?

向文件中写入或读取计数器的数值的功能可以由自定义的 MyServletContextListener类来完成,它具有以下功能:

?

1、在 Web 应用启动时从文件中读取计数器的数值,并把表示计数器的 Counter对象存放到 Web 应用范围内。存放计数器的文件的路径为helloapp/count/count.txt。

2、在Web应用终止时把Web应用范围内的计数器的数值保存到count.txt文件中。

public class MyServletContextListener implements ServletContextListener{  public void contextInitialized(ServletContextEvent sce){    System.out.println("helloapp application is Initialized.");    // 获取 ServletContext 对象    ServletContext context=sce.getServletContext();    try{       // 从文件中读取计数器的数值       BufferedReader reader=new BufferedReader(           new InputStreamReader(context.           getResourceAsStream("/count/count.txt")));       int count=Integer.parseInt(reader.readLine());       reader.close();       // 创建计数器对象       Counter counter=new Counter(count);       // 把计数器对象保存到 Web 应用范围       context.setAttribute("counter",counter);       } catch(IOException e) {          e.printStackTrace();       }   }   public void contextDestroyed(ServletContextEvent sce){       System.out.println("helloapp application is Destroyed.");       // 获取 ServletContext 对象       ServletContext context=sce.getServletContext();       // 从 Web 应用范围获得计数器对象       Counter counter=(Counter)context.getAttribute("counter");       if(counter!=null){       try{          // 把计数器的数值写到 count.txt 文件中          String filepath=context.getRealPath("/count");          filepath=filepath+"/count.txt";          PrintWriter pw=new PrintWriter(filepath);          pw.println(counter.getCount());          pw.close();         } catch(IOException e) {             e.printStackTrace();         }     }   }} 
?

<listener><listener-class> ServletContextTest .MyServletContextListener<listener-class /></listener>

?

通过上述两个例子,即可以非常清楚的了解到ServletContextListener接口的使用方法及技巧。

?

在Container加载Web应用程序时(例如启动 Container之后),会呼叫contextInitialized(),而当容器移除Web应用程序时,会呼叫contextDestroyed ()方法。

?

通过Tomcat 控制台的打印结果的先后顺序,会发现当 Web 应用启动时,Servlet容器先调用contextInitialized()方法,再调用lifeInit的init()方法;

当Web应用终止时,Servlet容器先调用lifeInit的destroy()方法,再调用contextDestroyed()方法。

?

由此可见,在Web应用的生命周期中,ServletContext对象最早被创建,最晚被销毁。

?

原文地址:http://blog.csdn.net/zhaozheng7758/archive/2010/12/28/6103700.aspx

热点排行