SpringMVC概念与实现过程

注:spring-boot和spring-MVC的区别,spring-boot基于spring-MVC的基础上简化了配置过程(个人理解)
注:映射解释,可以参考java的map数据结构,或者比如python的dict(字典)类型,根据key找到对应的value

DispatcherServlet:springMVC的核心调度器,主要作用是用来分发的
Handler-Mapping:映射处理器,根据url映射到具体的controller类
Handler-Adapter:适配处理器
Handler:处理器(需要由工程师开发)
ViewResolver:视图解析器
ModelandView:分为两个部分,一个是视图,一个是model,model是一个mapping类型的集合,该mapping集合封装了controller返回的处理结果

image.png

1、用户使用浏览器向服务端发送一个请求,最先进入到web.xml的servlet-mapping中配置的url-pattern,拦截到请求之后会将请求传到web.xml的servlet中的servlet-class中的org.springframework.web.servlet.DispatcherServlet。
总结:这个步骤是将请求发送到springMVC的DispatcherServlet核心调度器。

2、DispatcherServlet将用户的请求转发给Handler-Mapping的映射处理器中,由该处理器决定由哪个controller类来处理该请求,确定好controller类之后将该类返回给DispatcherServlet核心调度器中。
总结:这个步骤是将用户请求找到对应映射的controller类,然后将该类返回给DispatcherServlet,由Handler-Mapping执行该映射过程。

3、DispatcherServlet将controller类转发给Handler-Adapter适配处理器中,由该处理器决定映射到这个controller类中的哪个方法。
总结:这个步骤是使用controller类找到对应映射的处理方法。

4、Handler-Adapter将映射得到的方法交给对应的controller的类方法去执行该请求,最后封装返回一个ModelandView类给Handler-Adapter,Handler-Adapter适配处理器再将ModelandView类返回给DispatcherServlet核心调度器里。
总结:这个步骤是执行对应的方法,并且将处理结果返回给DispatcherServlet,由Handler-Adapter处理该映射并处理的过程。

5、DispatcherServlet将ModelandView中的viewName传给spring-mvc.xml的bean中配置的org.springframework.web.servlet.view.InternalResourceViewResolver,ViewResolver视图解析器将配置的前缀和后缀拼接成绝对路径,最后返还给DispatcherServlet。
总结:这个步骤是将ModelandView中的viewName传给ViewResolver视图解析器,视图解析器将viewName拼接前缀和后缀成一个完整的字符串,找到绝对路径,最后返回给DispatcherServlet。

6、DispatcherServlet拿到根据视图解析器返回的绝对路径,通过这个绝对路径找到这个视图的资源文件,最后再将Model中的数据注入到视图当中,形成一个物理页面,最后返回给用户。
总结:这个步骤是找到视图,然后将model的数据注入到视图中并返回给用户。

SpringMVC配置

1、添加依赖(pom.xml)

javaEE

  1. <properties>
  2. <javax.servlet-api.version>3.1.0</javax.servlet-api.version>
  3. <jsp-api.version>2.2</jsp-api.version>
  4. </properties>
  5. <!-- javaEE -->
  6. <dependency>
  7. <groupId>javax.servlet</groupId>
  8. <artifactId>javax.servlet-api</artifactId>
  9. <version>${javax.servlet-api.version}</version>
  10. <scope>provided</scope>
  11. </dependency>
  12. <dependency>
  13. <groupId>javax.servlet.jsp</groupId>
  14. <artifactId>jsp-api</artifactId>
  15. <version>${jsp-api.version}</version>
  16. <scope>provided</scope>
  17. </dependency>
  18. <dependency>
  19. <groupId>jstl</groupId>
  20. <artifactId>jstl</artifactId>
  21. <version>${jstl.version}</version>
  22. </dependency>

Spring IOC 容器来负责对象的生命周期和对象之间的关系

            <!-- 变量 -->
            <properties>
        <spring-core.version>4.3.16.RELEASE</spring-core.version>
      </properties>

      <!-- spring-ioc -->
            <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring-core.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring-core.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring-core.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>${spring-core.version}</version>
      </dependency>

spring-aop
面向切面编程:spring-aop就是一个拦截器,springaop通过代理模式实现方法的拦截

            <!-- 变量 -->
            <properties>
        <spring-core.version>4.3.16.RELEASE</spring-core.version>
      </properties>

      <!-- spring-aop -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring-core.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${spring-core.version}</version>
      </dependency>

spring-webmvc

            <!-- 变量 -->
            <properties>
        <spring-core.version>4.3.16.RELEASE</spring-core.version>
      </properties>

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring-core.version}</version>
      </dependency>

      <!-- 添加webmvc就可以不用添加web,webmvc依赖于web,所以上面可以不用添加导入 -->
            <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring-core.version}</version>
      </dependency>

注:spring-webmvc 是 Spring-web 的一个实现。spriing-webmvc 依赖于 spring-web,根据maven的依赖管理机制,只需要导入spring-webmvc就会间接地添加 spring-web。

2、配置核心控制器DispatcherServlet,并制定核心配置文件路径(xxx-servlet.xml)

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

  <!-- 1、配置DispatcherServlet核心控制器 -->
  <servlet>
    <!-- 指定核心控制器 -->
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- (1)、核心配置文件默认WEB-INF下并命名必须为'XXX'-servlet.xml -->
    <!-- (2)、自定义指定配置文件init-param -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring*.xml</param-value>
    </init-param>

    <!-- 设置DispatcherServlet在web应用启动的时候执行 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <!-- 拦截请求配置 -->
  <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!-- 过滤器,怕有乱码 -->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

3、配置xxx-servlet.xml文件(推荐第一种配置方式)

1、配置Handler-Mapping(映射处理器)
根据controller的实现方式不同,配置方式也有所不同
1、实现接口方式
2、基于注解实现方式
注:本文基于注解的方式实现,实现接口方式比较麻烦,推荐使用注解方式

2、配置Handler-Adapter(适配处理器)

3、Handler(处理器)

4、配置ViewResolver(视图解析器)and 配置View

配置方式1(推荐)

    <!--
        mvc注解驱动,用来简化配置,自动创建Handler-Mapping,Handler-Adapter,等同于下面两个
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
                <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
     -->
    <mvc:annotation-driven/>

    <!-- 4.配置Handler,扫包路径(需要根据项目情况进行配置) -->
    <context:component-scan base-package="com.itany.backend.controller"/>

    <!-- 5.配置ViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 指定前缀 -->
        <property name="prefix" value="/WEB-INF/views/"/>
        <!-- 指定后缀 -->
        <property name="suffix" value=".jsp"/>

        <!-- 6.配置View,如果使用的是jsp的视图技术,可以省略不写 -->
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    </bean>

配置方式2


        <!-- 2.配置HandlerMapping -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

    <!-- 3.配置HandlerAdapter -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    <!-- 4.配置Handler,扫包路径(需要根据项目情况进行配置) -->
    <context:component-scan base-package="com.itany.backend.controller"/>

    <!-- 5.配置ViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 指定前缀 -->
        <property name="prefix" value="/WEB-INF/views/"/>
        <!-- 指定后缀 -->
        <property name="suffix" value=".jsp"/>

        <!-- 6.配置View,如果使用的是jsp的视图技术,可以省略不写 -->
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    </bean>

5、静态资源处理

两种处理方式:
1、使用tomcat提供的默认的servlet来处理静态资源
2、自定义访问静态资源路径(推荐)


    <!-- tomcat默认的servlet来处理静态资源 -->
    <mvc:default-servlet-handler/>

    <!--  自定义静态资源配置  -->
    <mvc:resources mapping="/css/**" location="/WEB-INF/css/"/>
    <mvc:resources mapping="/js/**" location="/WEB-INF/js/"/>
    <mvc:resources mapping="/images/**" location="/WEB-INF/images/"/>
    <mvc:resources mapping="/fonts/**" location="/WEB-INF/fonts/"/>
    <mvc:resources mapping="/iconfont/**" location="/WEB-INF/iconfont/"/>

6、直接访问的url页面配置

    <!-- 直接访问jsp页面,path为访问的url,view-name为访问的视图名 -->
    <mvc:view-controller path="/showLogin" view-name="login"/>

controller详解

SpringMVC常用注解

注解 解释
@Controller 将此类映射为Controller,添加到IOC容器里面
@RestController 将此类映射为Controller层,默认所有方法添加@ResponseBody注解
@RequestMapping 配置请求映射路径,即URL
@GetMapping @RequestMapping上指定Get请求方式,4.3之前版本不存在该注解
@PostMapping @RequestMapping上指定Post请求方式,4.3之前版本不存在该注解
@RequestParam 表示参数来源于请求参数
@PathVariable 表示参数来源于URL
@RequestHeader 表示参数来源于请求头
@CookieValue 表示参数来源于cookie
@RequestBody 表示参数的值来源于请求体
@ResponseBody 一般结合返回object方法使用,返回Json数据
@ModelAttribute 将请求数据转化为对象
@Valid 后台校验
@InitBinder 类型转换,注册属性编辑器
@ControllerAdvice 统一异常处理,处理全局异常
@ExceptionHandler 异常处理器,处理特定异常的方法

@ModelAttribute注解有两种用法:
1、在方法参数前加该注解
作用:将请求参数转换为对象
2、在方法上加该注解
作用:在调用所有目标方法前都会调用加了@ModelAttribute注解的方法,并向模型中添加数据,实际上添加了该注解,就会将这个方法return的对象数据添加到其他@RequestMapping作用域里面

限定请求参数

参数 解释
params 限定请求参数,必须符合条件
handers 限定请求的头部信息,必须符合指定条件

返回值

偷懒,拿的百度的图
SpringMVC入门学习使用 - 图2

还有一种常用的返回Object:表示返回的是数据模型(一般返回的是Json)