一、SpringMVC 使用 @PathVariable、@RequestParam、@RequestHeader、@CookieValue 等来解决参数获取问题。
1. @PathVariable:映射 URL 绑定的占位符,可以借助于传入到方法参数列表中的 @PathVariable 注解获取到 URL 映射中的参数值。如:
<a href="handler01/1">test pathvariable</a>
@RequestMapping("/handler01/{id}") public String testPathVariable(@PathVariable("id") String id) { System.out.println("id:" + id); return "success"; }
说明:URL 绑定占位符使 SpringMVC 对 REST 提供了支持。对于具体的 SpringMVC 的 REST 风格的例子会在以后的文章里介绍。
2.@RequestParam
官方文档是这样描述的:
* Annotation which indicates that a method parameter should be bound to a web* request parameter. Supported for annotated handler methods in Servlet and
* Portlet environments.
*
* <p>If the method parameter type is {@link Map} and a request parameter name
* is specified, then the request parameter value is converted to a {@link Map}
* assuming an appropriate conversion strategy is available.
*
* <p>If the method parameter is {@link java.util.Map Map<String, String>} or
* {@link org.springframework.util.MultiValueMap MultiValueMap<String, String>}
* and a parameter name is not specified, then the map parameter is populated
* with all request parameter names and values.
说明一下:
(1)该注解表明 web 请求参数绑定到目标 handler 方法的入参。
(2)如果方法的入参类型是一个 Map,不包含泛型类型,并且请求参数名称是被指定的
(如:public String testRequestParam5(@RequestParam("userName") Map map)),请求参数会被转换为一个 Map,前提是存在转换策略。
这里所说的转换策略,通常是指 请求参数 到 Map 的类型转换,如请求参数为 userName=a|12,b|34 这样的数据,需要通过一个转换策略(类型转换器)
来完成 a|12,b|34 到 map 的转换。在我们一般开发的过程中,不包含这种情况。是一种扩展。关于类型转换会在后面的文章中介绍。
(3)如果方法的入参是一个 Map 且指定了泛型类型 Map<String,String> 或者是 org.springframework.util.MultiValueMap 类型的 MultiValueMap<String, String>
并且没有指定请求参数,那么这个 Map 类型的参数会将所有的请求参数名称和值填充(populate)到其中。
如:
请求:<a href="https://www.linuxidc.com/testRequestParam4?userName=jack&age=23">test request param4</a>
handler 方法:
@RequestMapping("/testRequestParam4") public String testRequestParam4(@RequestParam Map<String, String> map) { System.out.println("map:" + map); return "success"; }
控制台输出:
map:{userName=jack, age=23}
上面整体介绍了 @RequestParam,下面详细看看它的API:
包含三个属性:
(1)value 属性,默认为 ""
官方文档说明:
The name of the request parameter to bind to.
解释的已经很明白了,不再赘述。
(2)required 属性,默认为 true
官方文档说明:Whether the parameter is required.
见名知意,该请求参数是否是必须的。为 true 的请求下,若请求参数中没有,则会抛出一个异常。为 false 的情况下,如果请求参数中没有,则方法入参对应值为 null。
另外,提供一个 defaultValue 属性,则会是此属性设置为 false。
(3)defaultValue 属性
当没有提供对应的请求参数,或者请求参数为空时,会使用此属性对应的值。当设置此属性的时候,会将 required 属性设置为 false。
下面提供几个常见请求情况的例子:
(1)请求为:<a href="testRequestParam?userName=abc">test request param</a>
handler 方法:
@RequestMapping("/testRequestParam") public String testRequstParam01(@RequestParam("userName") String userName) { System.out.println("userName: " + userName); return "success"; }
(2)请求为:<a href="testRequestParam2?userName=jack&userName=lucy">test request param2</a>
handler 方法: