在spring和springMVC整合的时候,web.xml中对spring的listener是否可以不配置?

睡睡觉OOY 2015-07-17 08:55:56
是这样的,在网上大多数spring和springMVC的整合中,都需要在web.xml里面配置两样东西:

1、对spring配置listener,如图:


2、对springMVC配置servlet,如图:


上面这样的配置确实可以运行,我已经测试过。

但是,在我公司里面,也采用了spring和springMVC的整合,奇怪的是在web.xml中只看到了对了springMVC的servlet配置,却没有见到对spring的listener的配置,如下图,公司的web.xml配置:

web.xml的行数太多,截不完,但是我仔细找过了,确实没有spring的listenner配置!

难道spring和springMVC整合后,可以取消掉spring的listener配置吗?

需要对公司项目说明的几点:
1、公司项目中spring和springMVC各自配置文件都是采用的注解方式进行配置,即没有applicationContext.xml这类似的配置文件,如下图:
spring的配置类:appConfig.java



springMVC的配置类:webConfig.java



webConfig.java,是一路一路的继承下来的,反正最终它继承的是WebMvcConfigurerAdapter,如下图:
...全文
6789 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
A_Big_Banana 2019-05-22
  • 打赏
  • 举报
回复
一个前端控制器就能跑起来了啊。
loong0306 2019-05-21
  • 打赏
  • 举报
回复
mark one times
  • 打赏
  • 举报
回复
楼主你好,我用的就是这种方式,然而跑起来没得到我预期的效果,配置类没起作用,而我的另一个项目也是用这种配置,然后可以跑起来,我想问的是,会照成这种问题的原因是什么?jar包?配置?
Dreamer_why 2017-05-13
  • 打赏
  • 举报
回复
我记得不配置的话会自动加载一个默认名字的配置文件,好想叫做servlet-application.xml吧,记不太清楚来了
Marvel__Dead 2017-05-13
  • 打赏
  • 举报
回复
引用 3 楼 fjtnylk 的回复:
估计你们项目里没和Ioc容器一起使用。 一般配置spring监听器都是为了配合Ioc容器一起使用的。 spring源代码里可以看到,启动web服务器的时候会调用监听器的上下文初始化方法,然后去初始化Ioc容器。
SpringMVC是Spring的一部分,对于IOC控制反转,SpringMVC里面都会根据bean配置文件或者注解自动添加的。
大海啊ai大海 2015-10-13
  • 打赏
  • 举报
回复
Spring自带了几种类型的应用上下文:
1、ClassPathXmlApplicationContext-——从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当做类资源;
2、FileSystemXmlapplicationContext——读取文件系统下的XML配置文件并加载上下文定义;
3、XmlWebApplicationContext——读取Web应用下的XML配置文件并装配上下文定义。
Spring MVC采用第三种方式,首先你肯定配置了dispatcher-servlet这个servlet,它会自动加载dispatcher-servlet.xml。如果你只有这一个XML配置文件,那就不用加<listener>那一块的配置。但往往你或许还有个applicationContext.xml,那你就应该加载这个应用上下文(除非你不用他,那你干嘛还要定义他呢?)
那么问题来了,你应该用上面提到的哪种方式的应用上下文呢?(如果用前两种方式,我觉得就不用listener,这个是我臆断的,觉得合理就采纳,也希望大家提出意见)这时候大家往往会选择第三种,在web.xml部署描述符中加载应用上下文。dispatcher-servlet.xml可以自动加载,那么你也想同样的加载applicationContext.xml的话,你就得用listener:
<context-param>
<param-name>contextConfigLocation<param-name>
<param-value>
classpath:application.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
tony4geek 2015-10-13
  • 打赏
  • 举报
回复
ContextLoaderListener or not?


引用 13 楼 dahai795800 的回复:

这里

spring 官网
大海啊ai大海 2015-10-13
  • 打赏
  • 举报
回复
引用 11 楼 rui888 的回复:
引用 9 楼 dahai795800 的回复:
http://www.codesenior.com/en/tutorial/Spring-ContextLoaderListener-And-DispatcherServlet-Concepts

经试验:
1、不加
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

直接写:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>2</load-on-startup>
</servlet>

这时候程序报错,java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]说明这里如果不给dispatcher,web.xml会去WEB-INF下找dispatcher-servlet.xml。
这这时候这servlet中加
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcher-servlet.xml</param-value>
</init-param>

就不报错了,程序可以运行。
由此可以证明,若只有dispatcher-servlet.xml这样的spring配置文件,则不需linstener,因为web.xml中的servlet应该会自己去找,只是在WEB-INF下找。
然后加上classpath:dispatcher-servlet.xml,他就会去classpath下找(classpath的默认路径是什么呀?
大海啊ai大海 2015-10-13
  • 打赏
  • 举报
回复
引用 11 楼 rui888 的回复:
引用 9 楼 dahai795800 的回复:
http://www.codesenior.com/en/tutorial/Spring-ContextLoaderListener-And-DispatcherServlet-Concepts

我看上面,意思是:dispatcher-servlet.xml的spring也要listener,但我现在看的一本书上说不用,我做实验试试吧。
做一个梦想家 2015-10-12
  • 打赏
  • 举报
回复
ContextLoaderListener 是在上下文加载的时候调用一些配置进行初始化,比如你配置的<context-param>之类的标签。
睡睡觉OOY 2015-08-07
  • 打赏
  • 举报
回复
引用 5 楼 wi496481 的回复:
[quote=引用 1 楼 Inhibitory 的回复:] 1. 如果只有 Spring mvc 的一个 Servlet,listener 可以不用。 2. 但是如果用了Shiro 等,Shiro 用到的 Spring 的配置必须在 listener 里加载。 3. 一般 Dao, Service 的 Spring 配置都会在 listener 里加载,因为可能会在多个 Servlet 里用到,因为父子 Context 的可见性问题,防止重复加载所以在 listener 里加载。 所以,有时可用可不用,有时必用,具体看情况。
就像一个单例模式一样的,不能加载多次[/quote] 朋友,能否简单举个例子呢,你这样说,我还是不太懂啊!
睡睡觉OOY 2015-07-29
  • 打赏
  • 举报
回复
引用 3 楼 fjtnylk 的回复:
估计你们项目里没和Ioc容器一起使用。 一般配置spring监听器都是为了配合Ioc容器一起使用的。 spring源代码里可以看到,启动web服务器的时候会调用监听器的上下文初始化方法,然后去初始化Ioc容器。
朋友,IOC容器是用了的啊,@Bean标签就是把对象放进IOC容器的
迷林 2015-07-29
  • 打赏
  • 举报
回复
引用 1 楼 Inhibitory 的回复:
1. 如果只有 Spring mvc 的一个 Servlet,listener 可以不用。 2. 但是如果用了Shiro 等,Shiro 用到的 Spring 的配置必须在 listener 里加载。 3. 一般 Dao, Service 的 Spring 配置都会在 listener 里加载,因为可能会在多个 Servlet 里用到,因为父子 Context 的可见性问题,防止重复加载所以在 listener 里加载。 所以,有时可用可不用,有时必用,具体看情况。
就像一个单例模式一样的,不能加载多次
心碎了无痕 2015-07-19
  • 打赏
  • 举报
回复
估计你们项目里没和Ioc容器一起使用。 一般配置spring监听器都是为了配合Ioc容器一起使用的。 spring源代码里可以看到,启动web服务器的时候会调用监听器的上下文初始化方法,然后去初始化Ioc容器。
睡睡觉OOY 2015-07-18
  • 打赏
  • 举报
回复
引用 1 楼 Inhibitory 的回复:
1. 如果只有 Spring mvc 的一个 Servlet,listener 可以不用。 2. 但是如果用了Shiro 等,Shiro 用到的 Spring 的配置必须在 listener 里加载。 3. 一般 Dao, Service 的 Spring 配置都会在 listener 里加载,因为可能会在多个 Servlet 里用到,因为父子 Context 的可见性问题,防止重复加载所以在 listener 里加载。 所以,有时可用可不用,有时必用,具体看情况。
朋友,能否把第三点再说明白点呢?我没太看懂第三点是什么意思啊。
Inhibitory 2015-07-18
  • 打赏
  • 举报
回复
1. 如果只有 Spring mvc 的一个 Servlet,listener 可以不用。 2. 但是如果用了Shiro 等,Shiro 用到的 Spring 的配置必须在 listener 里加载。 3. 一般 Dao, Service 的 Spring 配置都会在 listener 里加载,因为可能会在多个 Servlet 里用到,因为父子 Context 的可见性问题,防止重复加载所以在 listener 里加载。 所以,有时可用可不用,有时必用,具体看情况。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧