Spring MVC笔记

Spring MVC

Spring MVC是目前主流的实现MVC实际模式的企业级开发款框架,Spring框架的一个子模块,无需整合,开发起来更加便捷。

什么是MVC实际模式

将应用程序分为Controller、Modle、View三层,Controller接收客户端请求,调用Model生成业务数据,传递给View.

Spring MVC就是对这套流程的封装,屏蔽了很多底层代码,开发出接口,让开发者可以更加轻松、边界地完成基于MVC模式的Web开发。

Spring MVC的核心组件
  • DispatcherServlet:前置控制器,是整个流程控制的核心,控制其他组件的执行,进行统一调度,降低组件之间的耦合度,相当于总指挥。
  • Handler:处理器,完成具体的业务逻辑,相当于Servlet或Action。
  • HandlerMapping: DispatcherServlet 接收到请求之后,通过HandlerMapping将不同的请求映射到不同的Handler。
  • HandlerInterceptor: 处理器拦截器,是一个接口,如果需要完成一些拦截处理,那么可以实现该接口。
  • HandlerExecutionChain: 处理器执行链,半酣两部分内同:Handler和HandlerInterceptor(系统会有一个默认的HandlerInterceptor,如果需要额外设置拦截,可以添加拦截器)。
  • HandlerAdapter:处理器设配器,Handler执行业务方法之前,需要进行一系列的操作,包括表单数据的验证,数据类型的转换,将表单数据封装到JavaBean,这些操作都是由HandlerAdapter完成,开发者只需要将注意力集中在业务逻辑的处理上,DispatcherServlet通过HandlerAdapter执行不同的Handler。
  • ModelAndView: 装在了模型数据和视图信息,作为Handler的处理结果,返回给DispatcherServlet。
  • ViewResolver:视图解析器,DispatcherServlet通过它将逻辑视图解析为物理视图,最终将渲染结果响应给客户端。
Spring MVC的工作流程
  • 客户端请求被DispatcherServlet接收
  • 根据HandlerMapping映射到Handler
  • 生成Handler和HandlerInterceptor
  • Handler和HandlerInterceptor以HandlerExecutionChain的形式一并返回给DispatcherServlet
  • DispatcherServlet通过HandlerAdapter调用Handler的方法完成业务逻辑处理
  • Handler返回一个ModelAndView给DispatcherServlet
  • DispatcherServlet将获取的ModelAndView对象传给ViewResolver视图解析器,讲逻辑视图解析为物理视图View。
  • ViewResolver返回一个View给DispatcherServlet。
  • DispatcherServlet根据View进行视图渲染(将模式数据Model填充到视图View中)
  • DispatcherServlet将渲染后的结果响应给客户端。

Sping MVC流程非常复杂,实际开发中很简单,因为大部分组件不需要开发者创建,管理,只需要通过配置文件的方式完成配置即可,真正需要开发者进行处理的只有Handler、View。

如何使用?

  • 创建Maven Project,pom.xml

    1
    2
    3
    4
    5
    6
    7
    <dependencies>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.0.8.RELEASE</version>
    </dependency>
    </dependencies>
  • 在web.xml中配置DispatcherServlet。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<web-app>
<display-name>Archetype Created Web Application</display-name>

<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>

</servlet>

<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
  • springmvc.xml配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--自动扫描-->
<context:component-scan base-package=""></context:component-scan>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceView">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
  • 创建Handler
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.southwind.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloHandler {
@RequestMapping("/index")
public String index() {
System.out.println("执行了index...");
return "index";
}
}

Spring MVC 注解

  • @RequestMapping

Spring MVC通过@RequestMapping注解将URL请求与业务方法进行映射,同时在Handler的类定义处以及方法定义处都可以添加@RequestMapping,在类定义处添加,相当于客户端多了一层访问路径。

  • @Controller

@Controller在类定义处,将该类交给IoC容器来管理,同时使其成为一个控制器(结合springmvc.xml中的自动扫描开启),可以接收客户端请求。

  • @RequestMapping相关参数

    • value:指定URL请求的实际地址,是@RequestMapping的默认值。
    • method:指定请求的method类型,GET、POST、PUT、DELET
    1
    2
    3
    4
    5
    @RequestMapping(value = "/index",method = RequestMethod.GET)
    public String index() {
    System.out.println("执行了index...");
    return "index";
    }

    上述代码表示index方法只能接收GET请求。


Spring MVC笔记
https://skynetboys.github.io/2020/02/08/Spring-MVC笔记/
Author
Edison
Posted on
February 8, 2020
Licensed under