SpringMVC
获取请求参数ServletAPI
获取将HttpServletRequest
作为控制器方法的形参,此时HttpServletRequest
类型的参数表示封装了当前请求的请求报文的对象
案例:
// 使用ServletAPI
@RequestMapping("/param")
public String getParam(HttpServletRequest request){
String id = request.getParameter("id");
String username = request.getParameter("username");
System.out.println(id+"\t"+username);
return "param";
}
在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求时,匹配到请求映射时,DispatcherServlet
中就会将请求参数赋值给相应的形参【意思就是请求参数名
必须与控制器中形参参数名
一致,前端控制器自动给控制器的形参赋值】
案例:
地址栏:
// 通过控制器的形参获取参数
@RequestMapping("/contrParam")
public String contrParam(String user_name,String password,String[] hobby,Integer age){
System.out.println(username+"\t"+password+"\t"+ Arrays.toString(hobby)+"\t"+age);
return "param";
}
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>控制器方法形参获取请求参数title>
head>
<body>
<form th:action="@{/contrParam}" method="get">
用户名:<input type="text" name="user_name"><br/>
密码:<input type="password" name="password"><br/>
爱好:<input type="checkbox" name="hobby" value="写代码">写代码
<input type="checkbox" name="hobby" value="听歌">听歌
<input type="checkbox" name="hobby" value="跑步">跑步<br/>
年龄:<input type="text" name="age"><br/>
<input type="submit" value="提交">
form>
body>
html>
注意是:复选框一定要有value
值,否则提交后没有对应的值
@RequestParam
注解获取参数【非常重要】@RequestParam
是将请求参数和控制器方法的形参创建映射关系,就是表单中的@RequestParam(value = "username",defaultValue = "海康") String userName,
和不一致,用于绑定映射的
@RequestParam
注解一共有三个属性:
`value`:指定为形参赋值的请求参数的参数名
`required`:设置是否必须传输此请求参数,默认值为`true`
若设置为`true`时,则当前请求必须传输`value`所指定的请求的参数,若没有传输该请求参数,并且没有设置`defaultValue`属性,则页面会报错`400`:Required String parameter 'xxx' is not present;若设置为false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为null
如:@RequestParam("username") String username:说明username的属性必须传输,该属性是必须,如果不传输也没有设置`@RequestParam(value = "username",defaultValue = "海康")``defaultValue`属性时,则会报错:400:Required String parameter 'xxx' is not present,如果该值设置为false时,请求参数不是必须传输的
`defaultValue`:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为""[空字符串]时,则使用默认值为形参赋值
`@RequestParam(value = "username",defaultValue = "海康")`例如:如果传入的参数为空字符串或不传入值,则使用默认值
案例:
// 通过控制器的形参获取参数
@RequestMapping("/contrParam")
public String contrParam(@RequestParam(value = "user_name",defaultValue = "海康") String userName, String password, String[] hobby, Integer age){
System.out.println(userName+"\t"+password+"\t"+ Arrays.toString(hobby)+"\t"+age);
return "param";
}
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>控制器方法形参获取请求参数title>
head>
<body>
<form th:action="@{/contrParam}" method="get">
用户名:<input type="text" name="user_name"><br/>
密码:<input type="password" name="password"><br/>
爱好:<input type="checkbox" name="hobby" value="写代码">写代码
<input type="checkbox" name="hobby" value="听歌">听歌
<input type="checkbox" name="hobby" value="跑步">跑步<br/>
年龄:<input type="text" name="age"><br/>
<input type="submit" value="提交">
form>
body>
html>
注意是:一般用于表单中name="user_name"
和控制器中的形参名@RequestParam(value = "user_name",defaultValue = "海康") String userName
不一致,建议在开发中使用这种方式
@RequestParam
注解源码
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
@RequestHeader
获取指定请求头@RequestHeader
是将请求头信息和控制器方法的形参创建映射关系
@RequestHeader
注解一共有三个属性:value
和required
和defaultValue
,用法和@RequestParam
一样
// 通过@RequestHeader注解获取指定请求头
@RequestMapping("/header")
public String header(@RequestHeader(value = "Connection",required = true,defaultValue = "haha")String host){
System.out.println(host);
return "param";
}
@CookieValue
获取指定Cookie
值【重点】@CookieValue
是将Cookie
数据和控制器方法的形参创建映射关系
@CookieValue
注解一共有三个属性: value
和required
和defaultValue
,用法和@RequestParam
一样
案例:
先在服务器中产生一个Session对象
@RequestMapping("/")
public String hello(HttpServletRequest request){
HttpSession session = request.getSession();
System.out.println(session);
return "ParamForm";
}
// 通过CookieValue注解获取指定的Cookie值
@RequestMapping("/cookie")
public String cookie(@CookieValue(value = "JSESSIONID")String session){
System.out.println(session);
return "param";
}
总结 :@RequestParam
@RequestHeader
@CookieValue
这三个注解的使用一样
POJO
获取请求参数【非常重点】可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值
POJO
实体类
public class User {
private Integer id;
private String username;
private String password;
private String sex;
private Integer age;
private String email;
并提供getter和setter方法
及 toString方法
}
表单
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>获取请求参数Pojo方式title>
head>
<body>
<form th:action="@{/testpojo}" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
性别:<input type="radio" name="sex" value="男">男<input type="radio" name="sex" value="女">女<br>
年龄:<input type="text" name="age"><br>
邮箱:<input type="text" name="email"><br>
<input type="submit">
form>
body>
html>
控制器
// 通过Pojo类获取请求参数
@RequestMapping("/testpojo")
public String pojo(User user){
System.out.println(user);
return "param";
}
注意是:由于是post
的请求方式会出现中文乱码问题
解决获取请求参数的乱码问题,可以使用SpringMVC
提供的编码过滤器CharacterEncodingFilter
,但是必须在web.xml
中进行注册
注意是:由于get
请求的方式在tomcat
中的server.xml
中 的Connector port='8080',URIRncoding="UTF-8"
中的URIRncoding
属性说明所有的get
请求已经解决了中文乱码问题
但是由于现在使用的是SpringMVC
框架在前端控制器中DispatcherServlet
对所有的请求进行处理,所以如果在控制器
中使用Response对象中.setCharacterEncoding("utf-8");
处理已经不起作用了,因为是前端控制器已经对请求处理并获取了参数,只能在前端控制器
加载前设置编号这【前端控制器相当于Servlet
】, tomcat服务器
执行流程是:监听器
—>过滤器
—>servlet
,可以在过滤器中设置,使用SpringMVC
框架的方式:
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
<init-param>
<param-name>forceResponseEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
注:SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效
总结:可以理解为最终几种获取参数方式
ServletAPI
原始获取@RequestParam
注解@RequestHeader
获取请求头@CookietValue
获取Cookie
值POJO
参数