【SpringMVC】【@RequestMapping注解】【获取请求参数】【学习笔记】Spring开学很好学1.3

@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()方法,如下图

在这里插入图片描述

还不线上课😡😡😡😡

为了方便,我自己阅读,以后烧话写下面

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值