简介
用户输入信息后,如果想要得到用户输入的内容 , springMVC 应该如何做呢?
本次课讲解下再springmvc中获取请求参数及中文乱码问题
通过servletAPI获取
讲HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象
<a th:href="@{/testAPI(uname='admin',pwd=1234)}">测试使用servletapi 获取请求参数</a>
@RequestMapping("/testAPI")//形参位置的req表示当前请求public String testParam1(HttpServletRequest req){String name = req.getParameter("uname");String pwd = req.getParameter("pwd");System.out.println(name+"-----"+pwd);return "hello";}
通过控制器方法的形参获取请求参数
在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispacherServlet中就会将请求参数赋值给相应的形参
<a th:href="@{/test2(uname='admin2',pwd=12342222)}">测试使用 控制器 获取请求参数</a>
@RequestMapping("/test2")public String testParam2(String uname,String pwd){System.out.println(uname+"-----"+pwd);return "hello";}
<form th:action="@{/test2}" method="post">用户名: <input name="uname" type="text"/><br>密码: <input name="pwd" type="password"/><br>爱好:<input name="hobby" type="checkbox" value="a"/> 打游戏<input name="hobby" type="checkbox" value="b"/> 追剧<input name="hobby" type="checkbox" value="c"/> 睡觉<input name="hobby" type="checkbox" value="d"/> 旅行 <br><input type="submit" value="submit"/></form>
@RequestMapping("/test2")public String testParam2(String uname,String pwd,String[] hobby){//若请求参数中出现多个同名的请求参数,可以在控制器方法的形参位置设置字符串类型或字符串数组类型来接收此请求参数//若使用字符串类型的形参,最终结果为请求参数的每一个值,每一个值直接使用逗号拼接System.out.println(uname+"-----"+pwd+"---"+ Arrays.toString(hobby));return "hello";}
注意:
若请求参数中出现多个同名的请求参数,可以在控制器方法的形参位置设置字符串类型或字符串数组类型来接收此请求参数
若使用字符串类型的形参,最终结果为请求参数的每一个值,每一个值直接使用逗号拼接
@RequestParam
@RequestParam是将请求参数和控制器方法的形参创建映射关系
@RequestParam注解一共有3个属性:
value: 指定为形参赋值的请求参数的参数名
required: 设置是否必须传输此请求参数, 默认值为 true
若设置为true时, 则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则页面报错400:Required parameter 'XXX' is not present , 若设置为false, 则当前请求不是必须传输value所指定的请求参数, 若没有传输,则 注解所标识的形参的值为null
defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输时则使用默认值为形参赋值
<form th:action="@{/test2}" method="post">用户名: <input name="username" type="text"/><br>密码: <input name="pwd" type="password"/><br>爱好:<input name="hobby" type="checkbox" value="a"/> 打游戏<input name="hobby" type="checkbox" value="b"/> 追剧<input name="hobby" type="checkbox" value="c"/> 睡觉<input name="hobby" type="checkbox" value="d"/> 旅行 <br><input type="submit" value="submit"/></form>
@RequestMapping("/test2")public String testParam2(@RequestParam("username") String uname, String pwd, String[] hobby){//若请求参数中出现多个同名的请求参数,可以在控制器方法的形参位置设置字符串类型或字符串数组类型来接收此请求参数//若使用字符串类型的形参,最终结果为请求参数的每一个值,每一个值直接使用逗号拼接System.out.println(uname+"-----"+pwd+"---"+ Arrays.toString(hobby)); ---- 正常获取 unamereturn "hello";}
若HTTP状态 400 - 错误的请求
则 报错: Required request parameter 'username' for method parameter type String is not present(存在)
若将 controller 修改为
@RequestMapping("/test2")public String testParam2(@RequestParam(value = "username",required = false) String uname, String pwd, String[] hobby){//若请求参数中出现多个同名的请求参数,可以在控制器方法的形参位置设置字符串类型或字符串数组类型来接收此请求参数//若使用字符串类型的形参,最终结果为请求参数的每一个值,每一个值直接使用逗号拼接System.out.println(uname+"-----"+pwd+"---"+ Arrays.toString(hobby));return "hello";}
再次进行访问,则可以跳转页面, controller获取到的 uname 值为 null
若
@RequestMapping("/test2")public String testParam2(@RequestParam(value = "username",required = false,defaultValue = "pppp") String uname, String pwd, String[] hobby){//若请求参数中出现多个同名的请求参数,可以在控制器方法的形参位置设置字符串类型或字符串数组类型来接收此请求参数//若使用字符串类型的形参,最终结果为请求参数的每一个值,每一个值直接使用逗号拼接System.out.println(uname+"-----"+pwd+"---"+ Arrays.toString(hobby));return "hello";}
再次访问测试请求参数, 此时 controller获得uname值为 pppp
在地址栏输入 测试请求参数,此时(username没有传值) controller获得uname值为 pppp
@RequestHeader
@RequestHeader 是将请求头信息和控制器方法的形参创建映射关系
@RequestHeader注解一共有3个属性 value,required,defaultValue 用法同@RequestParam
@RequestMapping("/test2")public String testParam2(@RequestParam(value = "username",required = false,defaultValue = "pppp") String uname,String pwd, String[] hobby,@RequestHeader("Host")String host){//若请求参数中出现多个同名的请求参数,可以在控制器方法的形参位置设置字符串类型或字符串数组类型来接收此请求参数//若使用字符串类型的形参,最终结果为请求参数的每一个值,每一个值直接使用逗号拼接System.out.println(uname+"-----"+pwd+"---"+ Arrays.toString(hobby)+"----"+host); // host-- localhost:8080return "hello";}
通过Pojo获取请求参数
可以在控制器方法的形参位置设置一个实体类类型的形参,此时 若浏览器传输的请求参数的参数名 和 实体类中的属性名一致, 那么请求参数就会为此属性赋值
package ly.entity;public class User {private String username;private int age;private String pwd;private String sex;@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", age=" + age +", pwd='" + pwd + '\'' +", sex='" + sex + '\'' +", email='" + email + '\'' +'}';}private String email;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}}
<form th:action="@{/testPojo}" method="post">用户名: <input name="username" type="text"/><br>密码: <input name="pwd" type="password"/><br>sex:<input name="sex" type="radio" value="男"/>男<input name="sex" type="radio" value="女"/>女<br>age: <input name="age" type="test" /> <br>邮箱: <input name="email" type="text" /> <br><input type="submit" value="submit"/></form>
@RequestMapping("/testPojo")public String testParam2(User user){System.out.println(user);return "hello";}
控制台输出:User{username='qwe', age=12, pwd='123', sex='???', email='12112@qq.com'} 发现问题: 中文乱码 ----- 字符编码不一致 就会出现 乱码
解决获取请求参数的乱码问题
解决获取请求参数的乱码问题, 可以使用 springmvc提供的编码过滤器CharacterEncodingFilter,但是必须在web.xml中进行注册
如果 表单的提交方式为 get 则 只需要修改tomcat所在的server.xml, 增加 URIEncoding="UTF-8" 即可
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
如果表单的提交方式为 post 则 在web.xml 中 增加 过滤器 ,一般推荐过滤器写在 servlet之前
<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>
User{username='李四', age=2, pwd='111', sex='女', email='222'} 乱码已经解决