java培训-SpringMVC数据绑定的扩展

上传人:wuxin****2020 文档编号:132564297 上传时间:2022-08-08 格式:DOCX 页数:5 大小:17.23KB
收藏 版权申诉 举报 下载
java培训-SpringMVC数据绑定的扩展_第1页
第1页 / 共5页
java培训-SpringMVC数据绑定的扩展_第2页
第2页 / 共5页
java培训-SpringMVC数据绑定的扩展_第3页
第3页 / 共5页
资源描述:

《java培训-SpringMVC数据绑定的扩展》由会员分享,可在线阅读,更多相关《java培训-SpringMVC数据绑定的扩展(5页珍藏版)》请在装配图网上搜索。

1、Spring MVC数据绑定的扩展Spring MVC经过三个版本,功能已经改进和完善了很多。尤其是2.5以来采用的Annotation的参数绑定,极大的方便了开发,3.0对其进行更进一步的完善。Spring MVC经过三个版本,功能已经改进和完善了很多。尤其是2.5以来采用的Annotation的参数绑定,极大的方便了开发,3.0对其进行更进一步的完善。对于一些特殊的前台框架,传到后台的不是普通的request中的参数,而是request流中的xml格式,这时就不能采用SpringMVC自带的参数绑定方法。这时候考虑是否能扩展一下。SpringMVC默认使用的是AnnotationMetho

2、dHandlerAdapter.java,可以修改这个类来实现扩展。关键位置在如下方法中:1. otectedModelAndViewinvokeHandlerMethod(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException2. 3. ServletHandlerMethodResolvermethodResolver=getMethodResolver(handler);4. 5. MethodhandlerMethod=methodResolver.resolveHandle

3、rMethod(request);6. 7. ServletHandlerMethodInvokermethodInvoker=newServletHandlerMethodInvoker(methodResolver);8. 9. ServletWebRequestwebRequest=newServletWebRequest(request,response);10. 11. ExtendedModelMapimplicitModel=newBindingAwareModelMap();12. 13. Objectresult=methodInvoker.invokeHandlerMeth

4、od(handlerMethod,handler,webRequest,implicitModel);14. 15. ModelAndViewmav=methodInvoker.getModelAndView(handlerMethod,handler.getClass(),result,implicitModel,webRequest);methodInvoker.updateModelAttributes(handler,(mav!=null?mav.getModel():null),implicitModel,webRequest);16. 17. returnmav;18. 蓝色位置是

5、关键点,ServletHandlerMethodInvoker.java是内部类,继承自HandlerMethodInvoker.java,invokeHandlerMethod方法需要扩展,继续跟踪这个方法,发现是HandlerMethodInvoker.java这个类的方法,这个方法中的关键方法是resolveHandlerArguments(),关键部分如下:1. if(RequestParam.class.isInstance(paramAnn)2. RequestParamrequestParam=(RequestParam)paramAnn;3. paramName=request

6、Param.value();4. required=requestParam.required();5. defaultValue=parseDefaultValueAttribute(requestParam.defaultValue();6. annotationsFound+;7. 8. elseif(RequestHeader.class.isInstance(paramAnn)9. RequestHeaderrequestHeader=(RequestHeader)paramAnn;10. headerName=requestHeader.value();11. required=r

7、equestHeader.required();12. defaultValue=parseDefaultValueAttribute(requestHeader.defaultValue();13. annotationsFound+;14. 到此扩展的话需要添加自己的类型,如RequestParamExt,添加在后面,模仿如下:1. elseif(RequestParamExt.class.isInstance(paramAnn)2. RequestParamExtrequestParam=(RequestParamExt)paramAnn;3. paramName=requestPara

8、m.value();4. defaultValue=parseDefaultValueAttribute(requestParam.defaultValue();5. miType=requestParam.type();6. annotationsFound+;7. 在1. elseif(paramName!=null)2. argsi=resolveRequestParam(paramName,required,defaultValue,methodParam,webRequest,handler);3. 这个方法上面添加扩展逻辑:1. if(!(miType)2. if(null=pla

9、tformRequest)3. HttpServletRequestrequest=webRequest.getNativeRequest(HttpServletRequest.class);4. platformRequest=newPlatformRequest(HttpServletRequest)request,utf-8);5. platformRequest.receiveData();6. 7. if(miType)8. argsi=platformRequest;9. 10. elseif(miType)11. argsi=resolveRequestStrParamExt(p

10、latformRequest,methodParam);12. else13. argsi=resolveRequestParamExt(miType,platformRequest,paramName,defaultValue,methodParam,webRequest,handler);14. 15. 两个resolveRequest*Ext方法如下:1. protectedObjectresolveRequestStrParamExt(PlatformRequestplatformRequest,MethodParametermethodParam)2. VariableListinV

11、l=platformRequest.getVariableList();3. StringparaName=methodParam.getParameterName();4. returninVl.getValueAsObject(paraName);5. 6. protectedObjectresolveRequestParamExt(StringmiType,PlatformRequestplatformRequest,StringparamName,7. StringdefaultValue,MethodParametermethodParam,NativeWebRequestwebRe

12、quest,Objecthandler)throwsException8. if(StringUtils.isBlank(paramName)9. paramName=defaultValue;10. 11. ClassparamType=methodParam.getParameterType();12. DatasetListinDl=platformRequest.getDatasetList();13. VariableListinVl=platformRequest.getVariableList();14. if(miType)/绑定的关键过程15. Datasetds=inDl.

13、getDataset(paramName);16. Objectvo=paramType.newInstance();17. MiPDataBinderdataBinder=newMiPDataBinder(vo,false);18. dataBinder.bind(inVl);19. returndataBinder.getTarget();20. 21. 同时还需要一个annotation的定义:示例如下:1. package;2. import;3. import;4. import;5. import;6. import;7. Target(ElementType.PARAMETER)

14、8. Retention(RetentionPolicy.RUNTIME)9. Documented10. publicinterfaceRequestParamExt11. publicstaticfinalStringTYPE_NONE=none;12. publicstaticfinalStringTYPE_DS=ds;13. publicstaticfinalStringTYPE_VL=vl;14. publicstaticfinalStringTYPE_STR=string;15. Stringtype()defaultTYPE_NONE;16. Stringvalue()defau

15、lt;17. StringdefaultValue()defaultds;18. 最后是修改Spring配置:1. 2. 到此就实现了自定义格式的数据绑定。对于特定格式的输出,如果需要自定义的话,同样需要修改AnnotationMethodHandlerAdapterExt.java这个类,关键位置在getModelAndView()方法。在如下位置:1. elseif(AnnotationUtils.findAnnotation(handlerMethod,ResponseBody.class)!=null)2. handleResponseBody(returnValue,webReque

16、st);3. returnnull;4. 添加自己的扩展方法:1. elseif(AnnotationUtils.findAnnotation(handlerMethod,ResponseBodyExt.class)!=null)2. ResponseBodyExtbodyMi=AnnotationUtils.findAnnotation(handlerMethod,ResponseBodyExt.class);3. handleResponseBodyExt(returnValue,webRequest,bodyMi);4. returnnull;5. 定义handleResponseBod

17、yExt方法:1. privatevoidhandleResponseBodyExt(ObjectreturnValue,ServletWebRequestwebRequest,ResponseBodyMIbodyMi)throwsException2. HttpServletResponseservletResponse=(HttpServletResponse)webRequest.getNativeResponse();3. writeWithExtConverters(returnValue,servletResponse,bodyMi);4. writeWithExtConverte

18、rs()方法如下:1. privatevoidwriteWithExtConverters(ObjectreturnValue,HttpServletResponseresponse,ResponseBodyMIbodyMi)throwsException2. convertToXML(.);3. ;使用方式如下:1. RequestMapping(value=/getContractList)2. ResponseBodyExt(isCheck=true,resultType=sql,sqlColumns=ID,TUREID)3. 4. publicPagegetContractList(RequestParamExt(value=ds_search,type=ds)Contractcp)throwsException5. Pagepage=method1();6. returnpage;7. 原文链接:中软卓越

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!