JavaWeb中web.xml初始化加载顺序详解

网友投稿 254 2023-05-16


JavaWeb中web.xml初始化加载顺序详解

需求说明

做项目时,为了省事,起初把初始化的配置都放在每个类中 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:

/**

* 初始化系统参数

* 创建者 科帮网

* 创建时间 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 listPayUrl = PropertiesListUtil.listPayUrl();

for(CommonEntity entity:listPayUrl){

Constants.PAY_URL.put(entity.getEntityCode(), entity.getEntityName());

}

}

LogUtil.info("佛祖保佑http:// 永不宕机 永无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();

List 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:(部分配置)

InitServlet

com.acts.web.common.servlet.InitServlet

1

InitServlet

/InitServlet

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一些官网说明:

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并不是线程安全的,多线程单实例执行的,当并发访问同一个资源的话(成员变量等等),就有可能引发线程安全问题。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解Spring简单容器中的Bean基本加载过程
下一篇:Bootstrap模态框插件使用详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~