Spring MVC 学习 ——

版本5.1.3.RELEASE

这部分文档包括对基于Servlet API构建并部署到Servlet容器的Servlet-stack Web应用程序的支持。各个章节包括Spring MVC,View Technologies,CORS支持和WebSocket支持。对于反应堆栈Web应用程序,请参阅Web on Reactive Stack。

1. Spring Web MVC

Spring Web MVC是构建在Servlet API上的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块(spring-webmvc)的名称,但它通常被称为“Spring MVC”。

与Spring Web MVC并行,Spring Framework 5.0引入了一个反应堆栈Web框架,其名称“Spring WebFlux”也基于其源模块(spring-webflux)。本节介绍Spring Web MVC。下一节将介绍Spring WebFlux。

有关基本信息以及与Servlet容器和Java EE版本范围的兼容性,请参阅Spring Framework Wiki。

1.1. Spring MVC 的前端控制器

Spring MVC和许多其他Web框架一样,围绕前端控制器模式设计,其中中央Servlet DispatcherServlet(Servlet 前端控制器)为请求处理提供共享算法(简单来说就是前端控制器提供了一个算法告诉app获取的请求该怎样分发向哪里发送),而实际工作由可配置委托组件(XML等)执行(翻译:实际的工作主要看配置文件怎样分配)。该模型非常灵活,支持多种工作流程。

DispatcherServlet与任何Servlet一样,需要使用Java配置或web.xml根据Servlet规范进行声明和映射。反过来,DispatcherServlet使用Spring配置来发现请求映射,视图解析,异常处理等所需的委托组件

下面的Java配置示例注册并初始化DispatcherServlet,它由Servlet容器自动检测(相关配置后面将介绍):

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletCxt) {

        // Load Spring web application configuration
        AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
        ac.register(AppConfig.class);
        ac.refresh();

        // Create and register the DispatcherServlet
        DispatcherServlet servlet = new DispatcherServlet(ac);
        ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
        registration.setLoadOnStartup(1);
        registration.addMapping("/app/*");
    }
}

除了直接使用ServletContext API之外,您还可以扩展AbstractAnnotationConfigDispatcherServletInitializer并覆盖特定方法

以下web.xml配置示例注册并初始化DispatcherServlet:

<web-app>

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

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/app-context.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>

</web-app>

Spring Boot遵循不同的初始化顺序。Spring Boot使用Spring配置来引导自身和嵌入式Servlet容器,而不是挂钩到Servlet容器的生命周期。在Spring配置中检测Filter和Servlet声明,并在Servlet容器中注册。有关更多详细信息,请参阅Spring Boot官方文档。

Context 层次结构

DispatcherServlet需要一个WebApplicationContext(普通ApplicationContext的扩展)来进行自己的配置。WebApplicationContext有一个指向ServletContext的链接以及与之关联的Servlet。它还绑定到ServletContext,以便应用程序可以使用RequestContextUtils上的静态方法来查找WebApplicationContext,如果它们需要访问它的话。

对于许多应用程序,拥有单个WebApplicationContext很简单且足够。也可以有一个上下文层次结构,其中一个根WebApplicationContext在多个DispatcherServlet(或其他Servlet)实例之间共享,每个实例都有自己的子WebApplicationContext配置

根WebApplicationContext通常包含基础结构bean,例如需要跨多个Servlet实例共享的数据存储库和业务服务。这些bean是有效继承的,可以在特定于Servlet的子WebApplicationContext中重写(即重新声明),它通常包含给定Servlet本地的bean。下图显示了这种关系:

mvc context hierarchy

以下示例配置WebApplicationContext层次结构:

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { App1Config.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/app1/*" };
    }
}

如果不需要application context hierarchy,则应用程序可以通过getRootConfigClasses()返回所有配置,并从getServletConfigClasses()返回null。

猜你喜欢

转载自blog.csdn.net/qq_40929531/article/details/84748566