需求說明
做項目時,為了省事,起初把初始化的配置都放在每個類中 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並不是線程安全的,多線程單實例執行的,當並發訪問同一個資源的話(成員變量等等),就有可能引發線程安全問題。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。