<servlet> <servlet-name>AppServlet</servlet-name> <servlet-class>org.springframework.web.servlet。 DispatcherServlet</servlet-class> <init-param> 上下文配置位置 WEB-INF </init-param> <init-param> 名称空间 application-context.xml </init参数> <加载启动>1</加载启动> </servlet>
-
三 查看本文: Spring MVC上下文加载 – 信息01 评论 2013年4月4日19:01 -
@informatik01我不确定我是否完全明白了。 如果要使用XML文件的另一个路径,是否更改命名空间? 如果你有多个定义文件,那么contextConfigLocation呢? 我不明白。 – 幸运的卢克 评论 2013年4月4日21:35 -
1 有关详细信息,请参阅我的答案。 – 信息01 评论 2013年4月5日3:05 -
@informatik01谢谢你的好文章。 – 医学_阿尔法 评论 2014年12月1日10:54 -
@med_alpa Je vous en prie)) – 信息01 评论 2014年12月1日11:32
3个答案
TL; 博士
<? xml version=“1.0”encoding=“UTF-8”?> <web-app xmlns=“ http://java.sun.com/xml/ns/javaee " xmlns:xsi=“ http://www.w3.org/2001/XMLSchema-instance " xsi:schemaLocation=“ http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd "> Spring Web应用程序示例 <!-- 根应用程序上下文(父上下文)-->的配置 <听众> <listener-class>org.springframework.web.context。 ContextLoaderListener</listener-class> </listener> <上下文图表> 上下文配置位置 <参数值> /WEB-INF/spring/jdbc/spring-jdbc.xml /WEB-INF/spring/security/spring-security-context.xml </param-value> </context-param> <!-- DispatcherServlet应用程序上下文的配置(子上下文)--> <servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet。 DispatcherServlet</servlet-class> <init-param> 上下文配置位置 <参数值> /WEB-INF/spring/mvc/spring-mvc-servlet.xml </param-value> </init-param> </servlet> <服务映射> <servlet-name>spring-mvc</servlet-name> <url模式>/admin/*</url模式> </servlet-mapping> </web-app>
冗长的回答
根上下文 (父级) 单个servlet上下文 (儿童)
与通用应用程序上下文一样,web应用程序上下文是 层次结构。 每个应用程序只有一个根上下文,而 应用程序中的每个servlet(包括 MVC框架)有自己的子上下文 .
例如,如果您正在开发Spring MVC web应用程序 通常会有 通过Spring加载的根WebApplicationContext ContextLoaderListener 和a 通过加载的子WebApplicationContext Spring的DispatcherServlet 。这会产生父子上下文 共享组件和基础结构配置所在的层次结构 在根上下文中声明并在子上下文中使用 特定于web的组件。
Spring中的ApplicationContext实例可以确定作用域。 在Web MVC中 框架, 每个DispatcherServlet都有自己的WebApplicationContext, 它继承了根中已经定义的所有bean Web应用程序上下文 。这些继承的bean可以在 特定于servlet的作用域,您可以定义新的特定于作用域的bean 本地到给定Servlet实例。
<? xml version=“1.0”encoding=“UTF-8”?> <web-app xmlns=“ http://java.sun.com/xml/ns/javaee " xmlns:xsi=“ http://www.w3.org/2001/XMLSchema-instance " xsi:schemaLocation=“ http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd "> <听众> <listener-class>org.springframework.web.context。 ContextLoaderListener</listener-class> </listener> <上下文图表> 上下文配置位置 <参数值> /WEB-INF/spring/daoContext.xml /WEB-INF/spring/applicationContext.xml </param-value> </context-param> </web-app>
您可以声明性地创建ApplicationContext实例 通过使用, 例如,ContextLoader。 当然,您也可以创建 通过使用 ApplicationContext实现。
你可以 使用ContextLoaderListener注册ApplicationContext (参见上面的示例)
侦听器检查contextConfigLocation参数。 如果 参数不存在,侦听器使用 /WEB-INF/applicationContext.xml作为默认值 。当参数为 存在时,侦听器使用预定义的 分隔符(逗号、分号和空白),并将这些值用作 将搜索应用程序上下文的位置。 Ant-style路径 也支持模式。 示例为/WEB-INF/*Context.xml for 所有名称以“Context.xml”结尾的文件,位于 “WEB-INF”目录和/WEB-INF/**/*Context.xml,用于所有此类文件 在“WEB-INF”的任何子目录中。
在初始化DispatcherServlet时,Spring MVC会查找名为 WEB-INF目录中的[servlet-name]-servlet.xml 您的 并创建在那里定义的bean,覆盖 全局中定义的同名bean的定义 范围。
考虑以下DispatcherServlet Servlet配置(在 web.xml文件):
<网络应用程序> <servlet> <servlet-name>高尔夫 <servlet-class>org.springframework.web.servlet。 DispatcherServlet</servlet类> <加载启动>1</加载启动> </servlet> <服务映射> <servlet-name>高尔夫 <url-pattern>/高尔夫/* </servlet-mapping> </web-app>
关于contextConfigLocation和命名空间
有了上述Servlet配置,您将需要一个名为
/WEB-INF/golfing-servlet.xml 在您的应用程序中; 这 文件将包含所有SpringWebMVC特定组件 (豆类)。 您可以更改此配置文件的确切位置 通过Servlet初始化参数(有关详细信息,请参见下文)。 ...
您可以自定义单个DispatcherServlet实例 通过添加 Servlet初始化参数(init-param元素)到Servlet web.xml文件中的声明。 列表见下表 支持的参数(共个)。
contextClass(上下文类) :实现WebApplicationContext的类,该类实例化此Servlet使用的上下文。 默认情况下,使用XmlWebApplicationContext。
contextConfigLocation(上下文配置位置) :传递给上下文实例(由contextClass指定)的字符串,以指示可以在何处找到上下文。 该字符串可能由多个字符串组成(使用逗号作为分隔符),以支持多个上下文。 如果具有两次定义的bean的多个上下文位置,则最新位置优先。
命名空间 :WebApplicationContext的命名空间。 默认为[servlet name]-servlet。
将“contextConfigLocation”servlet init-param传递给上下文 实例,将其解析为可能的多个文件路径 由任意数量的逗号和空格分隔,如 “test-servlet.xml, myServlet.xml”。 如果未明确指定,则上下文 实现应该从 servlet的名称空间 .
默认名称空间是“'servlet-name'-servlet”,例如“test-servlet” 对于servlet-name“test”(导致出现“/WEB-INF/test-servlet.xml” XmlWebApplicationContext的默认位置)。 命名空间可以 也可以通过“名称空间”servlet init-pram显式设置 .
.... /** *WebApplicationContext命名空间的后缀。 如果此类的servlet是 *给定上下文中的名称“test”,servlet使用的名称空间将 *决心“test-servlet”。 */ 公共静态最终字符串DEFAULT_NAMESPACE_SUFFIX=“-servlet”; ....
默认情况下,配置将取自 根上下文的“/WEB-INF/applicationContext.xml”,以及 “/WEB-INF/test-servlet.xml”用于具有命名空间的上下文 “test-servlet”(类似于具有 servlet-name“测试”)。
配置位置默认值可以通过 ContextLoader和servlet的“contextConfigLocation”上下文面板 FrameworkServlet的init-pram 配置位置可以表示 具体文件,如“/WEB-INF/context.xml”或Ant-style模式,如 “/WEB-INF/*-context.xml”(有关模式,请参阅PathMatcher javadoc 详细信息)。
... /**根上下文的默认配置位置*/ 公共静态最终字符串DEFAULT_CONFIG_LOCATION=“/WEB-INF/applicationContext.xml”; /**为命名空间构建配置位置的默认前缀*/ 公共静态最终字符串DEFAULT_CONFIG_LOCATION_PREFIX=“/WEB-INF/”; /**为命名空间构建配置位置的默认后缀*/ 公共静态最终字符串DEFAULT_CONFIG_LOCATION_SUFFIX=“.xml”; ... /** *根上下文的默认位置是“/WEB-INF/applicationContext.xml”, *和“/WEB-INF/test-servlet.xml”,用于名称空间为“test-servlet”的上下文 *(类似于带有servlet-name“test”的DispatcherServlet实例)。 */ @覆盖 受保护字符串[]getDefaultConfigLocations(){ if(getNamespace()!= null){ 返回新字符串[]{DEFAULT_CONFIG_LOCATION_PREFIX+getNamespace()+DEFAULT_CONFIG_LOCATION_SUFFIX}; } 其他{ 返回新的String[]{DEFAULT_CONFIG_LOCATION}; } }
指定自定义命名空间的示例
<? xml version=“1.0”encoding=“UTF-8”?> <web-app xmlns=“ http://java.sun.com/xml/ns/javaee " xmlns:xsi=“ http://www.w3.org/2001/XMLSchema-instance " xsi:schemaLocation=“ http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd "> <!-- DispatcherServlet应用程序上下文的配置(子上下文)--> <servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet。 DispatcherServlet</servlet-class> <init-param> 名称空间 <param-value>spring/mvc/spring-mvc</param-value> </init-param> </servlet> <服务映射> <servlet名称>spring-mvc</servlet名称> <url-pattern>/* </servlet-mapping> </web-app>
结论
命名空间 参数设置用于生成 违约 上下文配置位置 contextConfigLocation(上下文配置位置) 参数显式设置上下文配置位置,而不是依赖于从命名空间构建的默认位置
<servlet> <servlet-name>调度程序 <servlet-class>org.springframework.web.servlet。 DispatcherServlet</servlet-class> <init-param> 名称空间 <param value>config/spring mvc</param value> </init-param> <加载启动>1</加载启动> </servlet>
<上下文图表> 上下文配置位置 <param-value>/WEB-INF/config/app-*.xml </context-param>