ContextLoaderListener与DispatcherServlet版权声明

原创
小哥 2年前 (2022-12-30) 阅读数 60 #大杂烩

在基于XML的Spring MVC配置,您必须 web.xml 文件中有两个声明,即 ContextLoaderListenerDispatcherServlet 。让我们试着了解他们在框架中的目的及其差异。

根和子上下文

在进一步阅读之前,请理解 -

  • Spring一次可以有多个上下文。其中一个将是根上下文,所有其他上下文将是子上下文。
  • 所有子上下文所有都可以访问bean; 但事实恰恰相反。根上下文无法访问子上下文bean。

DispatcherServlet - 子应用程序上下文

[DispatcherServlet](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html) 本质上是Servlet(它扩展 HttpServlet ),其主要目的是处理和配置URL模式匹配传入Web要求它接受传入URI并找到控制器和视图的正确组合。所以它是前控制器。

定义 DispatcherServlet in spring配置时,请使用 contextConfigLocation 属性提供包含控制器类、视图映射等的条目。XML文件。

web.xml中

< servlet >

< servlet-name >employee-services</ servlet-name >

< servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class >

< init-param >

< param-name >contextConfigLocation</ param-name >

< param-value >classpath:employee-services-servlet.xml</ param-value >

</ init-param >

< load-on-startup >1</ load-on-startup >

</ servlet >

如果您没有提供配置文件,那么它将使用 [servlet_name]-servlet.xml 。Web应用程序可以定义任何数字 DispatcherServlet 进入每个servlet两者都在各自的命名空间中运行,使用映射、处理程序等加载各自的应用程序上下文。

这意味着每个人 DispatcherServlet 所有都可以访问Web应用程序上下文。 直到规定每个 DispatcherServlet 创建自己的内部Web应用程序上下文

从Spring 3.x首先,该方法使用给定的Web应用程序上下文 DispatcherServlet(WebApplicationContext webApplicationContext) 创建新的 DispatcherServlet 属于仅在中Servlet 3.x环境可以通过 ServletContext.addServlet(java.lang.String, java.lang.String) API支持。

ContextLoaderListener - 根应用程序上下文

[ContextLoaderListener](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/context/ContextLoaderListener.html) 创建根应用程序上下文并使用所有 DispatcherServlet 上下文创建的子上下文共享。 您只能有一个条目 web.xml

web.xml中

< listener >

< listener-class >

org.springframework.web.context.ContextLoaderListener

</ listener-class >

</ listener >

< context-param >

< param-name >contextConfigLocation</ param-name >

< param-value >/WEB-INF/spring/applicationContext.xml</ param-value >

</ context-param >

ContextLoaderListener 包含全局可见的bean 上下文,如服务、存储库、基础设施。bean等待创建根应用程序上下文后,它将。 ServletContext 作为属性存储,名称为:

组织/ springframework的/ WEB /上下文/ ContextLoader.java

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

//Where attibute is defined in /org/springframework/web/context/WebApplicationContext.java as

WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext. class .getName() + ".ROOT" ;

在Spring获取控制器中的根应用程序上下文。 ,可以使用 WebApplicationContextUtils 类。

Controller.java

@Autowired

ServletContext context;

ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(context);

if (ac == null ){

return "root application context is null" ;

}

ContextLoaderListener与DispatcherServlet

下图在一个视图中描述了整个关系。

ContextLoaderListener与DispatcherServlet

  1. ContextLoaderListener 创建根应用程序上下文
  2. DispatcherServlet 每个的条目servlet该条目创建子应用程序上下文。
  3. 子上下文可以访问bean。
  4. 在根上下文中Bean您不能直接访问bean。
  5. 所有上下文都添加到 ServletContext
  6. 您可以使用 WebApplicationContextUtils 类以访问根上下文。

摘要

通常,你会 DispatcherServlet 上下文定义了所有MVC相关的bean(控制器和视图等),并定义根上下文中的所有交集。bean,如安全、交易、服务等。 ContextLoaderListener

通常,此设置工作正常,因为您很少需要访问任何设置。MVC bean(从子上下文)到安全相关类(从根上下文)。在大多数情况下,我们MVC在类上使用安全性bean他们可以通过上面的设置访问它。

原始地址: https://howtodoinjava.com/spring-mvc/contextloaderlistener-vs-dispatcherservlet/

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门