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

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

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

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

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

    Posted on 2010-03-13 23:01 asdtiang 閱讀(574) 評論(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()方法被調用,所以在里面創建好緩存??梢詮奈募谢蛘邚臄祿熘凶x取取緩存內容生成類,用 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美元)
    主站蜘蛛池模板: 精品视频在线免费观看| 国内免费高清在线观看| 免费va在线观看| 亚洲中文字幕无码爆乳av中文| 亚洲av无码一区二区三区天堂古代| 88av免费观看| 亚洲国产成人久久综合区| 久久久久亚洲av无码专区导航| 无码午夜成人1000部免费视频| 亚洲av无码精品网站| 97在线视频免费| 亚洲人成人77777网站不卡| 无码免费午夜福利片在线| 亚洲最大激情中文字幕| 一本色道久久综合亚洲精品蜜桃冫| 一个人看的www在线观看免费| 一本色道久久88亚洲精品综合| 麻豆国产VA免费精品高清在线| 久久亚洲高清观看| 欧美亚洲精品一区二区| 亚洲福利视频一区二区| 香蕉视频在线免费看| 永久免费bbbbbb视频| 污污免费在线观看| 亚洲大尺度无码无码专区| 91精品视频在线免费观看| 亚洲乱码无人区卡1卡2卡3| 亚洲情a成黄在线观看| 日本卡1卡2卡三卡免费| 亚洲 日韩 色 图网站| 巨波霸乳在线永久免费视频| 亚洲色最新高清av网站| 久久激情亚洲精品无码?V | 久久久久亚洲av无码专区导航| 日本h在线精品免费观看| 怡红院亚洲红怡院在线观看| 中字幕视频在线永久在线观看免费 | 亚洲欧洲精品在线| 免费黄色app网站| 国产午夜无码精品免费看动漫| 亚洲AV无码精品蜜桃|