前言
继续学习SpringMVC视频教程,争取今明后三天把设定的目标完成
SpringMVC 框架搭建
这一步花了我一上午时间,报了个404错误,没办法,只能从头开始创建项目(心态差点整爆炸,第一次是自认不懂,结果是好的,第二次自认懂点,结果爆炸)
求学要保持虚心求教的态度,不可好高骛远
第一步 创建项目
第二步 pom.xml文件配置
修改打包方式==>war
引入相关依赖
完整源码如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.atguigu.mvc</groupId><artifactId>springMVC-demo1</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><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></project>
第三步 web.xml文件配置
在src/main
目录下创建webapp,要注意是否有蓝点
SpringMVC核心配置文件默认的位置在WEB-INF下,有默认的名称为servlet-name标签的值-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_4_0.xsd"version="4.0"><!-- 注册前端控制器DispatcherServlet --><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><!-- 将前端控制器初始化时间提前到服务器启动时 --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>
第四步 SpringMVC核心配置文件配置
浏览器通过视图(html文件)向服务器发送请求,若请求路径与注解@RequestMapping的value值相符,则其注解的方法为处理请求的方法,处理完后返回String型字符串即视图名称
<?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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" ><!-- 自动扫描包 --><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></beans>
第五步 测试是否搭建成功
注意事项
以下三点务必重点关注:
导入依赖
web.xml配置
核心文件配置
我出错在核心配置文件/WEB-INF/templates/
路径错误,应该还有别的错,总之新手要谦虚谨慎
@RequestMapping注解
@RequestMapping注解的功能
从注解名称上可以看到,@RequestMapping注解的作用是将请求和处理请求的控制器方法关联起来,建立映射关系
SpringMVC接受到指定的请求,就会来找在映射关系中对应的控制器方法来处理这个请求
注意:必须保证RequestMapping处理的请求地址是唯一的
@RequestMapping注解的位置
@RequestMapping表示一个类:设置映射请求的请求路径的初始信息
@RequestMapping标识一个方法:设置映射请求的请求路径的具体信息
package com.atguigu.mvc.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/test")
public class RequestMappingController {//此时请求映射所映射的请求的请求路径为:/test/testRequestMapping@RequestMapping("/testRequestMapping")public String success(){return "success";}
}
thymeleaf会自动为@{}
大括号配置上下文路径
浏览器解析的/
为绝对路径,也就是http://localhost:8080/
实用场景
因为RequestMapping中的value值不能一样,不然请求路径相同,处理的方法会发生冲突
解决就是更改请求路径,这时候RequestMapping中的value值相同也无妨
比如有用户模块和订单模块,两者都有列表,请求都为绝对路径加list
参数
那么就会发生冲突
图解
user ====> list
order ====> list
解决之道
user ===> /user/list
order ===> /order/list
通过@RequestMapping标识类来为请求添加一层目录从而区分不同业务
@RequestMapping标识类通常在不同模块的控制器来处理相同的@RequestMapping的value属性值所标识的方法
@RequestMapping中的value属性
@RequestMapping注解的value属性通过请求的请求地址匹配请求映射
@RequestMapping注解的value属性是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址 多对应的请求
@RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射
@RequestMapping的method属性
@RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射
@RequestMapping注解的method属性是一个RequestMapping类型的数组,表示该请求映射能够匹配多种请求方式的请求
若当前请求的请求地址满足请求映射的value属性,但请求方式不满足method属性,则浏览器报405错误Request method 'POST' not supported
get请求一般是用来获取数据(也可以用来提交数据,但通常用于获取数据)
post请求一般是用来提交数据
原因get会把请求参数放在url(请求路径)中,隐私性、安全性较差,且请求数据长度有限制,但传输速度快
post请求没有长度限制,请求数据放在请求体中
当不设置method属性值时,不以请求方式为条件来匹配请求映射
当设置mehod属性值为RequestMethod=GET
时,请求方式不匹配,报405错误
当把method属性值设为RequestMethod.GET,RequestMethod.POST
后匹配POST请求
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部分会讲到
@RequestMapping的params属性
@RequestMapping注解的params属性通过请求的请求参数匹配请求映射
@RequestMapping注解的params属性是一个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系
-
- “param”:要求请求映射所匹配的请求
必须携带param请求参数
- “!param”:要求请求映射所匹配的请求
必须不能携带param请求参数
- “param=value”:要求请求映射所匹配的请求必须携带param请求参数且参数值为value
- “param!=value”:要求请求映射所匹配的请求必须携带param请求参数且参数值不能为value
-
示例如下
@RequestMapping的headers属性
-
- @RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射
@RequestMapping注解的headers属性是一个字符串类型的数组,可以通过四种表达式设置请求头信息和请求映射的匹配关系
“header”:要求请求映射所匹配的请求必须携带header请求头信息
“!header”:要求请求映射所匹配的请求必须不能携带header请求头信息
“header=value”:要求请求映射所匹配的请求必须携带header请求头信息且值为value
“header!=value”:要求请求映射所匹配的请求必须携带header请求头信息且值不为value - 若当前请求满足@RequestMapping注解的value和method属性,但不满足headers属性,此时页面显示404错误,即资源未找到
-
示例
小结
- 请求后页面响应报400错误,重点看 请求中的请求参数
- 请求后页面响应报404错误,重点看 请求中的请求头和请求路径
- 请求后页面响应报405错误,重点看 发送请求的方式
Ant风格的路径
Spring MVC支持Ant风格的URL路径映射,所谓Ant风格其实就是一种通配符风格,可以在处理器映射路径中使用通配符对访问的URL路径进行关联
?
:表示任意的单个字符
/
在URL中代表路径分隔符,?
代表参数拼接符,说是代表任意单个,首先是单个,然后任意加上引号
*
:表示任意的0个或多个字符
**
:表示任意的一层或多层目录
注意: 在使用时,只能使用 /**/xxx的方式
SpringMVC支持路径中的占位符(重点)
除了支持Ant风格的URL路径映射外,Spring MVC还支持RESTful风格的路径映射
原始方式:/deleteUser?id=1
rest方式:/deleteUser/1
SpringMVC路径中的占位符常用于restful风格中,在请求路径中将某些数据通过路径的方式传输到服务器中
就可以在相应的@RequestMapping注解的value属性中通过占位符(xxx)表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参
示例理解:
获取占位符所对应的值比较单一,就是通过@PathVaribale注解将占位符所代表的值和形参进行绑定,也就是将占位符所表示的数据赋值给控制器形参
占位符必须和value进行匹配,这两者关系类似name和value的关系
简单描述:通过键值映射关系,用键获取值,在把键和形参绑定,这样当键有其对应的值,就会传给形参,也就是控制器(服务器端)
-
- RESTful风格在HTTP请求中通过GET、POST、PUT和DELETE这4个动词对应4种基本请求操作,具体如下所示:
- GET:用于获取资源
- POST:用于新建资源
- PUT:用于更新资源
- DELETE:用于删除资源
-
小结
这一部分,遇到最大的问题就是搭建Spring MVC的时候,所幸解决了。
然后就是一些知识点的学习掌握,总的来说,无论是理解还是实践都没有太大难度
跟着尚硅谷学习Spring MVC,要打起精神,之前学习mybatis和spring都是1.5倍速,学Spring MVC知识点稍微新一些且视频不包含字幕,杨老师也全程无尿点,所以哪怕原倍速,也要聚起精神来学习~