閱讀983 返回首頁    go 汽車大全


JavaWeb中web.xml初始化加載順序

需求說明

做項目時,為了省事,起初把初始化的配置都放在每個類中 static加載,初始化配置一多,就想把它給整理一下,這裏使用servlet中的init方法初始化。

web.xml說明

首先了解下web.xml中元素的加載順序:

  • 啟動web項目後,web容器首先回去找web.xml文件,讀取這個文件

  • 容器會創建一個 ServletContext ( servlet 上下文),整個 web 項目的所有部分都將共享這個上下文

  • 容器將 轉換為鍵值對,並交給 servletContext

  • 容器創建 中的類實例,創建監聽器

  • 容器加載filter,創建過濾器, 要注意對應的filter-mapping一定要放在filter的後麵

  • 容器加載servlet,加載順序按照 Load-on-startup 來執行

完整加載順序:ServletContext -> context-param -> listener-> filter -> servlet

配置實現

InitServlet.java:

/**
 * 初始化係統參數
 * 創建者 科幫網
 * 創建時間 2017年5月10日
 *
 */
public class InitServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    public void init(){
        try {
            if(Constants.PAY_URL.size()==0){
                List<CommonEntity> listPayUrl = PropertiesListUtil.listPayUrl();
                for(CommonEntity entity:listPayUrl){
                    Constants.PAY_URL.put(entity.getEntityCode(), entity.getEntityName());
                }
            }
            LogUtil.info("佛祖保佑       永不宕機     永無BUG :初始化係統數據數量:"+Constants.PAY_URL.size());

            Configs.init("zfbinfo.properties");
            LogUtil.info("初始化支付寶配置信息");

            SDKConfig.getConfig().loadPropertiesFromSrc();
            LogUtil.info("初始化銀聯支付配置信息");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 重新加載配置文件
     * @Author  科幫網
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException 
     * @Date    2017年5月10日
     * 更新日誌
     * 2017年5月10日 張誌朋  首次創建
     *
     */
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Constants.PAY_URL = new ConcurrentHashMap<String, String>();
        List<CommonEntity> listPayUrl = PropertiesListUtil.listPayUrl();
        for(CommonEntity entity:listPayUrl){
            Constants.PAY_URL.put(entity.getEntityCode(), entity.getEntityName());
        }
        LogUtil.info("初始化係統數據數量:"+Constants.PAY_URL.size());
    }
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

web.xml:(部分配置)

<!-- 初始基礎化數據-->
    <servlet>
        <servlet-name>InitServlet</servlet-name>
        <servlet-class>com.acts.web.common.servlet.InitServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>InitServlet</servlet-name>
        <url-pattern>/InitServlet</url-pattern>
    </servlet-mapping>

servlet介紹

什麼是servlet

servlet是sun公司為開發動態web而提供的一門技術,用戶若想用發一個動態web資源(即開發一個Java程序向瀏覽器輸出數據),需要完成以下2個步驟:

  1. 編寫一個Java類,實現servlet接口。
  2. 把開發好的Java類部署到web服務器中。

按照一種約定俗成的稱唿習慣,通常我們也把實現了servlet接口的java程序,稱之為Servlet。

servlet的運行過程

  1. 瀏覽器發出請求,被web容器獲取到
  2. Web服務器首先檢查是否已經裝載並創建了該Servlet的實例對象。如果是,則直接執行第④步,否則,執行第②步。

  3. 裝載並創建該Servlet的一個實例對象,調用Servlet實例對象的init()方法。

  4. 創建一個用於封裝HTTP請求消息的HttpServletRequest對象和一個代表HTTP響應消息的HttpServletResponse對象,然後調用Servlet的service()方法並將請求和響應對象作為參數傳遞進去。

  5. WEB應用程序被停止或重新啟動之前,Servlet引擎將卸載Servlet,並在卸載之前調用Servlet的destroy()方法

servlet初始化

  • load-on-startup >=0 時,表示在web應用啟動後立即加載,其中load-on-startup的值越小,表示加載的優先級越高,如果兩個servlet的load-on-startup值相同,則其加載優先級有容器決定;

  • load-on-startup 未配置時,則該servlet的加載由容器決定;

配置load-on-startup後,servlet在startup後立即加載,但隻是調用servlet的init()方法,用以初始化該servlet相關的資源。初始化成功後,該servlet可響應web請求;如未配置load-on-startup,容器一般在第一次響應web請求時,會先檢測該servlet是否初始化,如未初始化,則調用servlet的init()先初始化,初始化成功後,再響應請求。

PS:一般我們在開發web應用時,都會配置這個參數,有兩個好處:
1. 如果初始化過程失敗,則容器會提示啟動失敗,此時我們能夠提前知道相關錯誤;
2. 配置該參數相當於將初始化servlet的工作轉移到容器啟動過程,使得容器隻要啟動成功後,就可立即響應web請求。

關於load-on-startup一些官網說明:

If the value is a negative integer, or the element is not present, the container is free to load the servlet   
whenever it chooses. If the value is a positive  
integer or 0, the container must load and  initialize the servlet as the application is  deployed.   

注意

使用servlet時,一般都是繼承httpServlet,然後分別實現doGet或者doPost方法,但是在這裏麵要注意的是,這servlet並不是線程安全的,多線程單實例執行的,當並發訪問同一個資源的話(成員變量等等),就有可能引發線程安全問題。

小站:https://blog.52itstyle.com/

最後更新:2017-05-11 09:30:59

  上一篇:go  大屏時代的生態變遷,看平板手機的拇指熱鍵與界麵布局
  下一篇:go  點晴模切ERP軟件對模切行業管理的影響