SpringMVC[万字长文]

文章目录

  • 一、SpringMVC简介
      • 1、什么是MVC
      • 2、什么是SpringMVC
      • 3、SpringMVC的特点
  • 二、HelloWorld
      • 1、开发环境
      • 2、创建maven工程
          • a>添加web模块
          • b>打包方式:war
          • c>引入依赖
      • 3、配置web.xml
          • a>默认配置方式
          • b>扩展配置方式
      • 4、创建请求控制器
      • 5、创建springMVC的配置文件
      • 6、测试HelloWorld
          • a>实现对首页的访问
          • b>通过超链接跳转到指定页面
      • 7、总结
  • 三、@RequestMapping注解
      • 1、@RequestMapping注解的功能
      • 2、@RequestMapping注解的位置
      • 3、@RequestMapping注解的value属性
      • 4、@RequestMapping注解的method属性
      • 5、@RequestMapping注解的params属性(了解)
      • 6、@RequestMapping注解的headers属性(了解)
      • 7、SpringMVC支持ant风格的路径
      • 8、SpringMVC支持路径中的占位符(重点)
  • 四、SpringMVC获取请求参数
      • 1、通过ServletAPI获取
      • 2、通过控制器方法的形参获取请求参数
      • 3、@RequestParam
      • 4、@RequestHeader
      • 5、@CookieValue
      • 6、通过POJO获取请求参数
      • 7、解决获取请求参数的乱码问题
  • 五、域对象共享数据
      • 1、使用ServletAPI向request域对象共享数据
      • 2、使用ModelAndView向request域对象共享数据
      • 3、使用Model向request域对象共享数据
      • 4、使用map向request域对象共享数据
      • 5、使用ModelMap向request域对象共享数据
      • 6、Model、ModelMap、Map的关系
      • 7、向session域共享数据
      • 8、向application域共享数据
  • 六、SpringMVC的视图
      • 1、ThymeleafView
      • 2、转发视图
      • 3、重定向视图
      • 4、视图控制器view-controller
  • 七、RESTful
      • 1、RESTful简介
          • a>资源
          • b>资源的表述
          • c>状态转移
      • 2、RESTful的实现
      • 3、HiddenHttpMethodFilter
  • 八、RESTful案例
      • 1、准备工作
      • 2、功能清单
      • 3、具体功能:访问首页
          • a>配置view-controller
          • b>创建页面
      • 4、具体功能:查询所有员工数据
          • a>控制器方法
          • b>创建employee_list.html
      • 5、具体功能:删除
          • a>创建处理delete请求方式的表单
          • b>删除超链接绑定点击事件
          • c>控制器方法
      • 6、具体功能:跳转到添加数据页面
          • a>配置view-controller
          • b>创建employee_add.html
      • 7、具体功能:执行保存
          • a>控制器方法
      • 8、具体功能:跳转到更新数据页面
          • a>修改超链接
          • b>控制器方法
          • c>创建employee_update.html
      • 9、具体功能:执行更新
          • a>控制器方法
  • 八、HttpMessageConverter
      • 1、@RequestBody
      • 2、RequestEntity
      • 3、@ResponseBody
      • 4、SpringMVC处理json
      • 5、SpringMVC处理ajax
      • 6、@RestController注解
      • 7、ResponseEntity
  • 九、文件上传和下载
      • 1、文件下载
      • 2、文件上传
  • 十、拦截器
      • 1、拦截器的配置
      • 2、拦截器的三个抽象方法
      • 3、多个拦截器的执行顺序
  • 十一、异常处理器
      • 1、基于配置的异常处理
      • 2、基于注解的异常处理
  • 十二、注解配置SpringMVC
      • 1、创建初始化类,代替web.xml
      • 2、创建SpringConfig配置类,代替spring的配置文件
      • 3、创建WebConfig配置类,代替SpringMVC的配置文件
      • 4、测试功能
  • 十三、SpringMVC执行流程
      • 1、SpringMVC常用组件
      • 2、DispatcherServlet初始化过程
          • a>初始化WebApplicationContext
          • b>创建WebApplicationContext
          • c>DispatcherServlet初始化策略
      • 3、DispatcherServlet调用组件处理请求
          • a>processRequest()
          • b>doService()
          • c>doDispatch()
          • d>processDispatchResult()
      • 4、SpringMVC的执行流程

一、SpringMVC简介

1、什么是MVC

MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分

M:Model,模型层,指工程中的JavaBean,作用是处理数据

JavaBean分为两类:

  • 一类称为实体类Bean:专门存储业务数据的,如 Student、User 等
  • 一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。

V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据

C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器

MVC的工作流程:
用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器

2、什么是SpringMVC

SpringMVC是Spring的一个后续产品,是Spring的一个子项目

SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。在表述层框架历经 Strust、WebWork、Strust2 等诸多产品的历代更迭之后,目前业界普遍选择了 SpringMVC 作为 Java EE 项目表述层开发的首选方案

注:三层架构分为表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台servlet

3、SpringMVC的特点

  • Spring 家族原生产品,与 IOC 容器等基础设施无缝对接
  • 基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理
  • 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
  • 代码清新简洁,大幅度提升开发效率
  • 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
  • 性能卓著,尤其适合现代大型、超大型互联网项目要求

二、HelloWorld

1、开发环境

IDE:idea 2019.2

构建工具:maven3.5.4

服务器:tomcat7

Spring版本:5.3.1

2、创建maven工程

a>添加web模块
b>打包方式:war
c>引入依赖
<dependencies>
    
    <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-webmvcartifactId>
        <version>5.3.1version>
    dependency>

    
    <dependency>
        <groupId>ch.qos.logbackgroupId>
        <artifactId>logback-classicartifactId>
        <version>1.2.3version>
    dependency>

    
    <dependency>
        <groupId>javax.servletgroupId>
        <artifactId>javax.servlet-apiartifactId>
        <version>3.1.0version>
        <scope>providedscope>
    dependency>

    
    <dependency>
        <groupId>org.thymeleafgroupId>
        <artifactId>thymeleaf-spring5artifactId>
        <version>3.0.12.RELEASEversion>
    dependency>
dependencies>

注:由于 Maven 的传递性,我们不必将所有需要的包全部配置依赖,而是配置最顶端的依赖,其他靠传递性导入。

SpringMVC[万字长文]_第1张图片

3、配置web.xml

注册SpringMVC的前端控制器DispatcherServlet

a>默认配置方式

此配置作用下,SpringMVC的配置文件默认位于WEB-INF下,默认名称为-servlet.xml,例如,以下配置所对应SpringMVC的配置文件位于WEB-INF下,文件名为springMVC-servlet.xml


<servlet>
    <servlet-name>springMVCservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
servlet>
<servlet-mapping>
    <servlet-name>springMVCservlet-name>
    
    <url-pattern>/url-pattern>
servlet-mapping>
b>扩展配置方式

可通过init-param标签设置SpringMVC配置文件的位置和名称,通过load-on-startup标签设置SpringMVC前端控制器DispatcherServlet的初始化时间


<servlet>
    <servlet-name>springMVCservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    
    <init-param>
        
        <param-name>contextConfigLocationparam-name>
        
        <param-value>classpath:springMVC.xmlparam-value>
    init-param>
    
    <load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
    <servlet-name>springMVCservlet-name>
    
    <url-pattern>/url-pattern>
servlet-mapping>

注:

标签中使用/和/*的区别:

/所匹配的请求可以是/login或.html或.js或.css方式的请求路径,但是/不能匹配.jsp请求路径的请求

因此就可以避免在访问jsp页面时,该请求被DispatcherServlet处理,从而找不到相应的页面

/*则能够匹配所有请求,例如在使用过滤器时,若需要对所有请求进行过滤,就需要使用/*的写法

4、创建请求控制器

由于前端控制器对浏览器发送的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要创建处理具体请求的类,即请求控制器

请求控制器中每一个处理请求的方法成为控制器方法

因为SpringMVC的控制器由一个POJO(普通的Java类)担任,因此需要通过@Controller注解将其标识为一个控制层组件,交给Spring的IoC容器管理,此时SpringMVC才能够识别控制器的存在

@Controller
public class HelloController {
   
    
}

5、创建springMVC的配置文件


<context:component-scan base-package="com.atguigu.mvc.controller"/>


<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
    <property name="order" value="1"/>
    <property name="characterEncoding" value="UTF-8"/>
    <property name="templateEngine">
        <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
            <property name="templateResolver">
                <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
    
                    
                    <property name="prefix" value="/WEB-INF/templates/"/>
    
                    
                    <property name="suffix" value=".html"/>
                    <property name="templateMode" value="HTML5"/>
                    <property name="characterEncoding" value="UTF-8" />
                bean>
            property>
        bean>
    property>
bean>


<mvc:default-servlet-handler/>


<mvc:annotation-driven>
    <mvc:message-converters>
        
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="defaultCharset" value="UTF-8" />
            <property name="supportedMediaTypes">
                <list>
                    <value>text/htmlvalue>
                    <value>application/jsonvalue>
                list>
            property>
        bean>
    mvc:message-converters>
mvc:annotation-driven>

6、测试HelloWorld

a>实现对首页的访问

在请求控制器中创建处理请求的方法

// @RequestMapping注解:处理请求和控制器方法之间的映射关系
// @RequestMapping注解的value属性可以通过请求地址匹配请求,/表示的当前工程的上下文路径
// localhost:8080/springMVC/
@RequestMapping("/")
public String index() {
   
    //设置视图名称
    return "index";
}
b>通过超链接跳转到指定页面

在主页index.html中设置超链接

DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页title>
head>
<body>
    <h1>首页h1>
    <a th:href="@{/hello}">HelloWorlda><br/>
body>
html>

在请求控制器中创建处理请求的方法

@RequestMapping("/hello")
public String HelloWorld() {
   
    return "target";
}

7、总结

浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被前端控制器DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视图所对应页面

三、@RequestMapping注解

1、@RequestMapping注解的功能

从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。

SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。

2、@RequestMapping注解的位置

@RequestMapping标识一个类:设置映射请求的请求路径的初始信息

@RequestMapping标识一个方法:设置映射请求请求路径的具体信息

@Controller
@RequestMapping("/test")
public class RequestMappingController {
   

	//此时请求映射所映射的请求的请求路径为:/test/testRequestMapping
    @RequestMapping("/testRequestMapping")
    public String testRequestMapping(){
   
        return "success";
    }

}

3、@RequestMapping注解的value属性

@RequestMapping注解的value属性通过请求的请求地址匹配请求映射

@RequestMapping注解的value属性是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址所对应的请求

@RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射

<a th:href="@{/testRequestMapping}">测试@RequestMapping的value属性-->/testRequestMappinga><br>
<a th:href="@{/test}">测试@RequestMapping的value属性-->/testa><br>
@RequestMapping(
        value = {
   "/testRequestMapping", "/test"}
)
public String testRequestMapping(){
   
    return "success";
}

4、@RequestMapping注解的method属性

@RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射

@RequestMapping注解的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求

若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,则浏览器报错405:Request method ‘POST’ not supported

<a th:href="@{/test}">测试@RequestMapping的value属性-->/testa><br>
<form th:action="@{/test}" method="post">
    <input type="submit">
form>
@RequestMapping(
        value = {
   "/testRequestMapping", "/test"},
        method = {
   RequestMethod.GET, RequestMethod.POST}
)
public String testRequestMapping(){
   
    return "success";
}

注:

1、对于处理指定请求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解

处理get请求的映射–>@GetMapping

处理post请求的映射–>@PostMapping

处理put请求的映射–>@PutMapping

处理delete请求的映射–>@DeleteMapping

2、常用的请求方式有get,post,put,delete

但是目前浏览器只支持get和post,若在form表单提交时,为method设置了其他请求方式的字符串(put或delete),则按照默认的请求方式get处理

若要发送put和delete请求,则需要通过spring提供的过滤器HiddenHttpMethodFilter,在RESTful部分会讲到

5、@RequestMapping注解的params属性(了解)

@RequestMapping注解的params属性通过请求的请求参数匹配请求映射

@RequestMapping注解的params属性是一个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系

“param”:要求请求映射所匹配的请求必须携带param请求参数

“!param”:要求请求映射所匹配的请求必须不能携带param请求参数

“param=value”:要求请求映射所匹配的请求必须携带param请求参数且param=value

“param!=value”:要求请求映射所匹配的请求必须携带param请求参数但是param!=value

<a th:href="@{/test(username='admin',password=123456)">测试@RequestMapping的params属性-->/testa><br>
@RequestMapping(
        value = {
   "/testRequestMapping", "/test"}
        ,method = {
   RequestMethod.GET, RequestMethod.POST}
        ,params = {
   "username","password!=123456"}
)
public String testRequestMapping(){
   
    return "success";
}

注:

若当前请求满足@RequestMapping注解的value和method属性,但是不满足params属性,此时页面回报错400:Parameter conditions “username, password!=123456” not met for actual request parameters: username={admin}, password={123456}

6、@RequestMapping注解的headers属性(了解)

@RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射

@RequestMapping注解的headers属性是一个字符串类型的数组,可以通过四种表达式设置请求头信息和请求映射的匹配关系

“header”:要求请求映射所匹配的请求必须携带header请求头信息

“!header”:要求请求映射所匹配的请求必须不能携带header请求头信息

“header=value”:要求请求映射所匹配的请求必须携带header请求头信息且header=value

“header!=value”:要求请求映射所匹配的请求必须携带header请求头信息且header!=value

若当前请求满足@RequestMapping注解的value和method属性,但是不满足headers属性,此时页面显示404错误,即资源未找到

7、SpringMVC支持ant风格的路径

?:表示任意的单个字符

*:表示任意的0个或多个字符

**:表示任意的一层或多层目录

注意:在使用**时,只能使用/**/xxx的方式

8、SpringMVC支持路径中的占位符(重点)

原始方式:/deleteUser?id=1

rest方式:/deleteUser/1

SpringMVC路径中的占位符常用于RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参

<a th:href="@{/testRest/1/admin}">测试路径中的占位符-->/testResta><br>
@RequestMapping("/testRest/{id}/{username}")
public String testRest(@PathVariable("id") String id, @PathVariable

你可能感兴趣的:(SpringMvc,java,ssm,springmvc,spring,boot)