乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Java三大器之監(jiān)聽器(Listener)的工作原理和代碼演示

       昵稱27831725 2018-03-13
                            現(xiàn)在來說說Servlet的監(jiān)聽器Listener,它是實現(xiàn)了javax.servlet.ServletContextListener 接口的服務(wù)器端程序,它也是隨web應(yīng)用的啟動
      而啟動,只初始化一次,隨web應(yīng)用的停止而銷毀。主要作用是:做一些初始化的內(nèi)容添加工作、設(shè)置一些基本的內(nèi)容、比如一些參數(shù)或者是一些

      固定的對象等等。首先來看一下ServletContextListener接口的源代碼:

      1. public abstract interface ServletContextListener extends EventListener{  
      2.     public abstract void contextInitialized(ServletContextEvent paramServletContextEvent);  
      3.     public abstract void contextDestroyed(ServletContextEvent paramServletContextEvent);  
      4. }  

      下面利用監(jiān)聽器對數(shù)據(jù)庫連接池DataSource的初始化演示它的使用:ListenerTest.java
      1. import javax.servlet.ServletContext;     
      2. import javax.servlet.ServletContextEvent;     
      3. import javax.servlet.ServletContextListener;     
      4. import org.apache.commons.dbcp.BasicDataSource;         
      5. /** 
      6.  * 現(xiàn)在來說說Servlet的監(jiān)聽器Listener,它是實現(xiàn)了javax.servlet.ServletContextListener 接口的 
      7.  * 服務(wù)器端程序,它也是隨web應(yīng)用的啟動而啟動,只初始化一次,隨web應(yīng)用的停止而銷毀。主要作用是:做一些初始化 
      8.  * 的內(nèi)容添加工作、設(shè)置一些基本的內(nèi)容、比如一些參數(shù)或者是一些固定的對象等等。 
      9.  *  
      10.  * 示例代碼:使用監(jiān)聽器對數(shù)據(jù)庫連接池DataSource進行初始化 
      11.  */   
      12. public class ListenerTest implements ServletContextListener{       
      13.    // 應(yīng)用監(jiān)聽器的銷毀方法     
      14.    public void contextDestroyed(ServletContextEvent servletContextEvent) {     
      15.         ServletContext servletContext = servletContextEvent.getServletContext();  
      16.         // 在整個web應(yīng)用銷毀之前調(diào)用,將所有應(yīng)用空間所設(shè)置的內(nèi)容清空  
      17.         servletContext.removeAttribute("dataSource");  
      18.         System.out.println("銷毀工作完成...");    
      19.    }     
      20.     // 應(yīng)用監(jiān)聽器的初始化方法     
      21.     public void contextInitialized(ServletContextEvent servletContextEvent) {     
      22.         // 通過這個事件可以獲取整個應(yīng)用的空間     
      23.         // 在整個web應(yīng)用下面啟動的時候做一些初始化的內(nèi)容添加工作     
      24.         ServletContext servletContext = servletContextEvent.getServletContext();    
      25.         // 設(shè)置一些基本的內(nèi)容;比如一些參數(shù)或者是一些固定的對象     
      26.         // 創(chuàng)建DataSource對象,連接池技術(shù) dbcp     
      27.         BasicDataSource basicDataSource = new BasicDataSource();   
      28.         basicDataSource.setDriverClassName("com.jdbc.Driver");   
      29.         basicDataSource.setUrl("jdbc:mysqlocalhost:3306/");   
      30.         basicDataSource.setUsername("root");     
      31.         basicDataSource.setPassword("root");     
      32.         basicDataSource.setMaxActive(10);//最大連接數(shù)     
      33.         basicDataSource.setMaxIdle(5);//最大管理數(shù)     
      34.         //bds.setMaxWait(maxWait); 最大等待時間     
      35.         // 把 DataSource 放入ServletContext空間中,     
      36.         // 供整個web應(yīng)用的使用(獲取數(shù)據(jù)庫連接)  
      37.         servletContext.setAttribute("dataSource", basicDataSource);     
      38.         System.out.println("應(yīng)用監(jiān)聽器初始化工作完成...");     
      39.         System.out.println("已經(jīng)創(chuàng)建DataSource...");    
      40.     }     
      41. }  

      web.xml中配置如下,很簡單:

      1. <!-- 配置應(yīng)用監(jiān)聽器  -->     
      2. <listener>     
      3.     <listener-class>com.ycq.ListenerTest</listener-class>     
      4. </listener>    

      這樣配置好了之后,以后在web應(yīng)用中就可以通過ServletContext取得BasicDataSource對象,從而獲取與數(shù)據(jù)庫的連接,提高性能,方便使用。

      示例代碼二:

      1. import java.io.File;  
      2. import javax.servlet.ServletContextEvent;  
      3. import javax.servlet.ServletContextListener;  
      4. import com.i2f.fsp.deploy.TransactionDeployer;  
      5. /** 
      6.  * 監(jiān)聽器隨著項目的啟動而啟動 
      7.  * 
      8.  */  
      9. public class ListenerTest2 implements ServletContextListener{  
      10.     // 銷毀監(jiān)聽器   
      11.     public void contextDestroyed(ServletContextEvent servletContextEvent) {  
      12.         System.out.println("date20161020095500 :" + servletContextEvent.getServletContext());  
      13.     }  
      14.     public void contextInitialized(ServletContextEvent servletContextEvent) {  
      15.         try{  
      16.             // 獲取項目跟路徑  
      17.             String basePath = servletContextEvent.getServletContext().getRealPath("/");  
      18.             // D:\apache-tomcat-6.0.41\webapps\i2money\ 絕對路徑  
      19.             System.out.println("basePath20161020094700 :" + basePath);  
      20.             if (!(basePath.endsWith(File.separator))){  
      21.                 basePath = basePath + File.separator;  
      22.             }  
      23.             basePath = basePath + "WEB-INF" + File.separator + "classes" + File.separator;  
      24.             new TransactionDeployer(basePath).deploy();  
      25.             // D:\apache-tomcat-6.0.41\webapps\i2money\WEB-INF\classes\  
      26.             System.out.println("basePath20161020094701 :" + basePath);  
      27.         }  
      28.         catch (Exception e){  
      29.             e.printStackTrace();  
      30.             System.exit(-1);  
      31.         }  
      32.     }  
      33. }  

      示例代碼三:

      1. import javax.servlet.http.HttpSession;  
      2. import javax.servlet.http.HttpSessionEvent;  
      3. import javax.servlet.http.HttpSessionListener;  
      4. import org.apache.commons.logging.Log;  
      5. import org.apache.commons.logging.LogFactory;  
      6. import org.springframework.context.ApplicationContext;  
      7. import org.springframework.web.context.support.WebApplicationContextUtils;  
      8. public class UserLogoutListener implements HttpSessionListener{  
      9.     protected final Log log = LogFactory.getLog(super.getClass());  
      10.     public void sessionCreated(HttpSessionEvent event){  
      11.         this.log.error("session created. id = " + event.getSession().getId());  
      12.     }  
      13.     public void sessionDestroyed(HttpSessionEvent event){  
      14.         this.log.error("session destroyed.id = " + event.getSession().getId());  
      15.         HttpSession session = event.getSession();  
      16.         ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext());  
      17.         OnlineUserMonitorClient client = (OnlineUserMonitorClient)context.getBean("onlineUserMonitorClient");  
      18.         client.afterSessionDestroyed(session);  
      19.     }  
      20. }  

      監(jiān)聽器在實際項目中的應(yīng)用,監(jiān)聽器在java web中應(yīng)用的較多,比如:統(tǒng)計當前在線人數(shù)、自定義session掃描器。
      --------------------- 應(yīng)用一:統(tǒng)計當前在線人數(shù) ---------------------

      1. import javax.servlet.ServletContext;  
      2. import javax.servlet.http.HttpSessionEvent;  
      3. import javax.servlet.http.HttpSessionListener;  
      4. /** 
      5.  * @description HttpSessionListener監(jiān)聽器實現(xiàn)統(tǒng)計網(wǎng)站在線人數(shù)的功能 
      6.  */  
      7. public class SessionListener implements HttpSessionListener{  
      8.   
      9.     public static int TOTAL_ONLINE_USERS = 0;  
      10.     public void sessionCreated(HttpSessionEvent httpSessionEvent) {  
      11.         ServletContext servletContext = httpSessionEvent.getSession().getServletContext();  
      12.         TOTAL_ONLINE_USERS = (Integer) servletContext.getAttribute("TOTAL_ONLINE_USERS");  
      13.         // 如果用戶退出,TOTAL_ONLINE_USERS自減1  
      14.         if(TOTAL_ONLINE_USERS == 0){  
      15.             servletContext.setAttribute("TOTAL_ONLINE_USERS", 1);  
      16.         }  
      17.         else{  
      18.             TOTAL_ONLINE_USERS--;  
      19.             servletContext.setAttribute("TOTAL_ONLINE_USERS", TOTAL_ONLINE_USERS);  
      20.         }  
      21.     }  
      22.   
      23.     public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {  
      24.         ServletContext servletContext = httpSessionEvent.getSession().getServletContext();  
      25.         TOTAL_ONLINE_USERS = (Integer) servletContext.getAttribute("TOTAL_ONLINE_USERS");  
      26.         // 如果用戶登錄,TOTAL_ONLINE_USERS自增1  
      27.         if(TOTAL_ONLINE_USERS == 0){  
      28.             servletContext.setAttribute("TOTAL_ONLINE_USERS", 1);  
      29.         }  
      30.         else{  
      31.             TOTAL_ONLINE_USERS++;  
      32.             servletContext.setAttribute("TOTAL_ONLINE_USERS", TOTAL_ONLINE_USERS);  
      33.         }  
      34.     }  
      35. }  

      --------------------- 應(yīng)用二:自定義session掃描器 ---------------------

      1. import java.util.LinkedList;  
      2. import java.util.List;  
      3. import java.util.Timer;  
      4. import javax.servlet.ServletContextEvent;  
      5. import javax.servlet.ServletContextListener;  
      6. import javax.servlet.http.HttpSession;  
      7. import javax.servlet.http.HttpSessionEvent;  
      8. import javax.servlet.http.HttpSessionListener;  
      9. import jeus.util.concurrent50.Collections;  
      10. /** 
      11.  * @description 當網(wǎng)站用戶量增加時,session占用的內(nèi)存會越來越大,這時session的管理,將會是一項很大的 
      12.  * 系統(tǒng)開銷,為了高效的管理session,我們可以寫一個監(jiān)聽器,定期清理掉過期的session 
      13.  */  
      14. public class SessionScanerListener implements HttpSessionListener,ServletContextListener{  
      15.     // 創(chuàng)建一個線程安全的集合,用來存儲session  
      16.     @SuppressWarnings("unchecked")  
      17.     List<HttpSession> sessionList = Collections.synchronizedList(new LinkedList<HttpSession>());  
      18.     private Object lock = new Object();  
      19.       
      20.     public void sessionCreated(HttpSessionEvent httpSessionEvent) {  
      21.         System.out.println("session 創(chuàng)建成功...");  
      22.         HttpSession httpSession = httpSessionEvent.getSession();  
      23.         synchronized (lock){  
      24.             sessionList.add(httpSession);  
      25.         }  
      26.     }  
      27.   
      28.     public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {  
      29.         System.out.println("session 銷毀成功...");  
      30.     }  
      31.     // web應(yīng)用關(guān)閉時觸發(fā)contextDestroyed事件  
      32.     public void contextDestroyed(ServletContextEvent servletContextEvent) {  
      33.         System.out.println("web應(yīng)用關(guān)閉...");  
      34.     }  
      35.   
      36.     // web應(yīng)用啟動時觸發(fā)contextInitialized事件  
      37.     public void contextInitialized(ServletContextEvent servletContextEvent) {  
      38.         System.out.println("web應(yīng)用初始化...");  
      39.         // 創(chuàng)建定時器  
      40.         Timer timer = new Timer();  
      41.         // 每隔30秒就定時執(zhí)行任務(wù)  
      42.         timer.schedule(new MyTask(sessionList,lock), 0, 1000*30);  
      43.     }  
      44. }  

      1. import java.util.List;  
      2. import java.util.ListIterator;  
      3. import java.util.TimerTask;  
      4. import javax.servlet.http.HttpSession;  
      5. /** 
      6.  * 定時器,定義定時任務(wù)的具體內(nèi)容 
      7.  */  
      8. public class MyTask extends TimerTask{  
      9.     private List<HttpSession> list;  
      10.     // 存儲傳遞過來的鎖  
      11.     private Object lock;  
      12.     // 構(gòu)造方法  
      13.     MyTask(List<HttpSession> list, Object lock){  
      14.         this.list = list;  
      15.         this.lock = lock;  
      16.     }  
      17.     @Override  
      18.     public void run() {  
      19.         // 考慮到多線程的情況,這里必須要同步  
      20.         synchronized (lock){  
      21.             System.out.println("定時器開始執(zhí)行...");  
      22.             ListIterator<HttpSession> listIterator = list.listIterator();  
      23.             while(listIterator.hasNext()){  
      24.                 HttpSession httpSession = listIterator.next();  
      25.                 // httpSession.getLastAccessedTime() = session的最后訪問時間  
      26.                 if(System.currentTimeMillis() - httpSession.getLastAccessedTime() > 1000*30){  
      27.                     // 手動銷毀session  
      28.                     httpSession.invalidate();  
      29.                     // 從集合中移除已經(jīng)被銷毀的session  
      30.                     listIterator.remove();  
      31.                 }  
      32.             }  
      33.         }  
      34.     }  
      35. }  


        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多