文章目录
@RequestMapping注解
作用
: 将请求和处理请求的控制器方法关联 起来,建立映射关系
SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求
1、标识到类和方法
标识一个类
: 设置映射请求的请求路径的初始信息
标识一个方法
: 设置映射请求路径的具体信息
@RequestMapping("/test")
// 当前路径为 /test/..
public class TestMappingController {
@RequestMapping("/testMapping")
// 当前路径为 /test/testMapping
public String testMapping(){
return "success";
}
}
2、value属性
①、通过请求的请求地址匹配请求映射
②、一个字符串类型的数组,可以表示该请求映射能够匹配多个请求地址 所对应的请求
③、value属性
必须设置,至少通过请求地址匹配请求映射
@RequestMapping(value = {"/test","/testValue"})
public String test(){
return "success";
}
<a th:href="@{/test}">测试RequestValue/a><br/>
<a th:href="@{/testValue}">测试RequestValue</a><br/>
3、value属性扩展
3.1、ant风格的路径
通配符 | 作用 |
---|---|
? | 表示任意的单个字符 |
* | 表示0个或多个字符 |
** | 表示任意的一层或多层目录 |
@RequestMapping(value = "/??/test")
@RequestMapping(value = "/*/test")
@RequestMapping(value = "/?/**/test")
3.2、路径中的占位符
一般方式
: /test?id=1
rest方式
: /test/1
SpringMVC路径中的占位符常用于RESTful
风格中,当请求路径中将某些数据通过路径的方式传输到服 务器中,就可以在相应的@RequestMapping注解
的value属性
中通过占位符{xxx}
表示传输的数据,再通过@PathVariable注解
,将占位符所表示的数据赋值给控制器方法的形参
@RequestMapping(value = "/test/{id}/{username}")
public String test(@PathVariable("id") String id,@PathVariable("username") String username)
<a th:href="@{/test/1/admin">测试占位符</a><br>
4、method属性
①、通过请求的请求方式匹配请求映射(默认post,get都行)
②、属性是RequestMethod
类型的数组,表示该请求映射能够匹配 多种请求方式的请求
③、若当前请求的请求地址满足请求映射的value
属性,但是请求方式不满足method
属性,则浏览器报错 405
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test(){
return "success";
}
<form th:action="@{/test}" method="post">
<input type="submit" value="测试methon">
</form>
派生请求
派生请求 | 作用 |
---|---|
@GetMapping | 处理get请求的映射 |
@PostMapping | 处理post请求的映射 |
@PutMapping | 处理put请求的映射 |
@DeleteMapping | 处理delete请求的映射 |
5、params属性
①、通过请求的请求参数匹配请求映射
②、是一个字符串类型的数组,可以通过四种表达式设置请求参数 和 请求映射的匹配关系( param,!param,param=value,param != value)
③、若当前请求满足@RequestMapping注解
的value和method属性
,但是不满足params属性
,此时 页面回报错400
@RequestMapping(value = "/test",
params = {"username=123","password"})
public String test(){
return "success";
}
<!-- 等价test?username=admin&password=admin-->
<a th:href="@{/test(username='admin',password='admin')}">测试params属性</a><br>
6、headers属性
①、通过请求的请求头信息匹配请求映射
②、是一个字符串类型的数组,可以通过四种表达式设置请求头信 息和请求映射的匹配关系(同params)
③、若当前请求满足@RequestMapping注解
的value和method属性
,但是不满足headers属性
,此时页面 显示404
错误,即资源未找到
headers = {"Host=localhost:8081"}
获取请求参数
1、通过ServletAPI获取
将HttpServletRequest
作为控制器方法的形参,此时HttpServletRequest
类型的参数表示封装了当前请求的请求报文的对象
@RequestMapping(value = "/test")
public String test(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username + '\t' + password);
return "success";
}
2、通过控制器方法的形参获取请求参数
在控制器方法的形参位置,设置和请求参数同名的形参
,当浏览器发送请求,匹配到请求映射时,在 DispatcherServlet
中就会将请求参数赋值给相应的形参
请求参数中有多个同名的请求参数
用字符串接收请求参数
: 此参数的值为每个数据中间使用逗号拼接的结果
用字符串数组接收请求参数
: 此参数的数组中包含了每一个数据
@RequestMapping(value = "/test")
public String test(String username,String password,String[] hobby){
System.out.println(username + '\t' + password);
System.out.println(hobby[0] + '\t' + hobby[1]);
return "success";
}
<form th:action="@{/test}" method="post">
用户名 : <input type="text" name="username"> <br/>
密码 : <input type="password" name="password"> <br/>
<input type="checkbox" name="hobby" value="C++"> C++
<input type="checkbox" name="hobby" value="java"> java
<input type="checkbox" name="hobby" value="python"> python <br/>
<input type="submit" value="获取请求参数">
</form>
3、@RequestParam
将请求参数
和控制器方法的形参
创建映射关系
属性 | 作用 |
---|---|
value | 指定为形参赋值的请求参数的参数名 |
required | 设置是否必须传输此请求参数,默认值为true(若没有传输该请求参数,且没有设置 defaultValue属性,则页面报错400。设置为false,若没有传输,则注解所标识的形参的值为 null) |
defaultValue | 不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值 为""时,则使用默认值为形参赋值 |
public String test(@RequestParam(value = "user_name" , required = true , defaultValue = "hahah")String username){
System.out.println(username);
return "success";
}
用户名 : <input type="text" name="user_name"> <br/>
4、@RequestHeader
①、将请求头信息和控制器方法的形参创建映射关系
②、共有三个属性:value、required、defaultValue,用法同@RequestParam
@RequestMapping(value = "/test")
public String test(@RequestHeader("Host")String root){
System.out.println("Host=" + root); // Host=localhost:8080
return "success";
}
5、@CookieValue
①、将cookie数据和控制器方法的形参创建映射关系
②、共有三个属性:value、required、defaultValue,用法同@RequestParam
6、通过POJO获取请求参数
可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名
和实体类中的属性名
一致,那么请求参数就会为此属性赋值
public class User {
private String username;
private String password;
private String hobby;
// constructor、setXxx、getXxx 和 toString 省略
}
用户名 : <input type="text" name="username"> <br/>
密码 : <input type="password" name="password"> <br/>
爱好 : <input type="checkbox" name="hobby" value="C++"> C++
<input type="checkbox" name="hobby" value="java"> java
<input type="checkbox" name="hobby" value="python"> python
@RequestMapping(value = "/test")
public String test(User user){
System.out.println(user); // User{username='flzj_kl', password='123', hobby='C++,java,python'}
return "success";
}
7、解决获取请求参数的乱码问题
get请求的乱码
tomcat已经解决过了
apache-tomcat-8.5.73-windows-x64\apache-tomcat-8.5.73\conf\server.xml
(tomcat8或以上版本默认UTF-8)
post请求的乱码
解决获取请求参数的乱码问题,可以使用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>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
源码细🔒
来到CharacterEncodingFilter
这个过滤器里面
我们会发现,encoding 是 @Nullable
注解 , 所以默认是没有值的
根据老师在视频中所说,在源码找FilterChain
一般都是执行,过滤
的,所以我们来到doFilterInternal()
方法,如下图
还不线上课😡😡😡😡
为了方便,我自己阅读,以后烧话写下面