SSM框架之SpringMVC4专题1:SpringMVC概述_第1张图片

1 SpringMVC简介

  • SpringMVC也叫作Spring web mvc,属于表现层的框架。SpingMVC是Spring框架的一部分,是在Spring3.0后发布的。
    SSM框架之SpringMVC4专题1:SpringMVC概述_第2张图片
  • 由以上Spring的结构图可以看出,Spring由四大部分组成:Dao部分(DAO与ORM)、AOP部分、Web部分(JEE与Web),以及loC容器部分(Core)。

    2 第一个SpringMVC程序

  • 完成功能:用户提交一个请求,服务端处理器在接收到这个请求后,给出一条欢迎信息,在响应页面中显示该信息。

    2.1 导入Jar包

  • 在创建好web项目后,首先要导入Jar包。SpringMVC需要的基本Jar包,是在原来Spring的Jar包(Spring专题4中讲完事务部分后所用到的Spring的所有jar包)基础上,增加两j个ar包。如下图所示:
    SSM框架之SpringMVC4专题1:SpringMVC概述_第3张图片
  • Spring-context-support:包括支持UI模版,邮件服务,缓存Cache等方面的类。
  • Spring-webmvc:对SpringMVC的实现。

    2.2 注册中央调度器

    
    
    springmvc
    
        org.springframework.web.servlet.DispatcherServlet
    
    1
    
    
    springmvc
    *.do
    

    2.2.1 全限定性类名

  • 该中央调度器为一个Servlet,名称为DispatcherServlet。中央调度器的全限定性类名在导入的Jar文件spring-webmvc-4.2.1.RELEASE.jar的第一个包org.springframework.web.servlet下可以找到。
    SSM框架之SpringMVC4专题1:SpringMVC概述_第4张图片

    2.2.2 < load-on-startup/>

  • 中添加的作用是,标记是否在web服务器(这里是Tomcat)启动时会创建这个Servlet实例,即是否在Web服务器启动时调用执行该Servlet的init()方法,而不是在真正访问时才创建。
  • 它的值必须是一个整数。
  • 当值大于等于0时,表示容器在启动时就加载并初始化这个servlet。数值越小,该Servlet的优先级就越高,其被创建的也就越早。
  • 当值小于0或者没有指定时,则表示该Servlet在真正被使用时才会去创建。
  • 当值相同时,容器会自己选择创建顺序。

    2.2.3 < url-pattern/>

  • 对于,不能够写为/,最好也不要写为/,建议写为.do的形式,详见1.4再解

    2.2.4 配置文件位置与名称

  • 注册完毕后,可直接在服务器上发布运行,此时,默认浏览器页面,以及MyEclipse控制台会抛出FileNotFoundException异常。即默认要从项目根下的WEB-INF目录下找名称为Servlet名称-servlet.xml的配置文件。这里的“Servlet名称”指的是注册中央调度器时标签中指定的Servlet的name值。本例配置文件名为springmvc-servlet.xml。
    SSM框架之SpringMVC4专题1:SpringMVC概述
    • 从DispatcherServlet类的父类的源码注释FrameworkServlet中可以看到相关描述:
      SSM框架之SpringMVC4专题1:SpringMVC概述
    • 而一般情况下,该配置文件是放在类路径下的,即src目录下。所以,在注册中央调度器时,还需要为中央调度器设置查找SrpingMVC配置文件路径,以及文件名。
      
      
      springmvc
      
      org.springframework.web.servlet.DispatcherServlet
      
      
      contextConfigLocation
      classpath:springmvc.xml
      
      1
      
      
      springmvc
      *.do
      
  • 打开DispatcherServlet的源码,其继承自FrameworkServlet,而该类中有一个属性contextConfigLocation,用于设置SpringMVC配置文件的路径以及文件名。该初始化参数的属性就来自于这里。
    SSM框架之SpringMVC4专题1:SpringMVC概述_第5张图片
    SSM框架之SpringMVC4专题1:SpringMVC概述_第6张图片

    2.3 创建SrpingMVC配置文件

  • 在工程的类路径即src目录下创建SpringMVC的配置文件springmvc.xml。该文件名可以任意命名。而该xml文件的约束,则使用Spring配置文件最全约束。
    
    
    

    2.4 定义处理器

  • 该处理器需要实现Controller接口。
    public class MyController implements Controller{
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, 
            HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("welcome", "Hello SpringMVC World!");
        mv.setViewName("/WEB-INF/jsp/welcome.jsp");
        return mv;
    }
    }
  • ModelAndView类中的addObject()方法用于向其Model中添加数据。Model的底层为一个Map。另外需要的注意的是,addObject()方法的返回值为ModelAndView,则说明可向该Model中连续添加多个数据。
    SSM框架之SpringMVC4专题1:SpringMVC概述

    2.5 注册处理器

  • 在springmvc.xml中注册处理器。不过,需要注意的是处理器的id属性值为一个请求URI。表示当客户端提交该请求时,会访问class指定的这个处理器。

    2.6 定义目标页面

  • 在WEB-INF目录下新建一个子目录jsp,在其中新建一个JSP页面show.jsp。
    SSM框架之SpringMVC4专题1:SpringMVC概述_第7张图片
    
    服务端信息为: ${welcome }
    

    2.7 修改视图解析器的注册

  • SpringMVC框架为了避免对于请求资源路径与扩展名上的亢余,在视图解析器InternalResourceViewResolver中引入了请求的前缀与后缀。而ModelAndView中只需要给出要跳转页面的文件名即可,对于具体的文件路径与文件扩展名,视图解析器会自动完成拼装。
        
            
            
         

    2.8 修改处理器

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, 
            HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("welcome", "Hello SpringMVC World!");
        mv.setViewName("welcome");
        return mv;
    }

    3 SpringMVC执行流程

    SSM框架之SpringMVC4专题1:SpringMVC概述_第8张图片

    3.1 执行流程简单分析

    1、浏览器提交请求到中央调度器;
    2、中央调度器直接将请求转给处理器映射器;
    3、处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后返回给中央调度器;
    4、中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器;
    5、处理器适配器调用执行处理器;
    6、处理器将处理结果以及要跳转的视图封装到一个对象ModelAndView中,并将其返回给处理器适配器;
    7、处理器适配器直接将结果返回给中央处理器;
    8、中央处理器调用视图解析器,将ModelAndView中的视图名称封装为视图对象;
    9、视图解析器将封装了的视图对象返回给中央调度器;
    10、中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象;
    11、中央调度器相应浏览器

    3.2 API简要说明

    3.2.1 DispatcherServlet

  • 中央调度器,也称之为前端控制器,在MVC架构模式中充当控制器C,DispatcherServlet是整个流程的控制中心,由它调用诸如处理器映射器、处理器适配器、视图解析器等其他组件处理用户请求。中央调度器的存在降低了组件之间的耦合度。

    3.2.2 HandlerMapping

  • 处理器映射器,负责根据用户请求找到相应的将要执行的Handler,即处理器。即用于完成将用户请求映射为要处理该请求的处理器,并将处理器封装为处理器执行链传给中央调度器。

    3.2.3 HandleAdapter

  • 处理器适配器,通过HandleAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。中央调度器会根据不同的处理器自动为处理器选择适配器,以执行处理器。

    3.2.4 Handler

  • 处理器,也称之为后端控制器,在DispatcherServlet的控制下Handler调用Service层对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况下需要程序员根据业务需求自己开发Handler。

    3.2.5 ViewResolver

  • 视图解析器 ,负责将处理结果生成View视图,ViewResolver首先将逻辑视图名解析为物理视图名,即具体的页面地址,再生成VIew视图对象。最后将处理结果通过页面形式展示给用户。
  • SpringMVC框架提供了很多的View视图类型,包括:JstView、RedirectView等。一般情况下需要听过页面标签或者页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

    3.3 DispatcherServlet的默认配置

  • 第一个SpringMVC的程序已经可以正确运行了。但是发现一个问题,在流程介绍中所述的重要的处理器映射器、处理器适配器、视图解析器等,都在哪里,不用做配置吗?
  • 当然不是!这些内容均在DispatcherServlet的默认配置DispatcherServlet.properties文件中被定义。这个文件与DispatcherServlet类在同一个包下,而且是当Spring配置文件中没有指定配置时使用的默认情况。
    SSM框架之SpringMVC4专题1:SpringMVC概述_第9张图片
  • 从其文件中的内容中可以看到,这些组件的默认配置如下:
    SSM框架之SpringMVC4专题1:SpringMVC概述_第10张图片

    4 再解< url-pattern/>

    4.1 配置详解

    4.1.1 建议写为*.do形式

  • 在没有特殊要求的情况下,SpringMVC的中央处理器DispatcherServlet的常使用后缀匹配方式,如写为*.do。

    4.1.2 不能够写为/*

  • 这里的url-pattern不能够写为/*,因为DispatcherServlet会将向动态页面的跳转请求,即向JSP页面的跳转请求也当做是一个普通的Controller请求。中央调度器会调用处理器映射器为其查找相应的处理器。当然是找不到的,所以在这种情况下,所有的JSP页面跳转均会报404错误。
  • 将项目中web.xml的中央调度器的改为/*后,马上连项目的index.jsp页面也都不能够访问。

    4.1.3 最好也不要写为/

  • 最好也不要写为/,因为DispatcherServlet会将静态资源的获取请求,例如.css、.js、.jpg、.png等资源的获取请求,也当做是一个普通的Controller请求。中央调度器会调用处理器映射器为其查找相应的处理器,当然也是找不到的,所以在这种情况下,所有的静态资源的获取请求也均会报404错误。

    4.2 静态资源访问

  • 的值并不是说写为/后,静态资源就无法访问了,经过一些配置后,该问题也是可以解决的。

    4.2.1 使用Tomcat中名为default的Servlet

  • 在Tomcat中,有一个专门用于处理静态资源访问的Serlvet--DefaultServlet。其为default。可以处理各种静态资源访问请求。该servlet注册在Tomcat服务器的web.xml中。在Tomcat安装目录/conf/web.xml。
    SSM框架之SpringMVC4专题1:SpringMVC概述_第11张图片
  • 我们需要做的就是直接使用它即可,即直接在web.xml中注册即可。
    
    default
    *.jpg
    
    
    default
    *.js
    
    
    default
    *.css
    

    4.2.2 使用< mvc:default-servlet-handler/>

  • 只需要在springmvc.xml中添加标签即可。
  • 会将对静态资源的访问请求添加到SimpleUrlHandlerMapping的urlMap中,key就是请求的URI,而value则为默认Servlet请求处理器DefaultServletHttpRequestHandler对象。而该处理器调用了Tomcat的DefaultServlet来处理静态资源的访问请求。
  • 当然,要想使用标签,需要引入mvc约束。

    4.2.3 使用< mvc:resources/>

  • 在Spring3.0.4版本后,Spring中定义了专门用于处理静态资源访问请求的处理器ResourceHttpRequestHandler。并且添加了标签,专门用于解决静态资源无法访问问题。需要在springmvc.xml中添加如下形式的配置:
  • location表示静态资源所在目录。当然,这里的目录包含/WEB-INF/目录以及子目录。
  • mapping表示该资源的请求,注意,后面是两个星号。
  • 该配置会把对该静态资源的访问请求添加到SimpleUrlHandlerMapping的urlMap中,key就是真正与mapping的URI匹配的URI,而value则为静态资源处理器对象ResourceHttpRequestHandler。