需求说明
做项目时,为了省事,起初把初始化的配置都放在每个类中 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并不是线程安全的,多线程单实例执行的,当并发访问同一个资源的话(成员变量等等),就有可能引发线程安全问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
我有一个Java Spring Boot应用程序,在我的Maven pom.xml中将Flyway配置为依赖项(我有一个父pom和一个项目pom...Flyway是在我的项目pom中定义的)。 application.properties中只有几个条目: 我可以运行一个maven任务来让Flyway运行来创建/更新我的数据库,然后针对该数据库运行我的应用程序,但是我很难通过运行我的应用程序(这在p
本文向大家介绍图文详解Java中class的初始化顺序,包括了图文详解Java中class的初始化顺序的使用技巧和注意事项,需要的朋友参考一下 class的装载 在讲class的初始化之前,我们来讲解下class的装载顺序。 以下摘自《Thinking in Java 4》 由于Java 中的一切东西都是对象,所以许多活动 变得更加简单,这个问题便是其中的一例。正如下一章会讲到的那样,每个对象的代
本文向大家介绍C++构造函数初始化顺序详解,包括了C++构造函数初始化顺序详解的使用技巧和注意事项,需要的朋友参考一下 1.构造函数、析构函数与拷贝构造函数介绍 构造函数 1.构造函数不能有返回值 2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 3.创建一个对象时,系统自动调用构造函数 析构函数 1.析构函数没有参数,也没有返回值。不能重载
问题内容: 我有多个上下文文件。要求是:在其余的Bean中首先初始化一个特定的Bean(进行一些配置更改)。 有没有一种方法可以首先加载该bean? 一种选择是使用“取决于”属性。 但这将需要更新所有其他bean,因此这似乎不是最佳解决方案。 我们有更好的选择吗? 问题答案: 恕我直言,您应该等待它们修复https://jira.spring.io/browse/SPR-3948 一种可能的方法是
问题内容: 我正在尝试发现初始化发生的顺序,或者更确切地说,为什么要按此顺序进行初始化的原因。给定代码: 输出: 但是,将的声明移动到初始化块之前会产生: 而且我完全不知道为什么会以这种顺序发生。此外,如果我在的声明中消除了关键字,则init块和构造函数均不会触发。谁能帮我这个忙吗? 问题答案: 我认为您只是缺少JLS的12.4.2节,其中包括: 接下来,以文本顺序执行类的类变量初始化器和静态初始
问题内容: 我是来自C 背景的Python新手。虽然我知道用我以前的C 知识来尝试找到匹配的概念并不是Pythonic,但我认为这个问题仍然是一个普遍的问题: 在C 中,由于C 无法确定哪个全局/静态变量将首先在编译单元中初始化,因此存在一个众所周知的全局/静态变量初始化顺序失败的问题,因此,全局/静态变量取决于不同编译中的另一个变量单元可能比其依赖项对应的对象早初始化,并且当依赖项开始使用依赖项