SpringMVC基础——参数获取与Servlet资源获取问题
2016-08-04 11:59
330 查看
一、SpringMVC 使用 @PathVariable、@RequestParam、@RequestHeader、@CookieValue 等来解决参数获取问题。
1. @PathVariable:映射 URL 绑定的占位符,可以借助于传入到方法参数列表中的 @PathVariable 注解获取到 URL 映射中的参数值。如:
说明:URL 绑定占位符使 SpringMVC 对 REST 提供了支持。对于具体的 SpringMVC 的 REST 风格的例子会在以后的文章里介绍。
2.@RequestParam
官方文档是这样描述的:
说明一下:
(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="testRequestParam4?userName=jack&age=23">test request param4</a>
handler 方法:
控制台输出:
map:{userName=jack, age=23}
上面整体介绍了 @RequestParam,下面详细看看它的API:
Address
请求:同样包含 get 请求 和 post 请求
handler 方法:
是如何绑定的呢?翻源码过程如下:
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter#invokeHandlerMethod
ExtendedModelMap implicitModel = new BindingAwareModelMap();
Object result = methodInvoker.invokeHandlerMethod(handlerMethod, handler, webRequest, implicitModel);
第一步:发现在 result 中已经包含了注入的 bean。所以注入是在methodInvoker.invokeHandlerMethod() 方法中做的。
第二步:org.springframework.web.bind.annotation.support.HandlerMethodInvoker#invokeHandlerMethod
Object[] args = resolveHandlerArguments(handlerMethodToInvoke, handler, webRequest, implicitModel);
第三步:org.springframework.web.bind.annotation.support.HandlerMethodInvoker#resolveHandlerArguments
doBind(binder, webRequest, validate, validationHints, !assignBindingResult);// 这里进行的绑定
第四步:org.springframework.web.bind.ServletRequestDataBinder#bind
doBind(mpvs);
第五步:org.springframework.validation.DataBinder#doBind
this.applyPropertyValues(mpvs);
最终发现,是在 DataBinder 这个类的 doBind() 方法中进行的绑定。在翻源码的过程中,发现 resolveHandlerArguments() 方法值得大家看一看,不论水平高低,
其实真正解决 SpringMVC 参数问题就是在这个方法中解决的。
总结一下:Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。
二、SpringMVC 解决 Servlet 资源获取问题
1. SpringMVC 使用 Servlet 资源作为方法的入参来解决 Servlet 资源获取问题。
2.可以作为入参的 Servlet 资源有:HttpServletRequest、HttpServletResponse、HttpSession、Locale、InputStream、OutputStream、Reader、Writer
3.例子:
使用 HttpServletRequest 作为入参
请求:<a href="testServletAPI">test servlet api</a>
handler 方法:
控制台输出:
sessionId:E369037AF3DC276BA78539F0AF5C044B
其他的 Servlet 资源这里就不在赘述。
三、总结
SpringMVC 使用 @PathVariable 来获取 @RequestMapping 中占位符的值,为 REST 风格的程序的编写提供了支持。使用 @RequestParam 能接收绝大部分请求参数,同时提供了类型
转换这种扩展。使用 @RequestHeader 来映射请求头信息。使用 @CookieValue 来映射 http cookie 信息。同时还支持模型的注入。也可以获取到原生的 servlet 资源。即在目标的方法处,
我们可以获取到任何我们想要的资源,SpringMVC 对这个过程进行了简化,使开发更加便捷,灵活。
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="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:
/** * @author solverpeng * @create 2016-08-04-9:43 */ public class Address { private String addressName; public String getAddressName() { return addressName; } public void setAddressName(String addressName) { this.addressName = addressName; } @Override public String toString() { return "Address{" + "addressName='" + addressName + '\'' + '}'; } }
Address
请求:同样包含 get 请求 和 post 请求
<a href="testBeanCascade?empName=jack&address.addressName=beijing">test bean cascade</a> <form action="testBeanCascade" method="post"> <label> empName:<input type="text" name="empName"/> </label> <label> Address:<input type="text" name="address.addressName"/> </label> <input type="submit" value="submit"/> </form>
handler 方法:
@RequestMapping("/testBeanCascade") public String testBeanCascade(Employee employee) { System.out.println(employee);//Employee{empName='jack', address=Address{addressName='beijing'}} return "success"; }
是如何绑定的呢?翻源码过程如下:
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter#invokeHandlerMethod
ExtendedModelMap implicitModel = new BindingAwareModelMap();
Object result = methodInvoker.invokeHandlerMethod(handlerMethod, handler, webRequest, implicitModel);
第一步:发现在 result 中已经包含了注入的 bean。所以注入是在methodInvoker.invokeHandlerMethod() 方法中做的。
第二步:org.springframework.web.bind.annotation.support.HandlerMethodInvoker#invokeHandlerMethod
Object[] args = resolveHandlerArguments(handlerMethodToInvoke, handler, webRequest, implicitModel);
第三步:org.springframework.web.bind.annotation.support.HandlerMethodInvoker#resolveHandlerArguments
doBind(binder, webRequest, validate, validationHints, !assignBindingResult);// 这里进行的绑定
第四步:org.springframework.web.bind.ServletRequestDataBinder#bind
doBind(mpvs);
第五步:org.springframework.validation.DataBinder#doBind
this.applyPropertyValues(mpvs);
最终发现,是在 DataBinder 这个类的 doBind() 方法中进行的绑定。在翻源码的过程中,发现 resolveHandlerArguments() 方法值得大家看一看,不论水平高低,
其实真正解决 SpringMVC 参数问题就是在这个方法中解决的。
总结一下:Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。
二、SpringMVC 解决 Servlet 资源获取问题
1. SpringMVC 使用 Servlet 资源作为方法的入参来解决 Servlet 资源获取问题。
2.可以作为入参的 Servlet 资源有:HttpServletRequest、HttpServletResponse、HttpSession、Locale、InputStream、OutputStream、Reader、Writer
3.例子:
使用 HttpServletRequest 作为入参
请求:<a href="testServletAPI">test servlet api</a>
handler 方法:
@RequestMapping("/testServletAPI") public String testServletAPI(HttpServletRequest request) { String id = request.getSession().getId(); System.out.println("sessionId:" + id); return "success"; }
控制台输出:
sessionId:E369037AF3DC276BA78539F0AF5C044B
其他的 Servlet 资源这里就不在赘述。
三、总结
SpringMVC 使用 @PathVariable 来获取 @RequestMapping 中占位符的值,为 REST 风格的程序的编写提供了支持。使用 @RequestParam 能接收绝大部分请求参数,同时提供了类型
转换这种扩展。使用 @RequestHeader 来映射请求头信息。使用 @CookieValue 来映射 http cookie 信息。同时还支持模型的注入。也可以获取到原生的 servlet 资源。即在目标的方法处,
我们可以获取到任何我们想要的资源,SpringMVC 对这个过程进行了简化,使开发更加便捷,灵活。
相关文章推荐
- springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题
- springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题
- springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题
- SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题
- SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题
- Servlet(19)web.xml 配置之Servlet参数配置和读取资源文件,获取文件全路径
- OS开发之AFNetworking-解决Servlet用request.getParameter("")无法获取到post参数的问题
- SpringMVC无法获取请求中的参数的问题的调查与解决(1)
- SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题
- (18)servletContext应用:获取web应用的初始化参数、实现servlet转发、利用servletContext对象读取资源文件
- springMVC参数的传递方式(1.通过@PathVariabl获取路径参数,2.@ModelAttribute获取数据,3.HttpServletRequest取参,4@RequestParam)
- springmvc(基础五) Spring3 mvc 获取请求参数的几种方式
- SpringMVC获取静态资源的问题
- SpringMVC 请求路径结尾存在.使用@PathVariable访问路径内容,路径参数获取不准确的问题
- springMVC下ajax获取后台参数直接走错误或者报406错误问题解决
- SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题
- SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题
- Servlet开发-线程安全,路径问题,利用类装载器获取资源,大文件搬运,I/O流,servlet的转发
- SpringMVC 解决Controller里获取请求参数出现中文乱码问题
- SpringMVC 使用uploadify插件上传文件,post方法无法直接获取参数问题