四、SpringMVC获取请求参数
1、通过servletAPI获取
将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象
通过servletAPI获取请求参数的方法能不用就不用。
html中的设置
<a th:href="@{/testServletAPI(username='admin', password=123456)}">测试使用servletAPI获取请求参数</a><br>
RequestMappingController控制器中的设置
@RequestMapping("/testServletAPI") //形参位置的request表示当前请求 public String testServletAPI(HttpServletRequest request){ String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println("username:"+username+",password:"+password); return "success"; }
2、通过控制器方法的形参获取请求参数
在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServleti中就会将请求参数赋值给相应的形参
使用此方法获取请求参数时,必须保证形参的参数名(RequestMappingController控制器中)与请求参数的参数名(html中)保持一致
html中的设置
<a th:href="@{/testParam(username='admin', password=123456)}">测试使用控制器的形参获取请求参数</a><br> <form th:action="@{/testParam}" method="get"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> 爱好:<input type="checkbox" name="hobby" value="a">a <input type="checkbox" name="hobby" value="b">b <input type="checkbox" name="hobby" value="c">c<br> <input type="submit" value="测试使用控制器的形参获取请求参数(形参名与请求参数名对应)"> </form>
RequestMappingController控制器中的设置
@RequestMapping("/testParam") //若请求参数中出现多个同名的请求参数,可以在控制器方法的形参位置设置字符串类型或字符串数组的形参就收此请求 //若使用字符串类型(String)的形参,最终结果为请求参数的每一个值之间使用逗号减小拼接 //此时输出为username:admin,password:123456,hobby:a,b,c //public String testParam(String username, String password, String hobby){ //若使用字符串数组类型(String[])的形参,此参数的数组中包含了每一个数据 //此时输出为username:admin,password:123456,hobby:[a,b,c] public String testParam(String username, String password, String[] hobby){ System.out.println("username:"+username+",password:"+password+",hobby:"+ Arrays.toString(hobby)); return "success"; }
注:
若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串数组(String[])或者字符串类型(String)的形参接收此请求参数
若使用字符串数组类型(String[])的形参,此参数的数组中包含了每一个数据
若使用字符串类型(String)的形参,此参数的值为每个数据中间使用逗号拼接的结果
3、@RequestParam
@RequestParam是将请求参数和控制器方法的形参创建映射关系
@RequestParam注解一共有三个属性:
value:指定为形参赋值的请求参数的参数名
required:设置是否必须传输此请求参数,默认值为true若设置为true时,则当前请求必须传输vlue所指定的请
求参数,若没有传输该请求参数,且没有设置defaultValue属性,则页面报错400:Required String
parameter 'xxx'is not present;若设置为false,则当前请求不是必须传输value所指定的情求参
数,若没有传输,则注解所标识的形参的值为null
defaultValue:不管required属性值为true还是false,当value所指定的请求参数没有传输或为""(空字符串)
时,则使用默认值为形参赋值
html中的设置
<form th:action="@{/testParam2}" method="get"> 用户名:<input type="text" name="user_name"><br> 密码:<input type="password" name="password"><br> 爱好:<input type="checkbox" name="hobby" value="a">a <input type="checkbox" name="hobby" value="b">b <input type="checkbox" name="hobby" value="c">c<br> <input type="submit" value="测试使用控制器的形参获取请求参数(形参名与请求参数名不对应,使用@RequestParam)"> </form>
RequestMappingController控制器中的设置
@RequestMapping("/testParam2") public String testParam2( /** * @RequestParam 注解:将请求参数user_name与形参username对应 * 属性:value:对应html文件中的请求参数,并将其与形参连接 * required:默认为true,表示必须有请求参数与之对应,否则报错;改为false后, * 即使没有user_name也不会报错,而是返回null * defaultValue:不管required属性值为true还是false,当value所指定的请求参数没有传输 或为""(空字符串)时,则使用默认值为形参赋值 */ @RequestParam(value = "user_name", required = false, defaultValue = "hehe") String username, String password, String[] hobby){ System.out.println("username:"+username+",password:"+password+",hobby:"+ Arrays.toString(hobby)); return "success"; }
4、@RequestHeader
@RequestHeader是将请求头信息和控制器方法的形参创建映射关系
@RequestHeader注解一共有三个属性:value、required、defaultValue,用法同@RequestParam
html中的设置
<form th:action="@{/testHeader}" method="get"> 用户名:<input type="text" name="user_name"><br> 密码:<input type="password" name="password"><br> 爱好:<input type="checkbox" name="hobby" value="a">a <input type="checkbox" name="hobby" value="b">b <input type="checkbox" name="hobby" value="c">c<br> <input type="submit" value="测试使用控制器的形参获取请求参数(使用@RequestHeader)"> </form>
RequestMappingController控制器中的设置
@RequestMapping("/testHeader") public String testHeader( /** * @RequestHeader 注解:将请求头中的Host与形参host对应 * 属性:value:对应请求头信息,并将其与形参连接 * required:默认为true,表示必须有请求头信息与之对应,否则报错;改为false后, * 即使没有头信息也不会报错,而是返回null * defaultValue:不管required属性值为true还是false,当value所指定的请求参数没有传输或为""(空字符串) * 时,则使用默认值为形参赋值 */ @RequestParam(value = "user_name", required = false, defaultValue = "hehe") String username, String password, String[] hobby, @RequestHeader(value = "sayHaha", required = true, defaultValue = "haha") String host){ System.out.println("username:"+username+",password:"+password+",hobby:"+ Arrays.toString(hobby)); System.out.println("host:"+host); return "success"; }
5、@CookieValue
@CookieValue是将cookie数据和控制器方法的形参创建映射关系
@CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam
1、创建Cookie
html中的设置
<a th:href="@{/testServletAPICookie(username='admin', password=123456)}">测试使用servletAPI获取请求参数并创建Cookie</a><br>
RequestMappingController控制器中的设置
@RequestMapping("/testServletAPICookie") //形参位置的request表示当前请求 public String testServletAPICookie(HttpServletRequest request){ //创建Cookie HttpSession session = request.getSession(); String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println("username:"+username+",password:"+password); return "success";
2、使用@CookieValue获取Cookie数据
html中的设置
<form th:action="@{/testHeaderCookie}" method="get"> 用户名:<input type="text" name="user_name"><br> 密码:<input type="password" name="password"><br> 爱好:<input type="checkbox" name="hobby" value="a">a <input type="checkbox" name="hobby" value="b">b <input type="checkbox" name="hobby" value="c">c<br> <input type="submit" value="测试使用控制器的形参获取请求参数(使用@RequestHeader)"> </form>
RequestMappingController控制器中的设置
@RequestMapping("/testHeaderCookie") public String testHeaderCookie( /** * @RequestHeader 注解:将请求头中的Host与形参host对应 * 属性:value:对应请求头信息,并将其与形参连接 * required:默认为true,表示必须有请求头信息与之对应,否则报错;改为false后, * 即使没有头信息也不会报错,而是返回null * defaultValue:不管required属性值为true还是false,当value所指定的请求参数没有传输或为""(空字符串) * 时,则使用默认值为形参赋值 */ @RequestParam(value = "user_name", required = false, defaultValue = "hehe") String username, String password, String[] hobby, @RequestHeader(value = "sayHaha", required = true, defaultValue = "haha") String host, @CookieValue("JSESSIONID") String JSESSIONID){ System.out.println("username:"+username+",password:"+password+",hobby:"+ Arrays.toString(hobby)); System.out.println("host:"+host); System.out.println("JSESSIONID:"+JSESSIONID); return "success"; }
6、通过POJO获取请求参数
可以在控制器方法的形参位置设置一个实体类类型的参数,此时若浏览器传输的请求参数的参数名和实体类中的属性名抑制,那么请求参数就会为此属性赋值。
html中的设置
<form th:action="@{/testBean}" 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" value="使用POJO实体类接收请求参数"> </form>
RequestMappingController控制器中的设置
@RequestMapping("/testBean") /**可以直接使用: * public String testBean(Integer id; * String username; * String password; * Integer age; * String sex; * String email;){...} * 但是后期使用太麻烦,所以可以直接写一个User实体类,然后调用: * public String testBean(User user){...} * * 只要保持实体类User内的参数名与test——param内的请求参数名一致, * 就能够获取到请求参数的值 */ public String testBean(User user){ System.out.println(user); return "success"; }
此时的输出为:User{id=null, username='admin', password='123', age=25, sex='??·', email='123@qq.com'},sex值出现乱码。
若将html设置中的method=“post”,改为method=“get”
<form th:action="@{/testBean}" method="get"> 用户名:<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" value="使用POJO实体类接收请求参数"> </form>
则此时的输出为:User{id=null, username='admin', password='123', age=25, sex='男', email='123@qq.com'},乱码消失。
想要method=“post”时,不出现乱码,则需要在web.xml文件下配置过滤器
web.xml中配置过滤器
<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>
此时,就算method=“post”,输出中文时也不会出现乱码,输出为:User{id=null, username='张三', password='123', age=25, sex='男', email='123@qq.com'}