`servlet-context.xml`、`root-context.xml` 和 `web.xml` 的预期用途是什么?
What's the intended use of `servlet-context.xml`, `root-context.xml` and `web.xml`?
我是 Java Spring MVC 网络开发的新手。我对下面的 3 个配置文件感到困惑。它们由 STS webmvc 项目模板自动创建。
- 它们的预期用途是什么?
- 为什么我们需要 3 个配置文件而不是一个?
- 他们的位置不同有什么特殊原因吗?
root-context.xml
是 Spring Root 应用程序上下文配置。这是可选的。它用于配置您的 non-web bean。不过,Spring 安全或 OpenEntityManagerInView 过滤器需要它。最好放在meta-inf/spring
.
servlet-context.xml
是 Spring Web 应用程序上下文配置。它用于在 Web 应用程序中配置 Spring beans。如果你使用 root-context.xml
,你应该把你的非 web bean 放在 root-context.xml
,而 web bean 放在 servlet-context.xml
.
web.xml
用于配置您的 servlet 容器,例如 Tomcat。你也需要这个。它用于配置 servlet 过滤器和 servlet。 web.xml
首先加载,然后可选择加载您的根上下文,然后加载您的 Web 上下文。
您可以通过使用 JavaConfig 避免使用 xml。
创建文件名"javax.servlet.ServletContainerInitializer"(不带引号)文件内容将是实现此接口的class的完全限定名称,将文件放在这里/META-INF/services
您可以像这样实现 ServletContainerInitializer 并覆盖方法
public class CourtServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.register(CourtConfiguration.class);
DispatcherServlet dispatcherServlet = new DispatcherServlet(applicationContext);
ServletRegistration.Dynamic registration = ctx.addServlet("court", dispatcherServlet);
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
之后就不需要了web.xml
请记住,如果您使用 Maven 来构建您的应用程序,请在 pom.xml
中提及这一点
<properties>
<failOnMissingWebXml>false</failOnMissingWebXml>
</properties>
在此之前,您必须使用@Configuration 和@Bean 注释编写配置class
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@ComponentScan(basePackages = "com.practice.learnspringmvc.*")
public class CourtConfiguration {
@Bean
public InternalResourceViewResolver internalResourceViewResolver() {
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
internalResourceViewResolver.setPrefix("/WEB-INF/views/");
internalResourceViewResolver.setSuffix(".jsp");
return internalResourceViewResolver;
}
}
此配置 class 替换了来自 servlet-context.xml
的 <bean></bean>
初始值设定项
我是 Java Spring MVC 网络开发的新手。我对下面的 3 个配置文件感到困惑。它们由 STS webmvc 项目模板自动创建。
- 它们的预期用途是什么?
- 为什么我们需要 3 个配置文件而不是一个?
- 他们的位置不同有什么特殊原因吗?
root-context.xml
是 Spring Root 应用程序上下文配置。这是可选的。它用于配置您的 non-web bean。不过,Spring 安全或 OpenEntityManagerInView 过滤器需要它。最好放在meta-inf/spring
.
servlet-context.xml
是 Spring Web 应用程序上下文配置。它用于在 Web 应用程序中配置 Spring beans。如果你使用 root-context.xml
,你应该把你的非 web bean 放在 root-context.xml
,而 web bean 放在 servlet-context.xml
.
web.xml
用于配置您的 servlet 容器,例如 Tomcat。你也需要这个。它用于配置 servlet 过滤器和 servlet。 web.xml
首先加载,然后可选择加载您的根上下文,然后加载您的 Web 上下文。
您可以通过使用 JavaConfig 避免使用 xml。
创建文件名"javax.servlet.ServletContainerInitializer"(不带引号)文件内容将是实现此接口的class的完全限定名称,将文件放在这里/META-INF/services
您可以像这样实现 ServletContainerInitializer 并覆盖方法
public class CourtServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.register(CourtConfiguration.class);
DispatcherServlet dispatcherServlet = new DispatcherServlet(applicationContext);
ServletRegistration.Dynamic registration = ctx.addServlet("court", dispatcherServlet);
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
之后就不需要了web.xml
请记住,如果您使用 Maven 来构建您的应用程序,请在 pom.xml
中提及这一点<properties>
<failOnMissingWebXml>false</failOnMissingWebXml>
</properties>
在此之前,您必须使用@Configuration 和@Bean 注释编写配置class
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@ComponentScan(basePackages = "com.practice.learnspringmvc.*")
public class CourtConfiguration {
@Bean
public InternalResourceViewResolver internalResourceViewResolver() {
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
internalResourceViewResolver.setPrefix("/WEB-INF/views/");
internalResourceViewResolver.setSuffix(".jsp");
return internalResourceViewResolver;
}
}
此配置 class 替换了来自 servlet-context.xml
的<bean></bean>
初始值设定项