老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

如何進行SpringMVC數據綁定的擴展

這篇文章給大家介紹如何進行Spring MVC數據綁定的擴展,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

創新互聯堅持“要么做到,要么別承諾”的工作理念,服務領域包括:做網站、成都做網站、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的迪慶州網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!

Spring MVC經過三個版本,功能已經改進和完善了很多。尤其是2.5以來采用的Annotation的參數綁定,極大的方便了開發,3.0對其進行更進一步的完善。對于一些特殊的前臺框架,傳到后臺的不是普通的request中的參數,而是request流中的xml格式,這時就不能采用SpringMVC自帶的參數綁定方法。這時候考慮是否能擴展一下。

SpringMVC默認使用的是AnnotationMethodHandlerAdapter.java,可以修改這個類來實現擴展。關鍵位置在如下方法中:

otected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {       ServletHandlerMethodResolver methodResolver= getMethodResolver(handler);       Method handlerMethod = methodResolver.resolveHandlerMethod(request);       ServletHandlerMethodInvoker methodInvoker=new ServletHandlerMethodInvoker(methodResolver);       ServletWebRequest webRequest = new ServletWebRequest(request, response);       ExtendedModelMap implicitModel = new BindingAwareModelMap();       Object result=methodInvoker.invokeHandlerMethod(handlerMethod,handler,webRequest, implicitModel);       ModelAndView mav=methodInvoker.getModelAndView(handlerMethod,handler.getClass(),result, implicitModel, webRequest);    methodInvoker.updateModelAttributes(handler,(mav!=null?mav.getModel():null),implicitModel,webRequest);       return mav;     }

藍色位置是關鍵點,ServletHandlerMethodInvoker.java是內部類,繼承自HandlerMethodInvoker.java,invokeHandlerMethod方法需要擴展,繼續跟蹤這個方法,發現是HandlerMethodInvoker.java這個類的方法,這個方法中的關鍵方法是resolveHandlerArguments(),關鍵部分如下:

if (RequestParam.class.isInstance(paramAnn)) { RequestParam requestParam = (RequestParam) paramAnn; paramName = requestParam.value(); required = requestParam.required(); defaultValue = parseDefaultValueAttribute(requestParam.defaultValue()); annotationsFound++; } else if (RequestHeader.class.isInstance(paramAnn)) { RequestHeader requestHeader = (RequestHeader) paramAnn; headerName = requestHeader.value(); required = requestHeader.required(); defaultValue = parseDefaultValueAttribute(requestHeader.defaultValue()); annotationsFound++; }

到此擴展的話需要添加自己的類型,如RequestParamExt,添加在后面,模仿如下:

else if (RequestParamExt.class.isInstance(paramAnn)) { RequestParamExtrequestParam = (RequestParamExt) paramAnn; paramName = requestParam.value(); defaultValue = parseDefaultValueAttribute(requestParam.defaultValue()); miType = requestParam.type(); annotationsFound++; }

else if (paramName != null) { args[i] = resolveRequestParam(paramName, required, defaultValue, methodParam, webRequest, handler); }

這個方法上面添加擴展邏輯:

if(!RequestParamExt.TYPE_NONE.equals(miType)){ if(null == platformRequest){ HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); platformRequest = new PlatformRequest((HttpServletRequest)request, "utf-8"); platformRequest.receiveData(); } if(RequestParamExt.TYPE_PLATFORMREQUEST.equals(miType)){     args[i] = platformRequest; } else if(RequestParamExt.TYPE_STR.equals(miType)){ args[i] = resolveRequestStrParamExt(platformRequest, methodParam); }else{ args[i] = resolveRequestParamExt(miType,platformRequest,paramName, defaultValue, methodParam, webRequest, handler); } }

兩個resolveRequest*Ext方法如下:

protected Object resolveRequestStrParamExt(PlatformRequest platformRequest, MethodParameter methodParam){ VariableList inVl = platformRequest.getVariableList(); String paraName = methodParam.getParameterName(); return inVl.getValueAsObject(paraName); } protected Object resolveRequestParamExt(String miType,PlatformRequest platformRequest, String paramName,  String defaultValue,MethodParameter methodParam,NativeWebRequest webRequest, Object handler)throws Exception{ if(StringUtils.isBlank(paramName)){ paramName = defaultValue; } Class paramType = methodParam.getParameterType(); DatasetList inDl = platformRequest.getDatasetList(); VariableList inVl = platformRequest.getVariableList(); if(RequestParamExt.TYPE_DS.equals(miType)){//綁定的關鍵過程 Dataset ds = inDl.getDataset(paramName); Object vo = paramType.newInstance(); MiPDataBinder dataBinder = new MiPDataBinder(vo, false);     dataBinder.bind(inVl);     return dataBinder.getTarget(); } }

同時還需要一個annotation的定義:示例如下:

package com.company.springext.web.bind.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestParamExt {     public static final String TYPE_NONE            = "none";     public static final String TYPE_DS              = "ds";     public static final String TYPE_VL              = "vl";     public static final String TYPE_STR             = "string";    String type() default TYPE_NONE;  String value() default "";     String defaultValue() default "ds"; }

***是修改Spring配置:

     

到此就實現了自定義格式的數據綁定。

對于特定格式的輸出,如果需要自定義的話,同樣需要修改AnnotationMethodHandlerAdapterExt.java這個類,關鍵位置在getModelAndView()方法。在如下位置:

} else if (AnnotationUtils.findAnnotation(handlerMethod, ResponseBody.class) != null) {             handleResponseBody(returnValue, webRequest);             return null;         }

添加自己的擴展方法:

else if (AnnotationUtils.findAnnotation(handlerMethod, ResponseBodyExt.class) != null) {                 ResponseBodyExt bodyMi = AnnotationUtils.findAnnotation(handlerMethod, ResponseBodyExt.class);                 handleResponseBodyExt(returnValue, webRequest, bodyMi);                 return null;             }

定義handleResponseBodyExt方法:

private void handleResponseBodyExt(Object returnValue, ServletWebRequest webRequest, ResponseBodyMI bodyMi) throws Exception {            HttpServletResponse servletResponse = (HttpServletResponse) webRequest.getNativeResponse();            writeWithExtConverters(returnValue, servletResponse, bodyMi);        }

writeWithExtConverters()方法如下:

private void writeWithExtConverters(Object returnValue, HttpServletResponse response, ResponseBodyMI bodyMi) throws Exception {                 convertToXML(...);        };

使用方式如下:

@RequestMapping(value="/getContractList") @ResponseBodyExt(isCheck=true, resultType="sql", sqlColumns="ID,TUREID")  public Page getContractList(@RequestParamExt(value = "ds_search", type = "ds") Contract cp) throws Exception { Page page = method1(); return page; }

關于如何進行Spring MVC數據綁定的擴展就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


分享標題:如何進行SpringMVC數據綁定的擴展
網頁地址:http://www.xueling.net.cn/article/igsjps.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 波多野结衣AV全免费观 | 欧美日韩国产高清一区二区 | 国产无限资源在线观看 | 一区二区不卡在线视频 | 人禽杂交18禁网站免费 | 国产yw851.c免费观看网站 | 538国产精品一区二区免费视频 | 91在线视频免费看 | 国产福利社 | 三年片高清在线观看八戒 | 被强到爽的邻居人妻 | 逼逼综合网 | 国产婷婷综合在线视频中文 | 精品国产一区二区三区麻豆 | 国产一级黄色录像片 | 日本黄色免费观看视频 | 色久悠悠婷婷综合在线亚洲 | 免费日韩中文字幕 | 国产亚洲人成无码网在线观看 | 国产偷录视频叫床高潮 | 国产成人久久AV免费高清 | 99国产精品入口 | 粉嫩馒头一线天在线视频 | 琪琪午夜成人理论福利片美容院 | 一本久久a久久精品综合 | 阿娇艳z门照片无码av4i | 成人精品在线视频 | 成年美女黄网站色大免费视频 | 在线亚洲97SE亚洲综合在线 | 天天人人 | 亚洲制服丝无码中文在线 | 丁香花五月·婷婷开心 | 国产精品午夜一区二区 | aa久久 | 国产一级桃视频播放 | 久久在线免费观看视频 | 国产在线不卡精品网站 | 大地资源网高清在线观看 | 日本一区二区三区免费播放视频了 | 国产免费观看AV大片的网站 | 天美传媒精品1区2区3区 |