zoukankan      html  css  js  c++  java
  • Spring MVC执行原理和基于Java的配置过程

    一、Spring MVC执行原理和基于Java配置的配置过程

    (一)Spring MVC执行过程,大致为7步。

     

    1. 所有的请求都会经过Spring的一个单例的DispacherServlet
    2. DispatcherServlet会查询一个或多个处理器映射,找到请求的URL所对应的控制器。
    3. 把请求的内容传递给控制器后等待控制器处理这些内容。
    4. 控制器在逻辑处理后会产生一些数据(例如查询所有的用户信息),这些数据存在在模型(Model)中,同时返回一个视图名用作渲染数据。
    5. DispacherServlet找到视图解析器,视图解析器通过视图名找到真正的视图实现。
    6. DispacherServlet找到视图实现后再把模型(Model)的数据渲染到视图中。
    7. 把最终的视图通过响应对象传递给客户端

    (二)搭建Spring MVC

    1. 配置DispacherServletServlet

    DispatcherServletSpringMVC的核心,所有请求通过它来接触到框架,它又把请求转发到其他的组件。

    按照传统的方式,Servlet需要配置在web.xml的文件中。但是,在Servlet3Spring3.1之后,又提供了另外一种依据Java类配置的方式。我们先看看这种方式的代码是什么样的。

    public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
        protected Class<?>[] getRootConfigClasses() {
            System.out.println("用来加载spring管理的中间层和数据层组件,下面会给出具体代码");
            return new Class[]{RootConfig.class};
        }
        protected Class<?>[] getServletConfigClasses() {
            System.out.println("用来加载web相关的组件,如控制器、视图解析器等,下面会给出具体代码");
            return new Class[]{WebConfig.class};
        }
        protected String[] getServletMappings() {
            System.out.println("如果映射是/,代表DispacherServlet是默认的Servlet");
            return new String[]{"/"};
        }
    }
    View Code

    “SpittrWebAppInitializer”是我们自定义的类名,它继承了AbstractAnnotationConfigDispatcherServletInitializer并且实现了三个方法,下图解释了为什么需要继承这个类,以及为什么继承了这个类后,请求就能自动的转到DispacherServlet来处理。

     

    1. 启用SpringMVC

    当配置完DispacherServlet后,还需要启用SpringMVC组件。

    如果使用XML启动,可以使用<mvc:annotation-driven>

    当基于Java配置时,需要在配置类上添加@EnableWebMvc注解:

     

    但是如果只添加一个注解的话,会出现下面的问题:

    (1)没有配置视图解析器,Spring会使用BeanNameView-Resolver,这个视图解析器会查找ID与视图名相同的Bean,并且这个Bean需要实现View接口,通过这种方式来解析视图。

    (2)没有启动组件扫描。Spring只能使用显式配置的控制器

    (3)DispacherServlet会映射为应用默认Servlet,会处理所有请求,包括静态资源,如图片和样式表。

    下面是一个更完整的Config,解决了上面的问题。

     

    除了WebConfig还有一个RootConfig,由于现在只关注webRootConfig很简单:

     

  • 相关阅读:
    discuz Ucenter第三方双向同步登录
    python: 输出 1~100 之间不能被 7 整除的数,每行输出 10 个数字,要求应用字符串格式化方法美化输出格式。
    用python语言来判断一个数是否是水仙花数?
    java如何调用webservice接口
    ASP.NET 全局变量和页面间传值方法
    从客户端中检测到有潜在危险的 Request.Form 值] 处理办法
    第一次作业要点及重要属性
    Servlet生命周期
    cookie与session的比较
    零基础学习HTML5
  • 原文地址:https://www.cnblogs.com/chenkeyu/p/7718194.html
Copyright © 2011-2022 走看看