需求說明
做項目時,為了省事,起初把初始化的配置都放在每個類中 static加載,初始化配置一多,就想把它給整理一下,這裡使用servlet中的init方法初始化。
web.xml說明
首先了解下web.xml中元素的加載順序:
完整加載順序: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個步驟:
按照一種約定俗成的稱呼習慣,通常我們也把實現了servlet接口的java程序,稱之為Servlet。
servlet的運行過程
servlet初始化
配置load-on-startup後,servlet在startup後立即加載,但只是調用servlet的init()方法,用以初始化該servlet相關的資源。初始化成功後,該servlet可響應web請求;如未配置load-on-startup,容器一般在第一次響應web請求時,會先檢測該servlet是否初始化,如未初始化,則調用servlet的init()先初始化,初始化成功後,再響應請求。
PS:一般我們在開發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並不是線程安全的,多線程單實例執行的,當並發訪問同一個資源的話(成員變量等等),就有可能引發線程安全問題。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。