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<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个步骤:

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

  • 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应用时,都会配置这个参数,有两个好处:
1. 如果初始化过程失败,则容器会提示启动失败,此时我们能够提前知道相关错误;
2. 配置该参数相当于将初始化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并不是线程安全的,多线程单实例执行的,当并发访问同一个资源的话(成员变量等等),就有可能引发线程安全问题。

小站:http://blog.52itstyle.com/

时间: 2024-10-27 01:16:41

JavaWeb中web.xml初始化加载顺序的相关文章

jsp页面中的代码执行加载顺序介绍

 本篇文章主要是对jsp页面中的代码执行加载顺序进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1. java是在服务器端运行的代码,jsp在服务器的servlet里运行,而javascript和html都是在浏览器端运行的代码.所以加载执行顺序是是java>jsp>js.   2. js在jsp中的加载顺序   页面上的js代码时html代码的一部分,所以页面加载的时候是由上而下加载.所以js加载的顺序也就是页面中<script>标签出现的顺序.<scrip

jsp页面中的代码执行加载顺序介绍_JSP编程

1. java是在服务器端运行的代码,jsp在服务器的servlet里运行,而javascript和html都是在浏览器端运行的代码.所以加载执行顺序是是java>jsp>js. 2. js在jsp中的加载顺序 页面上的js代码时html代码的一部分,所以页面加载的时候是由上而下加载.所以js加载的顺序也就是页面中<script>标签出现的顺序.<script>标签里面的或者是引入的外部js文件的执行顺序都是其语句出现的顺序,其中js执行的过程也是页面装载的一部分. 2

web.xml可以加载ibatis的总配置文件吗

问题描述 今天想单独在web.xml引入SqlMapConfig.xml配置文件,怎么引入啊,不想用spring的import引入,也不想代码式引入,各位兄弟大家好,可以引入吗,恳请有识之士帮忙下,谢谢哈 解决方案 先请教一下楼主为什么要这样做呢?web.xml都是加载serlvet ,监听器,过滤器等这些与WEB工程有关的配置,而mybatis的配置文件是由mybatis框架本身的配置,与web项目无关,所以个人感觉根本没有配置到web.xml必要,也不可能,楼主的思路不对,我建议应该抓紧时间

web.xml 中的listener、 filter、servlet 加载顺序及其详解

在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰.         首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> filter -> servlet         同时还存在着这样一种配置节:context-pa

web.xml中的所有配置,Listener和Filter的加载顺序

web.xml 中的listener. filter.servlet 加载顺序及其详解 在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰.         首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> filter

关于JSP配置文件web.xml加载顺序详解_JSP编程

一. 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<context-param>和<listener>两个结点. 2.紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文. 3.容器将<context-param>转换为键值对,并交给servletContext. 4.容器创建<listener>中的类实例,创建监听器. 二. load-on-startup 元

tomcat 加载顺序

一. 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文. 3.容器将<context-param>转换为键值对,并交给servletContext. 4.容器创建<listener>中的类实例,创建监听器. 二. load-on-startup 元

JavaWeb工程中web.xml基本配置

一.理论准备         先说下我记得xml规则,必须有且只有一个根节点,大小写敏感,标签不嵌套,必须配对. web.xml是不是必须的呢?不是的,只要你不用到里面的配置信息就好了,不过在大型web工程下使用该文件是很方便的,若是没有也会很复杂.         那么web.xml能做的所有事情都有那些?其实,web.xml的模式(Schema)文件中定义了多少种标签元素,web.xml中就可以出现它的模式文件所定义的标签元素,它就能拥有定义出来的那些功能.web.xml的模式文件是由Sun

css中style和class的加载顺序示例介绍

style和class的加载顺序到底谁先谁后,谁又会覆盖谁,在接下来的示例中将为大家详细介绍下,希望对大家有所帮助     复制代码 代码如下: <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"