关于 DispatcherServlet 和 ContextLoaderListener 的一些疑问。

新手上路,请多包涵

在 Spring MVC 的开发中,会在 web.xml 中配置 DispatcherServletContextLoaderListener ,对此有一些疑惑。

我是创建了一个 applicationContext.xmlspring-mvc.xml 文件。

applicationContext.xml 中配置了了 datasourcetranscation
spring-mvc.xml 中配置了开启 annotation 扫描的一些配置。

那么是否应该这样分模块的进行配置,以及我这样配置是否合理?

再紧接着的又一个问题就是: DispatcherServletContextLoaderListener 都会加载配置文件。

  • 那么什么样的配置应该在这两者中的哪一个上加载?
  • 是否可以不配置 ContextLoaderListener,而全部用 DispatcherServlet 加载?
  • 这两者加载配置文件又什么区别?

经查询网上大多都是复制粘贴一样的答案,而且含糊不清:

  • DispatcherServlet 一般会加载 MVC 相关的 bean 配置管理
  • ContextLoaderListener 一般会加载整个 Spring 容器相关的 bean 配置管理

现在我是这样进行配置的:

  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>



  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:applicationContext.xml,
    </param-value>
  </context-param>
阅读 5k
3 个回答

这个是spring父子容器的问题吧,SpringMVC的spring-mvc.xml负责@Controller注解的Bean的注册,Spring父容器的applicationContext.xml负责其他非@Controller注解的Bean的注册,可以把全部配置陪在子容器里面.如果把全部Bean在父容器注册,源码里面会导致从子容器中取不到注册的Controller从而找不到Handler,所以访问controller会是404.

<servlet>

<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring-mvc.xml</param-value>
</init-param>

</servlet>
<servlet-mapping>

<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>

</servlet-mapping>
这个是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处
DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:

文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
通过ViewResolver解析逻辑视图名到具体视图实现;
本地化解析;
渲染具体的视图等;
如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

load-on-startup:表示启动容器时初始化该Servlet;如果它存在,则它将在应用程序启动时装在servlet并调用它的init方法。若不存在,则在该servlet的第一个请求时加载。
url-pattern:表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。也可以如“*.html”表示拦截所有以html为扩展名的请求。

该DispatcherServlet默认使用WebApplicationContext作为上下文,Spring默认配置文件为“/WEB-INF/[servlet名字]-servlet.xml”。
<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>
<context-param>

<param-name>contextConfigLocation</param-name>
<param-value>
  classpath:applicationContext.xml,
</param-value>

</context-param>
如上配置是Spring集成Web环境的通用配置;一般用于加载除Web层的Bean(如DAO、Service等),以便于与其他任何Web框架集成。
contextConfigLocation:表示用于加载Bean的配置文件;
contextClass:表示用于加载Bean的ApplicationContext实现类,默认WebApplicationContext。
创建完毕后会将该上下文放在ServletContext:

servletContext.setAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
this.context);

ContextLoaderListener初始化的上下文和DispatcherServlet初始化的上下文关系,如图

clipboard.png

新手上路,请多包涵

</servlet-mapping>
这个是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处
DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:

文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
通过ViewResolver解析逻辑视图名到具体视图实现;
本地化解析;
渲染具体的视图等;
如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

load-on-startup:表示启动容器时初始化该Servlet;如果它存在,则它将在应用程序启动时装在servlet并调用它的init方法。若不存在,则在该servlet的第一个请求时加载。
url-pattern:表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。也可以如“*.html”表示拦截所有以html为扩展名的请求。

该DispatcherServlet默认使用WebApplicationContext作为上下文,Spring默认配置文件为“/WEB-INF/[servlet名字]-servlet.xml”。
<listener>

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题