springMVC最全笔记,一篇就够

本文详细介绍了SpringMVC的各个方面,包括概念、入门案例、@RequestMapping注解的使用、处理请求参数、数据共享、视图解析、RESTful实践、Ajax请求处理、文件上传下载、拦截器、异常处理、注解配置以及执行流程。内容涵盖了SpringMVC的基础知识和高级特性,是学习SpringMVC的全面指南。
摘要由CSDN通过智能技术生成

三、SpringMVC

目录

三、SpringMVC

1、SpringMVC简介

1.1、什么是MVC

1.2、什么是SpringMVC

1.3、SpringMVC的特点

2、入门案例

2.1、开发环境

2.2、创建maven工程

①添加web模块

②打包方式:war

③引入依赖

2.3、配置web.xml

①默认配置方式

②扩展配置方式

2.4、创建请求控制器

2.5、创建SpringMVC的配置文件

2.6、测试HelloWorld

①实现对首页的访问

②通过超链接跳转到指定页面

2.7、★总结

2.8、springMVC工作流程:

3、@RequestMapping注解

3.1、@RequestMapping注解的功能

3.2、@RequestMapping注解的位置

3.4、@RequestMapping注解的method属性

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

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

3.7、SpringMVC支持ant风格的路径

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

4、SpringMVC获取请求参数

4.1、通过ServletAPI获取

4.2、通过控制器方法的形参获取请求参数

4.3、@RequestParam

4.4、@RequestHeader

4.5、@CookieValue

4.6、通过POJO获取请求参数

4.7、解决获取请求参数的乱码问题

5、域对象共享数据

5.1、使用ServletAPI向request域对象共享数据

5.2、使用ModelAndView向request域对象共享数据

5.3、使用Model向request域对象共享数据

5.4、使用map向request域对象共享数据

5.6、Model、ModelMap、Map的关系

5.7、向session域共享数据

5.8、向application域共享数据

6、SpringMVC的视图

6.1、ThymeleafView

6.2、转发视图

6.3、重定向视图

6.4、视图控制器view-controller

7、RESTful

7.1、RESTful简介

①资源

②资源的表述

③状态转移

7.2、RESTful的实现

7.3、HiddenHttpMethodFilter

8、RESTful案例

8.1、准备工作

8.2、功能清单

8.3、具体功能:访问首页

①配置view-controller

②创建页面

8.4、具体功能:查询所有员工数据

①控制器方法

②创建employee_list.html

8.5、具体功能:删除

①创建处理delete请求方式的表单

③控制器方法

8.6、具体功能:跳转到添加数据页面

①配置view-controller

②创建employee_add.html

8.7、具体功能:执行保存

①控制器方法

8.8、具体功能:跳转到更新数据页面

①修改超链接

②控制器方法

③创建employee_update.html

8.9、具体功能:执行更新

①控制器方法

9、SpringMVC处理ajax请求

9.1、@RequestBody

9.2、@RequestBody获取json格式的请求参数

9.3、@ResponseBody

9.4、@ResponseBody响应浏览器json数据

9.5、@RestController注解

10、文件上传和下载

10.1、文件下载

10.2、文件上传

①添加依赖:

②在SpringMVC的配置文件中添加配置:

③控制器方法:

11、拦截器

11.0、拦截器和过滤器的区别:

11.1、拦截器的配置

11.2、拦截器的三个抽象方法

11.3、多个拦截器的执行顺序

12、异常处理器

12.1、基于配置的异常处理

12.2、基于注解的异常处理

13、注解配置SpringMVC

13.1、创建初始化类,代替web.xml

13.2、创建SpringConfig配置类,代替spring的配置文件

13.3、创建WebConfig配置类,代替SpringMVC的配置文件

13.4、测试功能

14、SpringMVC执行流程

14.1、SpringMVC常用组件

14.2、DispatcherServlet初始化过程

①初始化WebApplicationContext

②创建WebApplicationContext

③DispatcherServlet初始化策略

14.3、DispatcherServlet调用组件处理请求

①processRequest()

②doService()

③doDispatch()

④processDispatchResult()

14.4、SpringMVC的执行流程

四、SSM整合

4.2、准备工作

①创建Maven Module

②导入依赖

③创建表

4.3、配置web.xml

4.4、创建SpringMVC的配置文件并配置

4.5、搭建MyBatis环境

①创建属性文件jdbc.properties

②创建MyBatis的核心配置文件mybatis-config.xml

③创建Mapper接口和映射文件

④创建日志文件log4j.xml

4.6、创建Spring的配置文件并配置

4.7、测试功能

①创建组件

②创建student_list页面

③创建index页面访问分页功能


1、SpringMVC简介

1.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视图,渲染数据后最终响应给浏览器

1.2、什么是SpringMVC

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

底层是servlet,springMVC封装了servlet

SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。在表述层框架历经 Strust、

WebWork、Strust2 等诸多产品的历代更迭之后,目前业界普遍选择了 SpringMVC 作为 Java EE 项目

表述层开发的首选方案

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

servlet

1.3、SpringMVC的特点

  • Spring 家族原生产品,与 IOC 容器等基础设施无缝对接

  • 基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理

  • 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案

  • 代码清新简洁,大幅度提升开发效率

  • 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可

  • 性能卓著,尤其适合现代大型、超大型互联网项目要求

2、入门案例

2.1、开发环境

IDE:idea 2019.2

构建工具:maven3.5.4

服务器:tomcat8.5

Spring版本:5.3.1

2.2、创建maven工程

①添加web模块

②打包方式:war

③引入依赖

<!-- 打包方式:war -->
<packaging>war</packaging>
<dependencies>
    <!-- SpringMVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.1</version>
    </dependency>
    <!-- 日志 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    <!-- ServletAPI -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <!-- Spring5和Thymeleaf整合包 -->
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring5</artifactId>
        <version>3.0.12.RELEASE</version>
    </dependency>
</dependencies>

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

传递性导入。

2.3、配置web.xml

注册SpringMVC的前端控制器DispatcherServlet

①默认配置方式

此配置作用下,SpringMVC的配置文件默认位于WEB-INF下,默认名称为<servlet-name>-

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

servlet.xml

<!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理
	SpringMVVC的配置文件默认的位置和名称:
          位置:WEB-INF下
          名称:<servlet-name>-servlet.xml,当前配置下的配置文件名为springMVC-servlet.xml
     utl-pattern中/和/*的区别
          /:匹配浏览器向服务器发送的所有请求(不包括.jsp)
          /*:匹配浏览器向服务器发送的所有请求(包括.jsp) 
-->
<servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servletclass>
</servlet>
<servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <!--
        设置springMVC的核心控制器所能处理的请求的请求路径
        /所匹配的请求可以是/login或.html或.js或.css方式的请求路径
        但是/不能匹配.jsp请求路径的请求
	-->
    <url-pattern>/</url-pattern>
</servlet-mapping>

②扩展配置方式

可通过init-param标签设置SpringMVC配置文件的位置和名称,通过load-on-startup标签设置

SpringMVC前端控制器DispatcherServlet的初始化时间

<!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 -->
<servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servletclass>
    <!-- 通过初始化参数指定SpringMVC配置文件的位置和名称 -->
    <init-param>
        <!-- contextConfigLocation为固定值 -->
        <param-name>contextConfigLocation</param-name>
        <!-- 使用classpath:表示从类路径查找配置文件,例如maven工程中的src/main/resources -->
        <param-value>classpath:springMVC.xml</param-value>
    </init-param>
    <!--
        作为框架的核心组件,在启动过程中有大量的初始化操作要做
        而这些操作放在第一次请求时才执行会严重影响访问速度
        因此需要通过此标签将启动控制DispatcherServlet的初始化时间提前到服务器启动时
	-->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <!--
        设置springMVC的核心控制器所能处理的请求的请求路径
        /所匹配的请求可以是/login或.html或.js或.css方式的请求路径
        但是/不能匹配.jsp请求路径的请求
    -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

注:

<url-pattern>标签中使用/和/*的区别:

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

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

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

2.4、创建请求控制器

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

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

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

@Controller
public class HelloController {
}

2.5、创建SpringMVC的配置文件

<!-- 自动扫描包 -->
<context:component-scan base-package="com.atguigu.mvc.controller"/>
<!-- 配置Thymeleaf视图解析器 -->
<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>
<!--
    处理静态资源,例如html、js、css、jpg
    若只设置该标签,则只能访问静态资源,其他请求则无法访问
    此时必须设置<mvc:annotation-driven/>解决问题
-->
<mvc:default-servlet-handler/>
<!-- 开启mvc注解驱动 -->
<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/html</value>
                    <value>application/json</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

2.6、测试HelloWorld

①实现对首页的访问

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

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

②通过超链接跳转到指定页面

在主页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}">HelloWorld</a><br/>
    </body>
</html>

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

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

2.7、★总结

浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被前端控制器DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,

将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视图所对应页面

2.8、springMVC工作流程:

自己总结:

1、 用户向服务器发送请求,请求被SpringMVC 前端控制器 DispatcherServlet捕获

2、DispatcherServlet 将用户请求发送给处理器映射器 (HandlerMapping)

3、HandlerMapping(处理器映射)会对请求地址和Handler(控制器方法)的注解(@ResquestMapping)进行匹配

4、如果匹配成功,DispatcherServlet 根据获得的Handler(控制器方法),使用HandlerAdapter调用执行该控制器方法

5、 如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(…)方法【正向】(执行方法前执行)

6、Handler(控制器方法)执行完成后,向DispatcherServlet 返回一个ModelAndView对象。

7、 此时将开始执行拦截器的postHandle(...)方法【逆向】(执行完方法之后执行)

8、 a. 根据返回的ModelAndView(此时会判断是否存在异常:

b. 如果存在异常,则执行HandlerExceptionResolver进行异常处理,进入该异常的视图渲染,

c. 如果没有异常会按正常的返回值渲染视图)

c)选择一个适合的ViewResolver进行视图解析,根据Model和View,来渲染视图。

9、 渲染视图完毕执行拦截器的afterCompletion(…)方法【逆向】。

10、 将渲染结果返回给客户端。

以下是网上概述(最下面还有尚硅谷总结):

\1. 用户通过浏览器发起 HttpRequest 请求到前端控制器 (DispatcherServlet)。

\2. DispatcherServlet 将用户请求发送给处理器映射器 (HandlerMapping)。

\3. 处理器映射器 (HandlerMapping)会根据请求,找到负责处理该请求的处理器,并将其封装为处理器执行链 返回 (HandlerExecutionChain) 给 DispatcherServlet

\4. DispatcherServlet 会根据 处理器执行链 中的处理器,找到能够执行该处理器的处理器适配器(HandlerAdaptor) --注,处理器适配器有多个

\5. 处理器适配器 (HandlerAdaptoer) 会调用对应的具体的 Controller

\6. Controller 将处理结果及要跳转的视图封装到一个对象 ModelAndView 中并将其返回给处理器适配器 (HandlerAdaptor)

\7. HandlerAdaptor 直接将 ModelAndView 交给 DispatcherServlet ,至此,业务处理完毕

\8. 业务处理完毕后,我们需要将处理结果展示给用户。于是DisptcherServlet 调用 ViewResolver,将 ModelAndView 中的视图名称封装为视图对象

\9. ViewResolver 将封装好的视图 (View) 对象返回给 DIspatcherServlet

\10. DispatcherServlet 调用视图对象,让其自己 (View) 进行渲染(将模型数据填充至视图中),形成响应对象 (HttpResponse) 

\11. 前端控制器 (DispatcherServlet) 响应 (HttpResponse) 给浏览器,展示在页面上。

3、@RequestMapping注解

*1、@RequestMapping注解的位置
* @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
* @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
*
* 2、@RequestMapping注解value属性
* 作用:通过请求的请求路径匹配请求映射
* value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
* 则当前请求就会被注解所标识的方法进行处理
*
* 3、@RequestMapping注解method属性
* 作用:通过请求的请求方式(get/post)匹配请求映射
* method属性是RequestMethod类型数组,即当前浏览器所发送请求的请求方式匹配method属性中的任何一个值
* 则当前请求就会被注解所标识的方法进行处理
* 若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,则浏览器报错
405:Request method 'POST' not supported
* SpringMVC中提供了@RequestMapping的派生注解:
    处理get请求的映射-->@GetMapping
    处理post请求的映射-->@PostMapping
    处理put请求的映射-->@PutMapping
    处理delete请求的映射-->@DeleteMapping

* 4、@RequestMapping注解params属性
* 作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性到的设置
* params可以使用四种表达式:
     "param":要求请求映射所匹配的请求必须携带param请求参数
    "!param":要求请求映射所匹配的请求必须不能携带param请求参数
    "param=value":要求请求映射所匹配的请求必须携带param请求参数且param=value
    "param!=value":要求请求映射所匹配的请求必须携带param请求参数但是param!=value
    * 注:
    若当前请求满足@RequestMapping注解的value和method属性,但是不满足params属性,此时
    页面回报错400:Parameter conditions "username, password!=123456" not met for actual
    request parameters: username={admin}, password={123456}

* 5、@RequestMapping注解headers属性
* 作用:通过请求头信息匹配请求,即浏览器发送的请求的请求头信息必须满足headers属性到的设置
* 若当前请求满足@RequestMapping注解的value和method属性,但是不满足headers属性,此时页面显示404错误,即资源未找到
*
* 6、@RequestMapping注解支持ant风格的路径
* 在@RequestMapping注解value属性值中设置一些特殊字符
* ?:任何单个字符(不包含?)/a?b/
* *:任意个数的任意字符(不包含?和/)/a*b/
* **:任意层数的任意目录,注意使用方式只能把**写在双斜线中间,前后不能有任何的其他字符(斜线**斜线)
*
* 7、@RequestMapping注解使用路径中的占位符
* 原始方式:/deleteUser?id=1
* rest方式:/user/delete/1
* 需要在@RequestMapping注解的value属性中所设置的路径中,使用/user/delete/{xxx}的方式表示路径中的数据
* 在通过@PathVariable注解,将占位符所标识的值和控制器方法的形参进行绑定

3.1、@RequestMapping注解的功能

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

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

3.2、@RequestMapping注解的位置

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

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

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

3.3、@RequestMapping注解的value属性

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

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

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

* 作用:通过请求的请求路径匹配请求映射
* value属性是数组类型,即当前浏览器所发送请求的请求路径匹配value属性中的任何一个值
* 则当前请求就会被注解所标识的方法进行处理
<a th:href="@{/testRequestMapping}">测试@RequestMapping的value属性--
>/testRequestMapping</a><br>
<a th:href="@{/test}">测试@RequestMapping的value属性-->/test</a><br>
@RequestMapping(
    value = {"/testRequestMapping", "/test"}
)
public String testRequestMapping(){
    return "success";
}

3.4、@RequestMapping注解的method属性

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

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

若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,则浏览器报错

405:Request method 'POST' not supported

<a th:href="@{/test}">测试@RequestMapping的value属性-->/test</a><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部分会讲到

3.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属性-->/test</a><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}

3.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错误,即资源未找到

3.7、SpringMVC支持ant风格的路径

* 在@RequestMapping注解value属性值中设置一些特殊字符
* ?:任何单个字符(不包含?)/a?b/
* *:任意个数的任意字符(不包含?和/)/a*b/
* **:任意层数的任意目录,注意使用方式只能把**写在双斜线中间,前后不能有任何的其他字符(/**/)
        <a th:href="@{/test/aaa/test/an???t}">测试@RequestMapping支持ant风格的路径-->/abc</a><br>
		@RequestMapping("/a?a/t*t/**")
		public String testAnt(){
   			 return "surccess";
		}		

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

原始方式:/deleteUser?id=1

rest方式:/user/delete/1

SpringMVC路径中的占位符常用于RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服

务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,在

通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参

@RequestMapping注解使用路径中的占位符
* 原始方式:/deleteUser?id=1
* rest方式:/user/delete/1
* 需要在@RequestMapping注解的value属性中所设置的路径中,使用/user/delete/{xxx}的方式表示路径中的数据
* 在通过@PathVariable注解,将占位符所标识的值和控制器方法的形参进行绑定
<a th:href="@{/testRest/1/admin}">测试路径中的占位符-->/testRest</a><br>
@RequestMapping("/testRest/{id}/{username}")
public String testRest(@PathVariable("id") String id, @PathVariable("username")
String username){
    System.out.println("id:"+id+",username:"+username);
    return "success";
}
//最终输出的内容为-->id:1,username:admin

4、SpringMVC获取请求参数

4.1、通过ServletAPI获取

将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象

获取请求参数的方式:
* 1、通过servletAPI获取
* 只需要在控制器方法的形参位置设置httpServletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数
<form th:action="@{/param/servletAPI}" method="post">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    <input type="submit" value="提交">
</form>
@RequestMapping("/param/servletAPI")
public String testParam(HttpServletRequest request){
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println("username:"+username+",password:"+password);
    return "success";
}

4.2、通过控制器方法的形参获取请求参数

在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在

DispatcherServlet中就会将请求参数赋值给相应的形参

只需要在控制器方法的形参位置,设置一个形参,形参的的名字和请求参数的名字一致即可
<form th:action="@{/param}" method="post">
        用户名:<input type="text" name="userName">
        密码:<input type="password" name="password">
        <input type="submit" value="提交">
    </form><a th:href="@{/testParam(username='admin',password=123456)}">测试获取请求参数--
>/testParam</a><br>
@RequestMapping("/testParam")
public String testParam(String username, String password){
    System.out.println("username:"+username+",password:"+password);
    return "success";
}

注:

若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串

数组或者字符串类型的形参接收此请求参数

若使用字符串数组类型的形参,此参数的数组中包含了每一个数据

若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果

4.3、@RequestParam

//通过springmvc获取通过控制器方法的形参获取
    @RequestMapping("/param")
    public String getParam(@RequestParam(value = "userName",required = true,defaultValue = "hello") String username, String password){
        System.out.println("username:"+username+" password:"+password);
        return "surccess";
    }

@RequestParam是将请求参数和控制器方法的形参创建映射关系

@RequestParam注解一共有三个属性:

value:指定形参参数与的请求参数的参数名进行绑定

required:设置是否必须传输此请求参数,默认值为true

若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置

defaultValue属性,则页面报错400:Required String parameter 'xxx' is not present;若设置为

false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为

null

defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值

为""时,则使用默认值为形参赋值

4.4、@RequestHeader

@RequestMapping("/param3")
public String getParam3(@RequestParam(value = "userName",required = true,defaultValue = "hello")
                                    String username, String password,
                                    @RequestHeader("referer") String referer,
                                    @CookieValue("JSESSIONID")  String jsSessionId
){
    System.out.println("referer:"+referer);
    System.out.println("jsSessionId:"+jsSessionId);
    System.out.println("username:"+username+" password:"+password);
    return "surccess";
}
@RequestHeader("referer") String referer,

@RequestHeader是将请求头信息和控制器方法的形参创建映射关系

@RequestHeader注解一共有三个属性:value、required、defaultValue,用法同@RequestParam

4.5、@CookieValue

先浏览这个路径创建会话域
public String getParamByServletAPI(HttpServletRequest request){
    HttpSession session = request.getSession();}
@CookieValue("JSESSIONID")  String jsSessionId

@CookieValue是将cookie数据和控制器方法的形参创建映射关系

@CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam

4.6、通过POJO获取请求参数

可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值,可以通过实体类类型的形参获取请求参数

public class User {
    private Integer id;
    private String username;
    private String password;
}|
<form th:action="@{/param4/pojo}" method="post">
        用户名:<input type="text" name="username">
        密码:<input type="password" name="password">
        <input type="submit" value="提交">
    </form>
 @RequestMapping("/param4/pojo")
    public String getParam4ByPojo(User user){
        System.out.println(user);
        return "surccess";
    }
//最终结果-->User{id=null, username='张三', password='123'}

4.7、解决获取请求参数的乱码问题

解决获取请求参数的乱码问题,可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter,但是必须在web.xml中进行注册

<!--配置springMVC的编码过滤器-->
<filter>
    <filter-name>CharacterEncodingFilter</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>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

注:

SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效

5、域对象共享数据

5.1、使用ServletAPI向request域对象共享数据

@RequestMapping("/testServletAPI")
public String testServletAPI(HttpServletRequest request){
    request.setAttribute("testScope", "hello,servletAPI");
    return "success";
}

5.2、使用ModelAndView向request域对象共享数据

1、通过ModelAndView向请求域共享数据
* 使用ModelAndView时,可以使用其Model功能向请求域共享数据
* 使用view功能设置逻辑视图,但是控制器方法一定要将ModelAndVie作为方法的返回值
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
    /**
     * ModelAndView有Model和View的功能
     * Model主要用于向请求域共享数据
     * View主要用于设置视图,实现页面跳转
     */
    ModelAndView mav = new ModelAndView();
    //向请求域共享数据
    mav.addObject("testScope", "hello,ModelAndView");
    //设置视图,实现页面跳转
    mav.setViewName("success");
    return mav;
}

5.3、使用Model向request域对象共享数据

@RequestMapping("/testModel")
public String testModel(Model model){
    model.addAttribute("testScope", "hello,Model");
    return "success";
}

5.4、使用map向request域对象共享数据

@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
    map.put("testScope", "hello,Map");
    return "success";
}

5.5、使用ModelMap向request域对象共享数据

@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
    modelMap.addAttribute("testScope", "hello,ModelMap");
    return "success";
}

5.6、Model、ModelMap、Map的关系

Model、ModelMap、Map类型的参数其实本质上都是 BindingAwareModelMap 类型创建的

public interface Model{}
public class ModelMap extends LinkedHashMap<String, Object> {}
public class ExtendedModelMap extends ModelMap implements Model {}
public class BindingAwareModelMap extends ExtendedModelMap {}

5.7、向session域共享数据

@RequestMapping("/testSession")
public String testSession(HttpSession session){
    session.setAttribute("testSessionScope", "hello,session");
    return "success";
}

5.8、向application域共享数据

@RequestMapping("/testApplication")
public String testApplication(HttpSession session){
    ServletContext application = session.getServletContext();
    application.setAttribute("testApplicationScope", "hello,application");
    return "success";
}

6、SpringMVC的视图

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC是一个基于Java的Web应用框架,用于构建企业级Java Web应用程序。它是Spring框架的一部分,提供了一种模型-视图-控制器(Model-View-Controller,MVC)架构,并且可以与其他Spring项目(如Spring Boot)无缝集成。 以下是一些关键概念和要点,可以帮助你进行Spring MVC开发笔记的整理: 1. DispatcherServlet: Spring MVC的核心组件,负责接收并分发客户端请求,将请求发送给相应的控制器进行处理。 2. 控制器(Controller): 控制器负责处理用户请求,并返回相应的模型和视图。通过使用注解或实现特定接口来定义控制器类。 3. 模型(Model): 模型代表应用程序中的数据结构,通常是通过POJO(Plain Old Java Objects)表示。控制器可以使用模型来存储、检索和操作数据。 4. 视图(View): 视图负责渲染模型的数据,并将其呈现给用户。可以是JSP页面、Thymeleaf模板、HTML文件等等。 5. 请求映射(Request Mapping): 通过使用@RequestMapping注解,可以将URL请求映射到相应的控制器方法中。 6. 数据绑定(Data Binding): Spring MVC提供了数据绑定功能,可以将请求参数自动绑定到控制器方法的参数中,简化了参数处理的过程。 7. 视图解析器(View Resolver): 视图解析器用于将控制器返回的逻辑视图名称解析为实际的视图。可以配置多个视图解析器,以支持不同类型的视图解析。 8. 拦截器(Interceptor): 拦截器可以在请求处理的各个阶段进行拦截,并执行相应的操作,例如身份验证、日志记录等。 9. 表单处理(Form Handling): Spring MVC提供了一组表单标签和表单处理功能,用于简化表单的验证和数据绑定过程。 10. 文件上传(File Upload): Spring MVC提供了对文件上传的支持,可以轻松地处理文件上传的操作。 这些是Spring MVC的一些基本概念和要点,希望对你整理笔记有所帮助。如果有更具体的问题或需求,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值