当前位置: 首页 > news >正文

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));   ---- 正常获取 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'} 乱码已经解决

相关文章:

  • ebpf学习
  • RT-Thread入门笔记5-线程的时间片轮询调度
  • LeetCode906. Super Palindromes
  • 基于模块自定义扩展字段的后端逻辑实现(一)
  • php 字符串常用函数
  • 计算机找不到msvcr100.dll的多种解决方法分享,轻松解决dll问题
  • 中国智造闪耀CES | 木牛科技在美国CES展亮相多领域毫米波雷达尖端方案
  • redis stream restTemplate消息监听队列框架搭建
  • 零基础也可以探索 PyTorch 中的上采样与下采样技术
  • 以太网交换机——稳定安全,构筑数据之桥
  • 【2019】360Java工程师客观题总结
  • AI绘画软件Stable Diffusion模型/Lora/VAE文件存放位置
  • vue前端开发自学demo,父子组件之间传递数据demo2
  • 235.【2023年华为OD机试真题(C卷)】机器人搬砖(二分查找-JavaPythonC++JS实现)
  • 硬核加码!星邦蓝助力全球运力最大固体火箭“引力一号”海上首飞
  • $translatePartialLoader加载失败及解决方式
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 11111111
  • 2017前端实习生面试总结
  • canvas绘制圆角头像
  • HTTP请求重发
  • Linux各目录及每个目录的详细介绍
  • SegmentFault 2015 Top Rank
  • 程序员最讨厌的9句话,你可有补充?
  • 动态魔术使用DBMS_SQL
  • 看域名解析域名安全对SEO的影响
  • 聊聊flink的BlobWriter
  • 软件开发学习的5大技巧,你知道吗?
  • 深度学习中的信息论知识详解
  • 实习面试笔记
  • 无服务器化是企业 IT 架构的未来吗?
  • 用Canvas画一棵二叉树
  • 优秀架构师必须掌握的架构思维
  • 找一份好的前端工作,起点很重要
  • #Lua:Lua调用C++生成的DLL库
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (力扣)1314.矩阵区域和
  • (强烈推荐)移动端音视频从零到上手(下)
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (图)IntelliTrace Tools 跟踪云端程序
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • ***测试-HTTP方法
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net 后台导出excel ,word
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET基础篇——反射的奥妙
  • .NET连接MongoDB数据库实例教程
  • .net与java建立WebService再互相调用
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @Autowired @Resource @Qualifier的区别
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [Angularjs]asp.net mvc+angularjs+web api单页应用