需求說明
做項目時,為了省事,起初把初始化的配置都放在每個類中 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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
/** * 初始化系統參數 * 創建者 科幫網 * 創建時間 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:(部分配置)
1
2
3
4
5
6
7
8
9
10
|
<!-- 初始基礎化數據--> < 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應用時,都會配置這個參數,有兩個好處:
- 如果初始化過程失敗,則容器會提示啟動失敗,此時我們能夠提前知道相關錯誤;
- 配置該參數相當于將初始化servlet的工作轉移到容器啟動過程,使得容器只要啟動成功后,就可立即響應web請求。
關于load-on-startup一些官網說明:
1
2
3
|
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并不是線程安全的,多線程單實例執行的,當并發訪問同一個資源的話(成員變量等等),就有可能引發線程安全問題。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.52itstyle.com/archives/869/?utm_source=tuicool&utm_medium=referral