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

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

          Posted on 2010-03-13 23:01 asdtiang 閱讀(582) 評論(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美元)
          主站蜘蛛池模板: 尤溪县| 汪清县| 治县。| 莆田市| 泌阳县| 丰镇市| 东兰县| 简阳市| 改则县| 汝城县| 贵定县| 彰化市| 大同市| 苗栗市| 多伦县| 巴马| 普安县| 宜宾县| 永城市| 新民市| 瓦房店市| 鄂托克前旗| 陵水| 清远市| 磐石市| 米林县| 内黄县| 阿拉善左旗| 同德县| 雅江县| 葫芦岛市| 钟祥市| 五寨县| 东安县| 成安县| 松滋市| 陕西省| 中西区| 福海县| 和林格尔县| 蒙城县|