一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JavaWeb中web.xml初始化加載順序詳解

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

2020-09-29 10:51 Java教程

本篇文章主要介紹了JavaWeb中web.xml初始化加載順序詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

需求說明

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

web.xml說明

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

  1. 啟動web項目后,web容器首先回去找web.xml文件,讀取這個文件
  2. 容器會創建一個 ServletContext ( servlet 上下文),整個 web 項目的所有部分都將共享這個上下文
  3. 容器將 轉換為鍵值對,并交給 servletContext
  4. 容器創建 中的類實例,創建監聽器
  5. 容器加載filter,創建過濾器, 要注意對應的filter-mapping一定要放在filter的后面
  6. 容器加載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個步驟:

  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初始化

  1. load-on-startup >=0 時,表示在web應用啟動后立即加載,其中load-on-startup的值越小,表示加載的優先級越高,如果兩個servlet的load-on-startup值相同,則其加載優先級有容器決定;
  2. 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一些官網說明:

?
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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91久久综合九色综合欧美98 | 娇小8一12xxxx第一次 | 欧美三级免费观看 | 日本xxxxxx片免费播放18 | 国产午夜一区二区在线观看 | 国产成+人+综合+亚洲不卡 | 青涩体验在线观看未删减 | 无遮免费网站在线入口 | 男人把大ji巴放进男人免费视频 | 久久亚洲精品AV成人无 | 免费国产成人高清视频网站 | 国产在线视频色综合 | 国产亚洲福利一区二区免费看 | 波多野结衣在线中文字幕 | 久久青草免费91线频观看站街 | 九九热这里只有精品视频免费 | 亚洲免费一| 加勒比京东热 | 国内精品久久久久久久 | 亚洲精品成人a | 视频久久精品 | 欧亚尺码专线欧洲s码wmy | 女人张开腿 让男人桶个爽 免费观看 | 99re这里只有精品在线观看 | 2021麻豆剧果冻传媒入口永久 | 桃色导航 | 国产精品拍拍拍福利在线观看 | 九九九九九热 | 男人把j放进女人的p里视频 | 51精品| 日韩制服丝袜在线观看 | 欧美 亚洲 综合 卡通 另类 区 | 深夜精品高中女学生 | 国产亚洲精品激情一区二区三区 | 性xxxx直播放免费 | 人人干国产 | 99日影院在线播放 | 亚洲精品乱码久久久久久蜜桃图片 | 丝袜性爱 | 免费岛国片 | 日韩成人在线视频 |