<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

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

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

    ServletContextListener 是 ServletContext 的監(jiān)聽者,如果 ServletContext 發(fā)生變化,如服務(wù)器啟動時 ServletContext 被創(chuàng)建,服務(wù)器關(guān)閉時 ServletContext 將要被銷毀。

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

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

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

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

    3. 服務(wù)器將要關(guān)閉時,ServletContextListener 的 contextDestroyed()方法被調(diào)用,所以在里面保存緩存的更改。將更改后的緩存保存回文件或者數(shù)據(jù)庫,更新原來的內(nèi)容。


    在Struts中實現(xiàn)系統(tǒng)的初始化工作

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

    Java代碼
    1. package fangwei.servlet;  
    2.   
    3. import javax.servlet.ServletException;  
    4. import org.apache.struts.action.ActionServlet;  
    5.   
    6. /** 
    7.  * 系 統(tǒng)唯一的Servlet類BaseServlet<br> 
    8.  * 完成系統(tǒng)初始化的工作 
    9.  */  
    10. public class BaseServlet extends ActionServlet {  
    11.   
    12.     private static final long serialVersionUID = -4743066925691800288L;  
    13.   
    14.     @Override  
    15.     /* 
    16.      * 系 統(tǒng)初始化 
    17.      */  
    18.     public void init() throws ServletException {  
    19.         super.init();  
    20.   
    21.         // 初始化系統(tǒng)全局變量  
    22.         // ...  
    23.   
    24.         // 加載自定義配置文件  
    25.         // ...  
    26.   
    27.         // 啟動定時任務(wù)  
    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中實現(xiàn)系統(tǒng)的初始化工作

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

    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.         // 初始化系統(tǒng)全局變量  
    15.         // ...  
    16.   
    17.         // 加載自定義配置文件  
    18.         // ...  
    19.   
    20.         // 啟動定時任務(wù)  
    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層框架,它們目前基于的技術(shù)都是 Servlet,只要根據(jù)web.xml找到那個啟動類,我們就能通過覆蓋該類的的init()方法來實現(xiàn)系統(tǒng)的初始化工作。

     

    比較優(yōu)雅的實現(xiàn)系統(tǒng)的初始化工作

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

     

     

    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.         //系統(tǒng)的初始化工作  
    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
    點擊廣告網(wǎng)賺A(每天4個廣告,每個0.0025美元,一個搜索廣告0.03美元)
    主站蜘蛛池模板: 啊灬啊灬别停啊灬用力啊免费看| 亚洲尤码不卡AV麻豆| 国产亚洲精品美女久久久久久下载| 亚洲精品无码久久久久AV麻豆| 在线成人精品国产区免费| 国产午夜精品理论片免费观看| 日本久久久久亚洲中字幕| 成人免费a级毛片无码网站入口| 久久精品亚洲一区二区三区浴池 | 久久丫精品国产亚洲av不卡| 妞干网手机免费视频| 国产免费一区二区三区不卡| 77777亚洲午夜久久多喷| 亚洲一区二区三区香蕉| 免费看国产成年无码AV片| 久久不见久久见免费影院www日本| 亚洲另类春色国产精品| 亚洲午夜精品一级在线播放放| 免费看黄视频网站| 色www永久免费网站| 亚洲hairy多毛pics大全| heyzo亚洲精品日韩| 中文字幕免费播放| 亚洲日韩国产欧美一区二区三区| 免费欧洲毛片A级视频无风险| 特级一级毛片免费看| 亚洲韩国在线一卡二卡| 国产成人A在线观看视频免费| 在线免费观看h片| 国产精品亚洲五月天高清| 亚洲精品网站在线观看你懂的| 国产亚洲精品看片在线观看| 卡1卡2卡3卡4卡5免费视频| 国内精自视频品线六区免费| 久草免费福利视频| 伊人久久五月丁香综合中文亚洲 | 8x成人永久免费视频| 黄色短视频免费看| 一级毛片在线完整免费观看| 亚洲欧美熟妇综合久久久久| 亚洲国产成人精品无码区在线秒播|