asdtiang的博客 感謝blogjava提供的博客交流平臺

          JSP容器的初始化和銷毀(轉)

          Posted on 2010-03-13 23:01 asdtiang 閱讀(577) 評論(0)  編輯  收藏 所屬分類: java ee

          ServletContext 被 Servlet 程序用來與 Web 容器通信。例如寫日志,轉發請求。每一個 Web 應用程序含有一個Context,被Web應用內的各個程序共享。因為Context可以用來保存資源并且共享,所以我所知道的 ServletContext 的最大應用是Web緩存----把不經常更改的內容讀入內存,所以服務器響應請求的時候就不需要進行慢速的磁盤I/O了。

          ServletContextListener 是 ServletContext 的監聽者,如果 ServletContext 發生變化,如服務器啟動時 ServletContext 被創建,服務器關閉時 ServletContext 將要被銷毀。

          在JSP文件中,application 是 ServletContext 的實例,由JSP容器默認創建。Servlet 中調用 getServletContext()方法得到 ServletContext 的實例。

          我們使用緩存的思路大概是:

          1. 服務器啟動時,ServletContextListener 的 contextInitialized()方法被調用,所以在里面創建好緩存。可以從文件中或者從數據庫中讀取取緩存內容生成類,用 ervletContext.setAttribute()方法將緩存類保存在 ServletContext 的實例中。

          2. 程序使用 ServletContext.getAttribute()讀取緩存。如果是 JSP,使用a pplication.getAttribute()。如果是 Servlet,使用 getServletContext().getAttribute()。如果緩存發生變化(如訪問計數),你可以同時更改緩存和文件/數據庫。或者你等 變化積累到一定程序再保存,也可以在下一步保存。

          3. 服務器將要關閉時,ServletContextListener 的 contextDestroyed()方法被調用,所以在里面保存緩存的更改。將更改后的緩存保存回文件或者數據庫,更新原來的內容。


          在Struts中實現系統的初始化工作

          在Struts中,我們可以寫一個Servlet讓它繼承于ActionServlet并覆 蓋其init()方法,然后修改web.xml文件的Struts啟動相關配置來達到目的。  

          Java代碼
          1. package fangwei.servlet;  
          2.   
          3. import javax.servlet.ServletException;  
          4. import org.apache.struts.action.ActionServlet;  
          5.   
          6. /** 
          7.  * 系 統唯一的Servlet類BaseServlet<br> 
          8.  * 完成系統初始化的工作 
          9.  */  
          10. public class BaseServlet extends ActionServlet {  
          11.   
          12.     private static final long serialVersionUID = -4743066925691800288L;  
          13.   
          14.     @Override  
          15.     /* 
          16.      * 系 統初始化 
          17.      */  
          18.     public void init() throws ServletException {  
          19.         super.init();  
          20.   
          21.         // 初始化系統全局變量  
          22.         // ...  
          23.   
          24.         // 加載自定義配置文件  
          25.         // ...  
          26.   
          27.         // 啟動定時任務  
          28.         // ...  
          29.     }  
          30.   
          31. }   
          Xml代碼
          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <web-app>  
          3.   <!-- struts servlet begin -->  
          4.   <servlet>  
          5.     <servlet-name>struts</servlet-name>  
          6.     <servlet-class>fangwei.servlet.BaseServlet</servlet-class>  
          7.     <init-param>  
          8.       <param-name>config</param-name>  
          9.       <param-value>/WEB-INF/struts/struts-config.xml</param-value>  
          10.     </init-param>  
          11.     <load-on-startup>0</load-on-startup>  
          12.   </servlet>  
          13.   <servlet-mapping>  
          14.     <servlet-name>struts</servlet-name>  
          15.     <url-pattern>*.do</url-pattern>  
          16.   </servlet-mapping>  
          17.   <!-- struts servlet end -->  
          18. </web-app>  

           那么,在Struts2中我 們應該怎么做呢? 

           

          Struts2中實現系統的初始化工作

          Struts2中,我們可以寫一個filter讓它繼承于FilterDispatcher并覆蓋其 init()方法,然后修改web.xml文件的Struts2啟動相關配置來達到目的。  

          Java代碼
          1. package fangwei.filter;  
          2.   
          3. import javax.servlet.FilterConfig;  
          4. import javax.servlet.ServletException;  
          5.   
          6. import org.apache.struts2.dispatcher.FilterDispatcher;  
          7.   
          8. public class BaseFilterDispatcher extends FilterDispatcher {  
          9.   
          10.     @Override  
          11.     public void init(FilterConfig arg0) throws ServletException {  
          12.         super.init(arg0);  
          13.   
          14.         // 初始化系統全局變量  
          15.         // ...  
          16.   
          17.         // 加載自定義配置文件  
          18.         // ...  
          19.   
          20.         // 啟動定時任務  
          21.         // ...  
          22.     }  
          23.   
          24. }  

           

          Xml代碼
          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <web-app>  
          3.   <filter>  
          4.     <filter-name>struts2</filter-name>  
          5.     <filter-class>fangwei.filter.BaseFilterDispatcher</filter-class>  
          6.   </filter>  
          7.   <filter-mapping>  
          8.     <filter-name>struts2</filter-name>  
          9.     <url-pattern>/*</url-pattern>  
          10.   </filter-mapping>  
          11. </web-app>  

           

          思考

          不管是Struts、Struts2還是其他的web層框架,它們目前基于的技術都是 Servlet,只要根據web.xml找到那個啟動類,我們就能通過覆蓋該類的的init()方法來實現系統的初始化工作。

           

          比較優雅的實現系統的初始化工作

          以上的實現方式都侵入了框架的原生類,利用Servlet 容器的特性我們可以更優雅的實現系統的初始化工作。 我們可以寫一個listener讓它實現ServletContextListener接 口,在contextInitialized()方法中做想做的事情。將此listener配置到web.xml中,Servlet容器如tomcat會 在啟動該web應用程序時調用此方法。

           

           

          Java代碼
          1. package fangwei.listener;  
          2.   
          3. import javax.servlet.ServletContextEvent;  
          4. import javax.servlet.ServletContextListener;  
          5.   
          6. public class InitListener implements ServletContextListener {  
          7.   
          8.     public void contextDestroyed(ServletContextEvent sce) {  
          9.         System.out.println("web exit ... ");  
          10.     }  
          11.   
          12.     public void contextInitialized(ServletContextEvent sce) {  
          13.         System.out.println("web init ... ");  
          14.         //系統的初始化工作  
          15.         // ...  
          16.     }  
          17.   
          18. }  

           

          Xml代碼
          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <web-app>  
          3.   <listener>  
          4.     <listener-class>fangwei.listener.InitListener</listener-class>  
          5.   </listener>  
          6.   <filter>  
          7.     <filter-name>struts2</filter-name>  
          8.     <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
          9.   </filter>  
          10.   <filter-mapping>  
          11.     <filter-name>struts2</filter-name>  
          12.     <url-pattern>/*</url-pattern>  
          13.   </filter-mapping>  
          14. </web-app> 


          天蒼蒼,野茫茫,風吹草底見牛羊

          posts - 80, comments - 24, trackbacks - 0, articles - 32

          Copyright © asdtiang

          asdtiang的博客 PaidMailz
          點擊廣告網賺A(每天4個廣告,每個0.0025美元,一個搜索廣告0.03美元)
          主站蜘蛛池模板: 张掖市| 江永县| 南川市| 襄樊市| 永胜县| 中西区| 绥芬河市| 炎陵县| 平潭县| 鄂伦春自治旗| 东山县| 杨浦区| 金秀| 乐昌市| 民权县| 噶尔县| 滕州市| 合阳县| 凤阳县| 广元市| 秦皇岛市| 麟游县| 耿马| 沛县| 福州市| 罗甸县| 西宁市| 大丰市| 曲阜市| 凤山县| 登封市| 阳信县| 金堂县| 甘孜县| 东兰县| 韶山市| 无为县| 巴马| 千阳县| 阳东县| 维西|