五、Spring MVC实用POJO进行参数传值
前面已经说了,spring mvc可以通过@PathVariable可以把url中的值映射到目标方法的参数上,也可以使用@RequestParam进行单个参数的传递,如果一次需要传递多个参数的话,就需要写多个相应的注解,那有没有什么更简单方便的方法呢?答案是有的,spring mvc有自动装箱的功能,可以通过参数的name属性,给后台绑定的对象的对应的属性完成赋值操作,而且还支持级联操作,即支持嵌套。
1、使用POJO(Plain Old Java Object)进行参数传值
下面来看一下具体例子,定义一个User对象,一个Address对象:
publicclassUser{privateStringuserName;privateStringpassword;privateStringemail;privateintage;privateAddressaddress;//省略get和set方法以及toString方法……}
publicclassAddress{privateStringprovince;privateStringcity;//省略get和set方法以及toString方法}
Controller的定义如下:
/***springmvc可以进行自动"装箱",会按照请求参数的name完成和pojo属性之间的映射绑定,*自动为该对象填充属性值,并且支持级联属性**@paramuser*@return*/@RequestMapping("/testPojo")publicStringtestPojo(Useruser){System.out.println(user);return"greeting";}
测试代码如下,有User对象的属性,有级联属性Address:
<formaction="/testPojo/testPojo"method="post"><p>pojo测试,可以直接传递参数绑定到pojo对象上</p>userName:<inputtype="text"name="userName"/><br/>password:<inputtype="text"name="password"/><br/>email:<inputtype="text"name="email"/><br/>age:<inputtype="text"name="age"/><br/>province:<inputtype="text"name="address.province"/><br/>city:<inputtype="text"name="address.city"/><br/><inputtype="submit"value="submit"/></form>
2、使用Servlet原生API进行参数传值
spring mvc支持使用ServletRequest和ServletResponse等作为目标方法的参数。spring mvc支持的类型有以下几种ServletRequest、ServletResponse、HttpSession、Pricipal、Locale、InputStream、OutputStream、Reader、Writer,具体可以参见源码:
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
@OverrideprotectedObjectresolveStandardArgument(Class<?>parameterType,NativeWebRequestwebRequest)throwsException{HttpServletRequestrequest=webRequest.getNativeRequest(HttpServletRequest.class);HttpServletResponseresponse=webRequest.getNativeResponse(HttpServletResponse.class);if(ServletRequest.class.isAssignableFrom(parameterType)||MultipartRequest.class.isAssignableFrom(parameterType)){ObjectnativeRequest=webRequest.getNativeRequest(parameterType);if(nativeRequest==null){thrownewIllegalStateException("Currentrequestisnotoftype["+parameterType.getName()+"]:"+request);}returnnativeRequest;}elseif(ServletResponse.class.isAssignableFrom(parameterType)){this.responseArgumentUsed=true;ObjectnativeResponse=webRequest.getNativeResponse(parameterType);if(nativeResponse==null){thrownewIllegalStateException("Currentresponseisnotoftype["+parameterType.getName()+"]:"+response);}returnnativeResponse;}elseif(HttpSession.class.isAssignableFrom(parameterType)){returnrequest.getSession();}elseif(Principal.class.isAssignableFrom(parameterType)){returnrequest.getUserPrincipal();}elseif(Locale.class==parameterType){returnRequestContextUtils.getLocale(request);}elseif(InputStream.class.isAssignableFrom(parameterType)){returnrequest.getInputStream();}elseif(Reader.class.isAssignableFrom(parameterType)){returnrequest.getReader();}elseif(OutputStream.class.isAssignableFrom(parameterType)){this.responseArgumentUsed=true;returnresponse.getOutputStream();}elseif(Writer.class.isAssignableFrom(parameterType)){this.responseArgumentUsed=true;returnresponse.getWriter();}returnsuper.resolveStandardArgument(parameterType,webRequest);}
项目源代码:
https://git.oschina.net/acesdream/spring-mvc
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。