SpringMVC-获取请求参数

简介

用户输入信息后,如果想要得到用户输入的内容 , 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));   ---- 正常获取 uname
     return "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:8080
     return "hello";
 }

通过Pojo获取请求参数

可以在控制器方法的形参位置设置一个实体类类型的形参,此时 若浏览器传输的请求参数的参数名 和 实体类中的属性名一致, 那么请求参数就会为此属性赋值

 
package ly.entity;
 ​
 public class User {
     private String username;
     private int age;
     private String pwd;
     private String sex;
 ​
     @Override
     public 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'} 乱码已经解决

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

射手座的程序媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值