SpringMVC获取请求中的参数值不同方式总结

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: SpringMVC获取请求中的参数值不同方式总结

【1】SpringMVC获取请求参数方式

① 通过ServletAPI获取

将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请

求的请求报文的对象

@RequestMapping("/testParam")
public String testParam(HttpServletRequest request){
  String username = request.getParameter("username");
  String password = request.getParameter("password");
  System.out.println("username:"+username+",password:"+password);
  return "success";
}

② 通过控制器方法的形参获取请求参数

在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在

DispatcherServlet中就会将请求参数赋值给相应的形参。

<a th:href="@{/testParam(username='admin',password=123456)}">测试获取请求参数--
>/testParam</a><br>

后台代码

@RequestMapping("/testParam")
public String testParam(String username, String password){
  System.out.println("username:"+username+",password:"+password);
  return "success";
}


handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型)


处理request uri 部分(这里指uri template中variable,不含queryString部分)的注解:@PathVariable;


处理request header部分的注解: @RequestHeader, @CookieValue;


处理request body部分的注解:@RequestParam, @RequestBody;


处理ModelAttribute类型的注解: @SessionAttributes, @ModelAttribute;

【2】@PathVariabl注解获取路径中传递参数

只能绑定路径中的参数,且路径中必须有参数。实例如下:

Request URL:http://localhost:8080/SpringMVC-1/springmvc/testPathVariable/1/jane


后台接收方法

@RequestMapping(value= " /testPathVariable/{id}/{str} " )  
 public ModelAndView helloWorld(@PathVariable String id, @PathVariable String str) {  
 System.out.println(id);  
 System.out.println(str);  
 return new ModelAndView( "/helloWorld " );  
}  


如上所示,URL中{id}将会映射到方法参数id上,这里解析后值为1。URL中的{str}将会映射到方法参数str上,这里值为jane。


【3】@RequestParam注解获取请求参数


@RequestParam是将请求参数和控制器方法的形参创建映射关系,@RequestParam注解一共有三个属性:


value:指定为形参赋值的请求参数的参数名

required:设置是否必须传输此请求参数,默认值为true

若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则页面报错400:Required String parameter ‘xxx’ is not present;若设置为

false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为

null


defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值

为""时,则使用默认值为形参赋值

@RequestParam注解指示方法参数应绑定web请求参数。Spring MVC和Spring WebFlux中的注解处理程序方法支持如下:


在SpringMVC中,“request parameters”映射查询参数、表单数据和multipart requests中的参数。这是因为ServletAPI将查询参数和表单数据组合到一个a single map called "parameters",其中包括请求body的自动解析。


在Spring WebFlux中,“request parameters”只映射到查询参数。要在三部分起作用(query parameters, form data,and parts in multipart requests),可以使用数据绑定到用@ModelAttribute注解的命令对象。


如果方法参数类型为Map,并且指定了请求参数名称,则假设有适当的转换器可用,则请求参数值将转换为Map。


请注意,使用@RequestParam是可选的(例如,设置其属性)。默认情况下,任何简单值类型(由BeanUtils#isSimpleProperty确定)且未由任何其他参数解析程序解析的参数都将被视为使用@RequestParam注解。示例代码:

@Controller
@RequestMapping("/pets")
@SessionAttributes("pet")
public class EditPetForm {
    @RequestMapping(method = RequestMethod.GET)
    public String setupForm(@RequestParam(value="petId",required=false,defaultValue="0") int petId, ModelMap model) {
        Pet pet = this.clinic.loadPet(petId);
        model.addAttribute("pet", pet);
        return "petForm";
    }
}


【4】@RequestHeader获取请求头

@RequestHeader是将请求头信息和控制器方法的形参创建映射关系。@RequestHeader注解一共有三个属性:value、required、defaultValue,用法同@RequestParam


这是一个Request 的header部分:

Host                    localhost:8080
Accept                  text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language         fr,en-gb;q=0.7,en;q=0.3
Accept-Encoding         gzip,deflate
Accept-Charset          ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive              300

后台方法:

@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") long keepAlive)  {
  //...
}


上面的代码,把request header部分的 Accept-Encoding的值,绑定到参数encoding上了, Keep-Alive header的值绑定到参数keepAlive上。


【5】@CookieValue 获取cookie

① 使用实例


@CookieValue是将cookie数据和控制器方法的形参创建映射关系,@CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam


例如有如下Cookie值:


JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84
@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie)  {
 //...
}


即把JSESSIONID的值绑定到参数cookie上。

② 关于Cookie和Session


cookie似乎客户端技术,session是服务端技术。session依赖于cookie,每当显示用request.getSessio()方法创建session时,就会创建一个如下所示的Cookie。当浏览器再次请求时,请求头里面就会带有此Cookie。

通常来说,浏览器关闭则Cookie消失。如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效。不同的浏览器采用不同的方式保存Cookie。


IE浏览器会在“C:\Documents and Settings\你的用户名\Cookies”文件夹下以文本文件形式保存,一个文本文件保存一个Cookie。浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。


若设置了过期时间,浏览器就会把cookie保存到硬盘上(持久化cookie),关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。


Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。默认有效期为30分钟,30分钟内没有"活跃"则失效。如果"活跃"则重新计算生命周期。


【6】@RequestBody

该注解常用来处理Content-Type不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等。


它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。


如果配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap<String, String>里,这种情况在某些特殊需求下使用,详情查看FormHttpMessageConverter api。示例代码:

@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
  writer.write(body);
}


如果方法参数使用了该注解,但是请求头中的ContentType非application/json, application/xml,则会抛出Resolved exception caused by Handler execution: org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported类似异常!!

【7】@SessionAttributes


该注解用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用。在整个会话期间都有效。该注解有value、types两个属性,可以通过名字和类型指定要使用的attribute 对象。value属性值为字符串数组,故可以放多个键的名字 如"user",“name”


@SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(实际上使用的是 value 属性值),

还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上使用的是 types 属性值)注意: 该注解只能放在类的上面. 而不能修饰放方法.

示例代码:

@SessionAttributes(value={"user"}, types={String.class})
@RequestMapping("/springmvc")
@Controller
public class SpringMVCTest {
  @RequestMapping("/testSessionAttributes")
  public String testSessionAttributes(Map<String, Object> map){
    User user = new User("Tom", "123456", "tom@atguigu.com", 15);
    map.put("user", user);
    /*值的类型是string 自动放入类注解的requestScope sessionScope
     * @SessionAttributes(value={"user"}, types={String.class})
     * */
    map.put("school", "atguigu");
    return SUCCESS;
  }
}


result as follows :


如上图所示,map里面的对象将默认放入request域中;因为使用了@SessionAttributes(value={“user”}, types={String.class}) 注解,故user 和 school 也会自动放入session中。


所以页面从两个域取值,都可以正确取到。

【8】@ModelAttribute

① 显示标注@ModelAttribute注解

该注解有两个用法:一个是用于方法上,一个是用于参数上。


用于方法上时: 通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;该方法会首先调用(此时是向model里面加入数据)。


用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上(此时是从model里面寻找并取出数据)。要绑定的值来源于:


@SessionAttributes 启用的attribute 对象上;

@ModelAttribute 用于方法上时指定的model对象;

上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中。用到方法上@ModelAttribute

用到方法上@ModelAttribute
//将会


这种方式实际的效果就是在调用@RequestMapping的方法之前,为modelput("account" Account)

用在参数上的@ModelAttribute

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet) {
}


  • 首先查询 @SessionAttributes有无绑定的Pet对象
  • 若没有则查询@ModelAttribute方法层面上是否绑定了Pet对象
  • 若没有则将URI template中的值按对应的名称绑定到Pet对象的各属性上。


② pojo的默认解析

当没有显示标注@ModelAttribute注解时,如果是pojo也可以按照该种方式解析参数值。可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实

体类中的属性名一致,那么请求参数就会为此属性赋值

<form th:action="@{/testpojo}" 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">
</form>


后台代码

@RequestMapping("/testpojo")
public String testPOJO(User user){
  System.out.println(user);
  return "success";
}
//最终结果-->User{id=null, username='张三', password='123', age=23, sex='男',
email='123@qq.com'}

【9】@RequestBody和@RequestParam区别

① @RequestParam


用来处理Content-Type为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)


RequestParam可以接受简单类型的属性,也可以接受对象类型。实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。


在Content-Type: application/x-www-form-urlencoded的请求中, get 方式中queryString的值,和post方式中 body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到。

② @RequestBody

处理HttpEntity传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据。GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。


POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type。SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。

③ 总结


在GET请求中,不能使用@RequestBody。在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,对于参数转化的配置必须统一。


举个例子,在SpringMVC配置了HttpMessageConverters处理栈中,指定json转化的格式,如Date转成‘yyyy-MM-dd’,则参数接收对象包含的字段如果是Date类型,就只能让客户端传递年月日的格式,不能传时分秒。因为不同的接口,它的参数可能对时间参数有不同的格式要求,所以这样做会让客户端同事对参数的格式有点困惑,所以说扩展性不高。


如果使用@RequestParam来接受参数,可以在接受参数的model中设置@DateFormat指定所需要接受时间参数的格式。


另外,使用@RequestBody接受的参数是不会被Servlet转化统一放在request对象的Param参数集中,@RequestParam是可以的。


参考博文:SpringMVC中Controller里面的那些注解

目录
相关文章
|
11月前
|
存储 前端开发 Java
SpringMVC中重定向请求时传输参数原理分析与实践
SpringMVC中重定向请求时传输参数原理分析与实践
196 2
SpringMVC中重定向请求时传输参数原理分析与实践
|
前端开发 应用服务中间件
SpringMVC 文件上传 消息 Required request part ‘file‘ is not present描述 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者
SpringMVC 文件上传 消息 Required request part ‘file‘ is not present描述 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者
1893 0
|
Java 测试技术 API
【SpringMVC】参数传递与用户请求和响应(上)
【SpringMVC】参数传递与用户请求和响应(上)
79 0
|
JSON 前端开发 Java
springmvc-controller&视图层配置&SpringMVC处理请求的流程
springmvc-controller&视图层配置&SpringMVC处理请求的流程
|
6月前
|
JSON 数据格式
SpringMVC-接收请求中的json数据及日期类型参数传递
SpringMVC-接收请求中的json数据及日期类型参数传递
147 0
|
1月前
|
设计模式 前端开发 Java
Spring MVC——项目创建和建立请求连接
MVC是一种软件架构设计模式,将应用分为模型、视图和控制器三部分。Spring MVC是基于MVC模式的Web框架,通过`@RequestMapping`等注解实现URL路由映射,支持GET和POST请求,并可传递参数。创建Spring MVC项目与Spring Boot类似,使用`@RestController`注解标记控制器类。
37 1
Spring MVC——项目创建和建立请求连接
|
1月前
|
前端开发 Java
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
文章介绍了如何使用SpringBoot创建简单的后端服务器来处理HTTP请求,包括建立连接、编写Controller处理请求,并返回响应给前端或网址。
56 0
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
|
2月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
4月前
|
缓存 前端开发 Java
SpringMVC原理(1)-文件上传请求
【7月更文挑战第2天】SpringMVC文件上传请求原理:文件上传请求的执行流程、文件上传的自动配置原理 涉及组件:MultiPartFile、MultipartResolver、MultipartHttpServlet
|
5月前
|
前端开发 Java Spring
Spring MVC 请求处理流程
Spring MVC 请求处理流程
33 0