`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 项目模板自动创建。

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> 初始值设定项