三,@RequestMapping注解
1.@RequestMapping注解的功能
从注解名称我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起立,建立映射关系
SpringMVC接收到指定的请求,就回来找到在映射关系中对应的控制器方法来处理这个请求
2.@RequestMapping注解标识的位置
@RequestMapping标识一个类:设置映射的请求路径的初始信息
@Requestmapping标识一个方法:设置映射的请求路径的具体信息
当模块比较多时如(现在有俩个模块:order订单模块,user用户模块,这时俩个模块中都有一个@RequestMapping("list")对应的控制器方法,当浏览器发送请求这时会报错404,因为控制器中有俩个list,它不知道要用那个list,所以这时需要order这个类定义一个@RequestMapping(Xxx)注解在user类上页添加一个@RequestMapping注解,在发送请求时就可以明确地写出到底访问那个请求如/user/list)
3.@RequestMapping注解的value属性
@RequestMapping注解的value属性通过请求的请求地址匹配请求映射
@RequestMapping注解的value属性是一个字符串数组,表示该请求映射能够匹配多个请求地址所对应的请求。
@RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射
4.注解的method属性
@RequestMapping注解的method属性通过请求方式(get,post,put,delete)匹配请求映射。
@RequestMapping注解的method是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求。
若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,则浏览器会报错405:Request method "POST" not supported
<a th:href="@{/testRequestMapping}">测试RequestMapping注解的method属性---->GET</a> <form th:action="@{/testAction}" method="post"> <input type="submit"> </form><a th:href="@{/testRequestMapping}">测试RequestMapping注解的method属性---->GET</a> <form th:action="@{/testAction}" method="post"> <input type="submit"> </form>
5.@RequestMapping注解的params属性(了解)
没有携带参数
携带参数
6.@RequestMapping注解的headers属性(了解)
跟value属性,性质差不多
7.SpringMVC支持ant风格的路径
?:表示可以是任意字符
*:表示可以是0个或多个字符
**:表示任意的一层或多层目录
注意:在使用**,只能使用/**/xxx的方式
8.SpringMVC支持路径中的占位符(重点)
原始方式:/deleteUser?id=1
rest方式:/deleteUser/1
SpringMVC路径中的占位符常用于restful风格中,但请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,再通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参
四,SpringMVC获取请求参数
1.通过ServletAPI获取
<a th:href="@{/testParam(username='admin',password=123)}">测试通过ServletAPI获取参数</a>
@Controller
public class TestParamController {
@RequestMapping("/testParam")
public String testParam(ServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("用户名:" + username + ",密码:" + password); // 用户名:admin,密码:123
return "success";
}
}
2.通过控制器方法的形参获取请求参数
<form th:action="@{/testparamter}" method="get">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
爱好:跑步:<input type="checkbox" value="run" name="hobby">游泳:<input type="checkbox" value="Swimming" name="hobby">健身:<input type="checkbox" value="Bodybuilding" name="hobby">
<input type="submit" value="测试使用控制器形参获取请求参数"><br>
</form>
@RequestMapping("/testparamter")
public String testParamter(String username,String password,String[] hobby) {
System.out.println("用户名:" + username + ",密码:" + password+ ",爱好:" + Arrays.toString(hobby));
/*
结果:
用户名:admin,密码:123,爱好:[run, Swimming, Bodybuilding]
若请求参数中出现了多个同名的请求参数,可以在控制器方法的形参位置设置字符串类型或字符串数组接收此请求参数
若使用字符串类型的形参,最终结果为请求参数的每一个值之间使用逗号进行拼接
*/
return "success";
}
3.@RequestParam
@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.@RequestHeader
@RequestHeader是将请求头信息和控制器方法的形参创建映射关系
@RequestHeader注解一共有三个属性:value,required,defaultValue,用法同@RequestParam
5.@CookieValue
@CookieValue是将cookie数据和控制器方法的形参创建映射关系
@CookieValue注解一共有三个属性:value,required,defaultValue,用法同@RequestParam
6.通过POJO获取请求参数
可以在控制方法的形参位置设置一个实体类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值
<form th:action="@{/testPOJo}" method="get">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
年龄:<input type="number" name="age"><br>
<input type="submit" value="使用实体类接收请求参数"><br>
</form><br>
@RequestMapping("/testPOJo")
public String testPOJO(User user){
System.out.println(user); // User{username='admin', password='123', age=21}
return "success";
}
7.解决获取请求参数的乱码问题
当我们使用get请求获取请求参数时如果出现了乱码问题可以在tomcat的目录找到server.xml 在配置端口的标签里添加URIEncoding="UTF-8"
当我们使用post 请求获取请求参数时如果出现了乱码问题那么可以在web.xml配置过滤器
可以使用SpringMVC提供的编码过滤器CharacterEncodingFiflter,但是必须在web.xml中进行注册
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>
这样我们再获取post请求参数就不会有乱码问题了
在这里我们分析一下这个 CharacterEncodingFilter 过滤器的源码