来源:蜘蛛抓取(WebSpider)
时间:2017-03-26 16:49
标签:
addloadlistener
推荐这篇日记的豆列
······Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(优先初始化Spring IOC容器) - 且听风吟 - ITeye技术网站
博客分类:
最近用到在Tomcat服务器启动时自动加载数据到缓存,这就需要创建一个自定义的缓存监听器并实现ServletContextListener接口,并且在此自定义监听器中需要用到Spring的依赖注入功能.在web.xml文件中监听器配置如下:
&listener&
&listener-class&
org.springframework.web.context.ContextLoaderListener
&/listener-class&
&/listener&
&listener&
&listener-class&
com.wsjiang.test.listener.CacheListener
&/listener-class&
&/listener&
上面的配置细细大意为,先配置spring监听器,启动spring,再配置一个缓存监听器,我希望他们是顺序执行的,因为在缓存监听器中需要 spring注入其他对象的实例,我期望在服务器加载缓存监听器前加载Spring的监听器,将其优先实例化。但是实际运行发现他们并不是按照配置的顺序加载的。
对上面的问题我查询了很多资料,找到了一种解决方案,希望能帮助遇到同类问题的朋友。
思路就是,既然listener的顺序是不固定的,那么我们可以整合两个listener到一个类中,这样就可以让初始化的顺序固定了。我就重写了org.springframework.web.context.ContextLoaderListener这个类的contextInitialized方法.大致代码如下:
public class ContextLoaderListenerOverWrite extends ContextLoaderListener {
private IStationService stationS
private IOSCache osC
* @description 重写ContextLoaderListener的contextInitialized方法
public void contextInitialized(ServletContextEvent event) {
super.contextInitialized(event);
ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
//获取bean
stationService = (IStationService) applicationContext.getBean("stationService");
osCache = (IOSCache) applicationContext.getBean("osCache");
具体地业务代码
web.xml的配置就由两个listener变为一个:
&listener&
&listener-class&
com.wsjiang.test.listener.ContextLoaderListenerOverWrite
&/listener-class&
&/listener&
这样就能保证Spring的IOC容器先于自定义的缓存监听器初始化,在缓存监听器加载的时候就能使用依赖注入的实例.
我还是一新手,如果哪位大侠有其他方案,望指点,谢谢!
浏览 11496
wsjiang 写道mdsp25xhm 写道我使用filter可以解决此类问题。阁下好贴,比我当初的方案优雅,这才是楼主想要的回复哟!确实通过filter与其mapping的配置机制是可以完美解决此问题的,学习了! filter是过滤器,每次都会执行吧?!个人觉得还是用listener好正如帖子所说listener不能保证顺序,需要重写改造!filter通过mapping的方式可以解决贴中提到的顺序问题,但它会拦截所有用户请求!
mdsp25xhm 写道我使用filter可以解决此类问题。阁下好贴,比我当初的方案优雅,这才是楼主想要的回复哟!确实通过filter与其mapping的配置机制是可以完美解决此问题的,学习了! filter是过滤器,每次都会执行吧?!个人觉得还是用listener好
我使用filter可以解决此类问题。阁下好贴,比我当初的方案优雅,这才是楼主想要的回复哟!确实通过filter与其mapping的配置机制是可以完美解决此问题的,学习了!
web.xml 的加载顺序是:context-param -& listener -& filter -& servlet 而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。 楼主你说的不是顺序执行应该找找原因比较好哦web.xml配置文件中listener节点是没有对应mapping配置的,阁下应该是想说通过filter与其mapping机制实现吧!本文中采用的是listener机制的,不过听其他贴友说他们Listener顺序执行是OK的,不知道是否是我当时的自身环境原因导致的!
我测试的tomcat版本是可以的,你用的是什么版本的tomcat?这个是去年的时候用到的一个东西,具体当时的Tomcat版本现在也无从查起了,呵呵!
不错,就是耦合度高了。阁下说的在理,其实这个只是当时的一个快速应急方案!
浏览: 227523 次
来自: 杭州
不清晰,第二种方法得到的随机数的范围[min,man)而不是[ ...
方法三:index = Math.abs(rd.nextInt ...
一、强依赖分布式缓存 场景下,缓存奖品数量减1的时候是否可以用 ...
w 写道Fragment 写道方法二是不是有 ...
Fragment 写道方法二是不是有问题:if (setSiz ...web.xml 中的listener、 filter、servlet 加载顺序及其详解(转) - My study notes - ITeye技术网站
博客分类:
1、启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取&listener&
和&context-param&两个结点。
2、紧急着,容创建一个ServletContext(servlet上下文),这个
web项目的所有部分都将共享这个上下文。
3、容器将&context-param&转换为键值对,并交给
servletContext。
4、容器创建&listener&中的类实例,创建监听器。
on-startup 元素在web应用启动的时候指定了servlet被加载的顺序,它的值必须是一个整数。如果它的值是一个负整数或是这个元素不存
在,那么容器会在该servlet被调用的时候,加载这个servlet 。如果值是正整数或零,容器在配置的时候就加载并初始化这个servlet,容
器必须保证值小的先被加载。如果值相等,容器可以自动选择先加载谁。
在servlet的配置当中,&load-on-
startup&5&/load-on-startup&的含义是:
标记容器是否在启动的时候就加载这个servlet。
值为0或者大于0时,表示容器在应用启动时就加载这个servlet;
当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才
正数的值越小,启动该servlet的优先级越高。
在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到
过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰。
先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加
载 filter。最终得出的结论是:listener -& filter -& servlet
同时还存在
着这样一种配置节:context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们
的 listener, filter 等在初始化时会用到这些上下文中的信息,那么 context-param 配置节是不是应该写
在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,因此真正的加载顺序为:context-
param -& listener -& filter -& servlet
对于某类配置节而言,与
它们出现的顺序是有关的。以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节
是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置
节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-
name 还未定义。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多
个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调
用 doFilter() 方法的。
servlet 同 filter 类似 ,此处不再赘述。
此,可以看出,web.xml 的加载顺序是:context-
param -& listener -& filter -& servlet ,而同个类型之间的实际程序调用的时候的顺序是根据
对应的 mapping 的顺序进行调用的。
web.xml文件详解
Web.xml常用元素
&display-name&&/display-name&定义了WEB应用的名字
&description&&/description& 声
明WEB应用的描述信息
&context-param&&/context-
param& context-param元素声明应用范围内的初始化参数。
&filter&&/filter& 过
滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。
mapping&&/filter-mapping& 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或
多个servlet或JSP页面相关联。
&listener&&/listener&servlet API的版本
2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。
元素指出事件监听程序类。
&servlet&&/servlet& 在向servlet或JSP页面制定初始化参数
或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。
mapping&&/servlet-mapping& 服务器一般为servlet提供一个缺省的URL:http://host
/webAppPrefix/servlet/ServletName。
但是,常常会更改这个URL,以便
servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。
config&&/session-config& 如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。
通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-
config元素制定缺省超时值。
&mime-mapping&&/mime-mapping&如果
Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保证。
file-list&&/welcome-file-list& 指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文
&error-page&&/error-page& 在返回特定HTTP状态代码时,或者特定类型的异常被抛
出时,能够制定将要显示的页面。
&taglib&&/taglib& 对标记库描述符文件
(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,
不用编辑使用这些文件的JSP页面。
&resource-env-ref&&/resource-env-ref&
声明与资源相关的一个管理对象。
&resource-ref&&/resource-ref& 声明一个资源工厂使
用的外部资源。
&security-constraint&&/security-constraint& 制定应
该保护的URL。它与login-config元素联合使用
&login-config&&/login-
config& 指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。
&security-
role&&/security-role&给出安全角色的一个列表,这些角色将出现在servlet元素内的security-
role-ref元素
的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为
&env-entry&&/env-entry&声明Web应用的环境项。
ref&&/ejb-ref&声明一个EJB的主目录的引用。
& ejb-local-
ref&&/ ejb-local-ref&声明一个EJB的本地主目录的应用。
&/web-app&
相应元素配置
1、Web应用图标:指出IDE和GUI工具用来表示Web应用的大图标和小图标
&small-icon&/images/app_small.gif&/small-icon&
&large-icon&/images/app_large.gif&/large-icon&
2、Web 应用名称:提供GUI工具可能会用来标记这个特定的Web应用的一个名称
&display-name&Tomcat Example&/display-name&
3、Web 应用描述: 给出于此相关的说明性文本
&disciption&Tomcat Example servlets and JSP pages.&/disciption&
4、上下文参数:声明应用范围内的初始化参数。
&context-param&
¶m-name&ContextParameter&/para-name&
¶m-value&test&/param-value&
&description&It is a test parameter.&/description&
&/context-param&
在servlet里面可以通过
getServletContext().getInitParameter("context/param")得到
器配置:将一个名字与一个实现javaxs.servlet.Filter接口的类相关联。
&filter-name&setCharacterEncoding&/filter-name&
&filter-class&com.myTest.setCharacterEncodingFilter&/filter-class&
&init-param&
¶m-name&encoding&/param-name&
¶m-value&GB2312&/param-value&
&/init-param&
&filter-mapping&
&filter-name&setCharacterEncoding&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
6、监听器配置
&listener&
&listerner-class&listener.SessionListener&/listener-class&
&/listener&
7、Servlet配置
&servlet-name&snoop&/servlet-name&
&servlet-class&SnoopServlet&/servlet-class&
&/servlet&
&servlet-mapping&
&servlet-name&snoop&/servlet-name&
&url-pattern&/snoop&/url-pattern&
&/servlet-mapping&
&servlet-name&snoop&/servlet-name&
&servlet-class&SnoopServlet&/servlet-class&
&init-param&
¶m-name&foo&/param-name&
¶m-value&bar&/param-value&
&/init-param&
&description&Security role for anonymous access&/description&
&role-name&tomcat&/role-name&
&/servlet&
&servlet-mapping&
&servlet-name&snoop&/servlet-name&
&url-pattern&/snoop&/url-pattern&
&/servlet-mapping&
&servlet&&/servlet& 用来声明一个servlet的数据,
主要有以下子元素:
&servlet-name&&/servlet-name& 指定servlet的
&servlet-class&&/servlet-class& 指定servlet的类名称
file&&/jsp-file& 指定web站台中的某个JSP网页的完整路径
param&&/init-param& 用来定义参数,可有多个init-param。在servlet类中通过
getInitParamenter(String name)方法访问初始化参数
startup&&/load-on-startup&指定当Web应用启动时,装载Servlet的次序。
值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet.
值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它
mapping&&/servlet-mapping& 用来定义servlet所对应的URL,包含两个子元素
name&&/servlet-name& 指定servlet的名称
pattern&&/url-pattern& 指定servlet所对应的URL
8、会话超时配置(单位为分钟)
&session-config&
&session-timeout&120&/session-timeout&
&/session-config&
9、MIME类型配置
&mime-mapping&
&extension&htm&/extension&
&mime-type&text/html&/mime-type&
&/mime-mapping&
10、指定欢迎文件页配置
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&welcome-file&index.html&/welcome-file&
&welcome-file&index.htm&/welcome-file&
&/welcome-file-list&
11、配置错误页面
一、 通过错误码来配置
error-page
&error-page&
&error-code&404&/error-code&
&location&/NotFound.jsp&/location&
&/error-page&
上面配置了当系统发生404错误时,跳转到错误处理页面NotFound.jsp。
二、通过异常的类型配置error-
&error-page&
&exception-type&java.lang.NullException&/exception-type&
&location&/error.jsp&/location&
&/error-page&
上面配置了当系统发生java.lang.NullException(即空指针异常)时,跳转到错误处理页面error.jsp
&taglib-uri&http://jakarta.apache.org/tomcat/debug-taglib&/taglib-uri&
&taglib-location&/WEB-INF/jsp/debug-taglib.tld&/taglib-location&
如果MyEclipse一直在报错,应该把&taglib& 放
到 &jsp-config&中
&jsp-config&
&taglib-uri&http://jakarta.apache.org/tomcat/debug-taglib&/taglib-uri&
&taglib-location&/WEB-INF/pager-taglib.tld&/taglib-location&
&/jsp-config&
13、资源管理对象配置
&resource-env-ref&
&resource-env-ref-name&jms/StockQueue&/resource-env-ref-name&
&/resource-env-ref&
14、资源工厂配置
&resource-ref&
&res-ref-name&mail/Session&/res-ref-name&
&res-type&javax.mail.Session&/res-type&
&res-auth&Container&/res-auth&
&/resource-ref&
配置数据库连接池就可在此配置:
&resource-ref&
&description&JNDI JDBC DataSource of shop&/description&
&res-ref-name&jdbc/sample_db&/res-ref-name&
&res-type&javax.sql.DataSource&/res-type&
&res-auth&Container&/res-auth&
&/resource-ref&
15、安全限制配置
&security-constraint&
&display-name&Example Security Constraint&/display-name&
&web-resource-collection&
&web-resource-name&Protected Area&/web-resource-name&
&url-pattern&/jsp/security/protected/*&/url-pattern&
&http-method&DELETE&/http-method&
&http-method&GET&/http-method&
&http-method&POST&/http-method&
&http-method&PUT&/http-method&
&/web-resource-collection&
&auth-constraint&
&role-name&tomcat&/role-name&
&role-name&role1&/role-name&
&/auth-constraint&
&/security-constraint&
16、登陆验证配置
&login-config&
&auth-method&FORM&/auth-method&
&realm-name&Example-Based Authentiation Area&/realm-name&
&form-login-config&
&form-login-page&/jsp/security/protected/login.jsp&/form-login-page&
&form-error-page&/jsp/security/protected/error.jsp&/form-error-page&
&/form-login-config&
&/login-config&
安全角色:security-role元素给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的
role-name子元素中。
分别地声明角色可使高级IDE处理安全信息更为容易。
&security-role&
&role-name&tomcat&/role-name&
&/security-role&
18、Web环境参数:env-entry元素声明Web应用的环境项
&env-entry&
&env-entry-name&minExemptions&/env-entry-name&
&env-entry-value&1&/env-entry-value&
&env-entry-type&java.lang.Integer&/env-entry-type&
&/env-entry&
19、EJB 声明
&description&Example EJB reference&/decription&
&ejb-ref-name&ejb/Account&/ejb-ref-name&
&ejb-ref-type&Entity&/ejb-ref-type&
&home&com.mycompany.mypackage.AccountHome&/home&
&remote&com.mycompany.mypackage.Account&/remote&
&/ejb-ref&
20、本地EJB声明
&ejb-local-ref&
&description&Example Loacal EJB reference&/decription&
&ejb-ref-name&ejb/ProcessOrder&/ejb-ref-name&
&ejb-ref-type&Session&/ejb-ref-type&
&local-home&com.mycompany.mypackage.ProcessOrderHome&/local-home&
&local&com.mycompany.mypackage.ProcessOrder&/local&
&/ejb-local-ref&
21、配置DWR
&servlet-name&dwr-invoker&/servlet-name&
&servlet-class&uk.ltd.getahead.dwr.DWRServlet&/servlet-class&
&/servlet&
&servlet-mapping&
&servlet-name&dwr-invoker&/servlet-name&
&url-pattern&/dwr/*&/url-pattern&
&/servlet-mapping&
22、配置Struts
&display-name&Struts Blank Application&/display-name&
&servlet-name&action&/servlet-name&
&servlet-class&
org.apache.struts.action.ActionServlet
&/servlet-class&
&init-param&
¶m-name&detail&/param-name&
¶m-value&2&/param-value&
&/init-param&
&init-param&
¶m-name&debug&/param-name&
¶m-value&2&/param-value&
&/init-param&
&init-param&
¶m-name&config&/param-name&
¶m-value&/WEB-INF/struts-config.xml&/param-value&
&/init-param&
&init-param&
¶m-name&application&/param-name&
¶m-value&ApplicationResources&/param-value&
&/init-param&
&load-on-startup&2&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&action&/servlet-name&
&url-pattern&*.do&/url-pattern&
&/servlet-mapping&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&!-- Struts Tag Library Descriptors --&
&taglib-uri&struts-bean&/taglib-uri&
&taglib-location&/WEB-INF/tld/struts-bean.tld&/taglib-location&
&taglib-uri&struts-html&/taglib-uri&
&taglib-location&/WEB-INF/tld/struts-html.tld&/taglib-location&
&taglib-uri&struts-nested&/taglib-uri&
&taglib-location&/WEB-INF/tld/struts-nested.tld&/taglib-location&
&taglib-uri&struts-logic&/taglib-uri&
&taglib-location&/WEB-INF/tld/struts-logic.tld&/taglib-location&
&taglib-uri&struts-tiles&/taglib-uri&
&taglib-location&/WEB-INF/tld/struts-tiles.tld&/taglib-location&
23、配置Spring(基本上都是在Struts中配置的)
定spring配置文件位置 --&
&context-param&
¶m-name&contextConfigLocation&/param-name&
¶m-value&
&!--加载多个spring配置文件 --&
/WEB-INF/applicationContext.xml, /WEB-INF/action-servlet.xml
&/param-value&
&/context-param&
义SPRING监听器,加载spring --&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
&listener&
&listener-class&
org.springframework.web.context.request.RequestContextListener
&/listener-class&
&/listener&
浏览: 102785 次
来自: 奥克兰
写的很好,谢谢!
亲 有中文版的么?在grails基础上的spring-secu ...
挺好,,思路很清晰,web.xml文件中的Listener元素的作用
Listener 的作用非常类似于load-on-startup Servlet。用于在Web
应用启动时,启动某些后台程序,这些后台程序负责为系统运行提供支持。
Listener 与load-on-startup Servlet 的区别在于: Listener
的启动时机比load-on-startup Servlet 早,只是Listener 是Servlet 2.3
规范之后才出现的。
使用Listener 只需要两个步骤:
(1)创建Listener 实现类。
(2)在web.xml 文件中配置Listener。
一、创建Listener 实现类
创建Listener 类必须实现ServletContextListener 接口,该接口包含两个方法。
& contextInitialized(ServletContextEvent sce): 启动Web
应用时,系统调用该Filter的方法。
& contextDestroyed(ServletContextEvent sce): 关闭Web
应用时候,系统调用Filter的方法。
二、配置Listener
正如load-an-startup Servlet 一样, Listener 用于启动Web
应用的后台服务程序,但不负责处理及响应用户请求,因此无须配置URL。
若将Listener 配置在Web 容器中(如果Web 容器支持Listener),则Listener 将随
Web 应用的启动而启动。配置Listener
时使用&listener/&元素,下面是配置Listener
&!--&配置Listener--&&&
&listener&&&
&!--&指定Listener&的实现类--&&&
&listener-class&lee.ScheduleListener&/listener-class&&&
&/listener&&&
&!-- 配置Listener--&
&listener&
&!-- 指定Listener 的实现类--&
&listener-class&lee.ScheduleListener&/listener-class&
&/listener&
在上面的配置中,既无须配置Listener 的名字,也无须配置Listener 的URL 只需
配置它的实现类即可。此时容器将自动检测部署在容器中的Listener,并在应用启动时,
自动加载所有的Listener。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。java - Initialize spring bean profile through ContextLoaderListener in web.xml - Stack Overflow
Insights on the world's developers
Demographics. Technologies. Salaries. Career satisfaction.
In my web.xml I'm declaring a ContextLoaderListener to configure spring application this way:
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
In one of my spring configuration xml files, I'm using different
for development and production.
&beans profile="production"&
&beans profile="development"&
How I could set the default beans profile in the web.xml? is there something similar to the following when using ContextLoaderListener instead of spring servlet:
&init-param&
¶m-name&spring.profiles.active&/param-name&
¶m-value&production&/param-value&
&/init-param&
1,56422149
You can configure web.xml at the level of ContextLoaderListener with:
&context-param&
¶m-name&spring.profiles.active&/param-name&
¶m-value&profileName&/param-value&
&/context-param&
and the level of DispatcherServlet with:
&init-param&
¶m-name&spring.profiles.active&/param-name&
¶m-value&profileName&/param-value&
&/init-param&
Reference:
5,59022552
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Post as a guest
By posting your answer, you agree to the
Not the answer you're looking for?
Browse other questions tagged
rev .25527
Stack Overflow works best with JavaScript enabled