SpringMVC-获取请求参数

这篇具有很好参考价值的文章主要介绍了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'} 乱码已经解决文章来源地址https://www.toymoban.com/news/detail-810551.html

到了这里,关于SpringMVC-获取请求参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringMVC之获取请求参数

    下面用到了thymeleaf,不知道的可以看我同专栏里的搭建框架这篇文章。 将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象。 在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映

    2024年02月12日
    浏览(44)
  • 4、SpringMVC之获取请求参数

    创建名为spring_mvc_demo2的新module,过程参考3.1节 如果控制器方法有HttpServletRequest类型的形参,DispatcherServlet就会将封装了当前请求的对象传给控制器方法 +++++++++++++++++++++++++分割线+++++++++++++++++++++++++ +++++++++++++++++++++++++分割线+++++++++++++++++++++++++ +++++++++++++++++++++++++分割线++++++

    2024年02月08日
    浏览(36)
  • springMVC获取请求参数的方式

    将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装当前请求的请求报文 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可 后端根据前端页面传入的实际参数进行一一取值(参数的少的情况下建议使用) @Re

    2024年02月02日
    浏览(51)
  • 详解 SpringMVC 中获取请求参数

    在Spring MVC中,获取请求参数有很多种方式,先来个开盘小菜,使用@RequestParam注解来获取请求参数。 @RequestParam注解可以用于方法的参数上,用于指定请求参数的名称。例如,如果你的请求参数名为\\\"username\\\",你可以在方法参数上使用@RequestParam(“username”)来获取该参数的值。

    2024年02月10日
    浏览(40)
  • SpringMVC之获取请求参数和域对象共享数据

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需写作干货注入能量… 热爱写作,愿意让自己成为更好

    2024年02月04日
    浏览(47)
  • 【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解

    欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《PostMan工具的安装与使用技巧》 前面我们已经完成了入门案例相关的知识学

    2024年02月03日
    浏览(73)
  • 【SpringMVC】参数传递与用户请求和响应

    目录 一、Postman 工具使用 1.1 Postman安装 1.2 Postman的使用 1.2.1 创建WorkSpace工作空间 1.2.2 创建请求   二、参数传递 2.1 添加 Slf4j 依赖 2.2 普通传参 知识点1:@RequestMapping 知识点2:@RequestParam 2.3 路径传参 知识点3:@PathVariable 2.4 Json数据传参  知识点4:@RequestBody   三、响应 3.1 响

    2024年02月09日
    浏览(45)
  • SpringMVC---获取参数

    2024年02月04日
    浏览(32)
  • SpringMvc参数获取

    目录 一、封装为简单数据类型 二、封装为单个对象 (1)实体类 (2)控制层 三、封装为关联对象 (1)实体类 (2)控制层 (3)使用表单发送带有参数的请求 四、封装为List集合 (1)控制层 五、封装为对象类型集合 (1)实体类 六、封装为Map集合 (1)实体类 七、使用

    2024年02月07日
    浏览(33)
  • SpringMVC 获取参数

    1、通过ServletAPI获取 将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象 2、通过控制器方法的形参获取请求参数 在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在Dis

    2024年01月21日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包