web.xml 中alt+/ 没有#Contextloadhttplistenercontext的联想?怎么弄

推荐这篇日记的豆列
······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&
&param-name&ContextParameter&/para-name&
&param-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&
&param-name&encoding&/param-name&
&param-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&
&param-name&foo&/param-name&
&param-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&
&param-name&detail&/param-name&
&param-value&2&/param-value&
&/init-param&
&init-param&
&param-name&debug&/param-name&
&param-value&2&/param-value&
&/init-param&
&init-param&
&param-name&config&/param-name&
&param-value&/WEB-INF/struts-config.xml&/param-value&
&/init-param&
&init-param&
&param-name&application&/param-name&
&param-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&
&param-name&contextConfigLocation&/param-name&
&param-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&
&param-name&spring.profiles.active&/param-name&
&param-value&production&/param-value&
&/init-param&
1,56422149
You can configure web.xml at the level of ContextLoaderListener with:
&context-param&
&param-name&spring.profiles.active&/param-name&
&param-value&profileName&/param-value&
&/context-param&
and the level of DispatcherServlet with:
&init-param&
&param-name&spring.profiles.active&/param-name&
&param-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

我要回帖

更多关于 addloadlistener 的文章

 

随机推荐