1.介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Spring MVC是Spring提供的一个强大而灵活的web框架。`借助于注解`,Spring MVC提供了几乎是POJO的开发
模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中
的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。

Spring MVC是Spring家族中应用于Web应用的一个模块,是Spring提供的一个基于MVC设计模式的Web开发框
架,可以将它理解为Servlet。在MVC模式中,Spring MVC作为控制器(Controller)来建立模型与视图的数
据交互,是结构最清晰的JSP Model2实现,可以说是一个典型的MVC框架。

除此之外,Spring MVC框架采用松耦合、可插拔的组件结构,具有高度可配置性,比起其他的MVC框架更具有
扩展性和灵活性。并且它本身就是Spring家族的一部分,与Spring框架整合更是天衣无缝。

在Spring MVC框架中,Controller替换Servlet来担负控制器的职责。Controller接收请求,调用相应的
Model进行处理,Model处理完之后将结果返回给Controller,Controller再指派相应的View对处理结果进
行渲染,最终响应给客户端进行展示。

2.重要组成部分

1
2
Spring MVC主要由DispatcherServlet、处理器映射HandlerMapping【找那个控制器】映射有具有多种方式、
适配器【使用和调用控制器的方法】、控制器【业务】、Views视图解析器、视图组成。

3.快速入门配置

  1. web.xml 配置 DispatcherServlet

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>
  2. 在WEB-INF目录下创建DispatcherServlet-servlet.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
  3. 配置DispatcherServlet-servlet.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!-- 1. 配置处理器映射,springmvc默认的处理器映射器
    BeanNameUrlHandlerMapping:根据bean的name属性的url去找handlerController -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!-- 2. 配置处理器适配置器执行Controller -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!-- 3.配置一个控制器 -->
    <bean name="/user.do" class="com.gyf.backoffice.web.controller.UserController"/>
    <!-- 4.配置springmvc视图解析器
    视图解析器解析的视频路径为:前缀 + 后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views"/>
    <property name="suffix" value=".jsp"/>
    </bean>
  4. 应用流程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    springMVC的流程如下: 
    1.前端控制器DispatchServlet接受客户端浏览器发送的请求
    2.前端控制器DispatchServlet调用处理器映射器HandlerMapping查找相应的处理器
    3.处理器映射器根据URL查找处理器Handler,并给前端控制器返回生成的处理器和相应的处理器拦截器HandlerIntercepter
    4.前端控制器调用处理器适配器HandlerAdapter
    5.处理器适配器调用相应的处理器
    6.处理器给处理器适配器返回ModelAndView(包含逻辑视图名)
    7.处理器将ModelAndView返回给前端控制器
    8.前端控制器将ModelAndView传给视图解析器ViewResolver
    9.视图解析器ViewResolver解析后将具体的视图View返回给前端控制器
    10.前端控制器对视图进行渲染(视图渲染:将模型数据(在ModelAndView中)填充到request域中)
    11.前端控制器将视图返回给客户端浏览器

SpringMVC架构图


4.处理器映射

  1. 非注解的处理器

  2. BeanNameUrlHandlerMapping,这个类的映射规则是将 bean 的 name 作为 url 进行查找,需要在配置 Handler 时指定 beanname,其示例代码如下:

    1
    2
    3
     这时的 url 地址就会根据 bean 的 name 去查找,也就是示例中配置的 name 的值 test.do,且这个必须以 / 开头。
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    <bean name="/test.do" class="com.fageweiketang.controller.TestController"/>
  3. SimpleUrlHandlerMapping,它可以通过内部参数去配置请求的 url 和 handler 之间的映射关系,其示例配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="interceptors">
    <list>
    <ref bean="someCheckInterceptor1"/>
    <ref bean="someCheckInterceptor2"/>
    </list>
    </property>
    <property name="mapping">
    <props>
    <prop key="user.action">userController</prop>
    <prop key="product.action">productController</prop>
    <prop key="other.action">otherController</prop>
    </props>
    </property>
    </bean>其中 property 属性可以配置 interceptors 拦截器,也可以配置 mapping(Handler 处理器和 url 的映射关系)。
  4. ControllerClassNameHandlerMapping,它是将 Controller 控制器的名字作为映射的 url 地址,例如 TestController 控制器则映射的地址就为 / test*,如果是 test 控制器下的 test 方法,则 url 为 test/test.action,示例代码如下:

    1
    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

  1. 注解适配的处理器(开发常用这种)

  2. 注解处理方式不需要在 xml 中进行配置,只需要在指定的地方声明一些注解信息即可。SpringMVC3.1 版本之后默认的处理器映射器是 RequestMappingHandlerMapping,位于 SpringMVC 的核心 jar 包 org.springframework.web.servlet.mvc.method.annotation 中。

  3. 注解配置方式有两种.

    1. 第一种是在 springmvc.xml 中配置,声明相关的 bean 和实现即可,示例代码如下:

      1
      <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
  4. 第二种是使用 mvc:annotation-driven/ 标签来配置,这个标签是一种简写方式,它会自动去注册处理器映射器,配置示例如下:

    1
    <mvc:annotation-driven></mvc:annotation-driven>
  5. 使用Controller来标识它是一个控制器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Controller
    public class TestControllerTest{
    @RequestMapping("/testurl")
    public ModelAndView testurl() throws Exception{
    //逻辑代码
    }
    }

    在以上代码中 @Controller 是注解信息,表示该类是一个控制器类,可以被注解的处理器适配器找
    到,而 TestControllerTest 类中的 testurl 方法上有一个 @RequestMapping 注解信息,作用是指定一个 url 与该方法绑定。
1
    
  1. 这时为了让注解的处理器映射器能找到 Handler 控制器,需要在 springmvc.xml 做下配置,
    方式有两种:

    • 在 springmcv.xml 中声明 bean 信息,示例代码如下:

      1
      <bean class="com.fageweiketang.controller.TestController"></bean>
  • 第二种是扫描配置,对某一个包下的所有类进行扫描,找出所有使用 @Controller 注解的 Handler 控制器类,示例代码如下:

    1
    <context:component-scan base-package="com.fageweiketang.controller"></context:component-scan>

5.案例图示 注解下开发###

  • 配置xml。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!-- 1.配置注解扫描位置 -->
    <context:component-scan base-package="com.gyf.backoffice.web.controller"/>

    <!-- 2. 配置处理器映射,通过注解来查找 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    <!-- 3.配置注解处理适配器来执行控制器的方法 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    <!-- 配置springmvc视图解析器
    视图解析器解析的视频路径为:前缀 + 后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views"/>
    <property name="suffix" value=".jsp"/>
    </bean>
  • 配置控制器 返回指定网页。

  • 优化mvc配置文件

  • RequestMapping讲解

  • 有关于参数传递的问题 回看教案。

  • 转发和重定

  • RequestParam

  • ResponseBody和RequestBody

    1
    2
    @ResponseBody把后台pojo转换json对象,返回到页面。
    @RequestBody接受前台json数据,把json数据自动封装javaBean

    image-20201122203223818

6.Springmvc多视图

  1. 配置xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     <bean
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <!-- 配置支持媒体类型 -->
    <property name="contentNegotiationManager">
    <bean
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="mediaTypes">
    <map>
    <entry key="json" value="application/json"></entry>
    <entry key="xml" value="application/xml"></entry>
    </map>
    </property>
    </bean>
    </property>

    <!-- 指定默认视图 -->
    <property name="defaultViews">
    <!-- 支持多个视图 -->
    <list>
    <!-- 对josn格式视图支持 -->
    <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>

    <!-- xml格式视图支持 -->
    <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
    <constructor-arg>
    <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
    <list>
    <value>com.gyf.backoffice.domain.Student</value>
    </list>
    </property>
    </bean>
    </constructor-arg>
    </bean>
    </list>
    </property>
    </bean>
  2. 控制器提供一个接口


未完结!