983
汽車大全
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個步驟:
- 編寫一個Java類,實現servlet接口。
- 把開發好的Java類部署到web服務器中。
按照一種約定俗成的稱唿習慣,通常我們也把實現了servlet接口的java程序,稱之為Servlet。
servlet的運行過程
- 瀏覽器發出請求,被web容器獲取到
Web服務器首先檢查是否已經裝載並創建了該Servlet的實例對象。如果是,則直接執行第④步,否則,執行第②步。
裝載並創建該Servlet的一個實例對象,調用Servlet實例對象的init()方法。
創建一個用於封裝HTTP請求消息的HttpServletRequest對象和一個代表HTTP響應消息的HttpServletResponse對象,然後調用Servlet的service()方法並將請求和響應對象作為參數傳遞進去。
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