日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SpringMVC數(shù)據(jù)綁定的擴(kuò)展

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

漳縣網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)建站成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站

SpringMVC默認(rèn)使用的是AnnotationMethodHandlerAdapter.java,可以修改這個(gè)類來實(shí)現(xiàn)擴(kuò)展。關(guān)鍵位置在如下方法中:

 
 
 
  1. otected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
  2.  
  3.      ServletHandlerMethodResolver methodResolver= getMethodResolver(handler); 
  4.  
  5.      Method handlerMethod = methodResolver.resolveHandlerMethod(request); 
  6.  
  7.      ServletHandlerMethodInvoker methodInvoker=new ServletHandlerMethodInvoker(methodResolver); 
  8.  
  9.      ServletWebRequest webRequest = new ServletWebRequest(request, response); 
  10.  
  11.      ExtendedModelMap implicitModel = new BindingAwareModelMap(); 
  12.  
  13.      Object result=methodInvoker.invokeHandlerMethod(handlerMethod,handler,webRequest, implicitModel); 
  14.  
  15.      ModelAndView mav=methodInvoker.getModelAndView(handlerMethod,handler.getClass(),result, implicitModel, webRequest);    methodInvoker.updateModelAttributes(handler,(mav!=null?mav.getModel():null),implicitModel,webRequest); 
  16.  
  17.      return mav; 
  18.     } 

藍(lán)色位置是關(guān)鍵點(diǎn),ServletHandlerMethodInvoker.java是內(nèi)部類,繼承自HandlerMethodInvoker.java,invokeHandlerMethod方法需要擴(kuò)展,繼續(xù)跟蹤這個(gè)方法,發(fā)現(xiàn)是HandlerMethodInvoker.java這個(gè)類的方法,這個(gè)方法中的關(guān)鍵方法是resolveHandlerArguments(),關(guān)鍵部分如下:

 
 
 
  1. if (RequestParam.class.isInstance(paramAnn)) { 
  2. RequestParam requestParam = (RequestParam) paramAnn; 
  3. paramName = requestParam.value(); 
  4. required = requestParam.required(); 
  5. defaultValue = parseDefaultValueAttribute(requestParam.defaultValue()); 
  6. annotationsFound++; 
  7. else if (RequestHeader.class.isInstance(paramAnn)) { 
  8. RequestHeader requestHeader = (RequestHeader) paramAnn; 
  9. headerName = requestHeader.value(); 
  10. required = requestHeader.required(); 
  11. defaultValue = parseDefaultValueAttribute(requestHeader.defaultValue()); 
  12. annotationsFound++; 

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

 
 
 
  1. else if (RequestParamExt.class.isInstance(paramAnn)) { 
  2. RequestParamExtrequestParam = (RequestParamExt) paramAnn; 
  3. paramName = requestParam.value(); 
  4. defaultValue = parseDefaultValueAttribute(requestParam.defaultValue()); 
  5. miType = requestParam.type(); 
  6. annotationsFound++; 

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

這個(gè)方法上面添加擴(kuò)展邏輯:

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

兩個(gè)resolveRequest*Ext方法如下:

 
 
 
  1. protected Object resolveRequestStrParamExt(PlatformRequest platformRequest, MethodParameter methodParam){ 
  2. VariableList inVl = platformRequest.getVariableList(); 
  3. String paraName = methodParam.getParameterName(); 
  4. return inVl.getValueAsObject(paraName); 
  5. protected Object resolveRequestParamExt(String miType,PlatformRequest platformRequest, String paramName,  
  6. String defaultValue,MethodParameter methodParam,NativeWebRequest webRequest, Object handler)throws Exception{ 
  7. if(StringUtils.isBlank(paramName)){ 
  8. paramName = defaultValue; 
  9. Class paramType = methodParam.getParameterType(); 
  10. DatasetList inDl = platformRequest.getDatasetList(); 
  11. VariableList inVl = platformRequest.getVariableList(); 
  12. if(RequestParamExt.TYPE_DS.equals(miType)){//綁定的關(guān)鍵過程 
  13. Dataset ds = inDl.getDataset(paramName); 
  14. Object vo = paramType.newInstance(); 
  15. MiPDataBinder dataBinder = new MiPDataBinder(vo, false); 
  16.     dataBinder.bind(inVl); 
  17.     return dataBinder.getTarget(); 

同時(shí)還需要一個(gè)annotation的定義:示例如下:

 
 
 
  1. package com.company.springext.web.bind.annotation; 
  2. import java.lang.annotation.Documented; 
  3. import java.lang.annotation.ElementType; 
  4. import java.lang.annotation.Retention; 
  5. import java.lang.annotation.RetentionPolicy; 
  6. import java.lang.annotation.Target; 
  7. @Target(ElementType.PARAMETER) 
  8. @Retention(RetentionPolicy.RUNTIME) 
  9. @Documented 
  10. public @interface RequestParamExt { 
  11.     public static final String TYPE_NONE            = "none"; 
  12.     public static final String TYPE_DS              = "ds"; 
  13.     public static final String TYPE_VL              = "vl"; 
  14.     public static final String TYPE_STR             = "string";    
  15. String type() default TYPE_NONE;  
  16. String value() default "";     
  17. String defaultValue() default "ds"; 

***是修改Spring配置:

 
 
 
  1.      
  2.    

到此就實(shí)現(xiàn)了自定義格式的數(shù)據(jù)綁定。

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

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

添加自己的擴(kuò)展方法:

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

定義handleResponseBodyExt方法:

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

writeWithExtConverters()方法如下:

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

使用方式如下:

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

原文鏈接:http://www.blogjava.net/ghostzhang/archive/2011/09/12/358486.html


當(dāng)前名稱:SpringMVC數(shù)據(jù)綁定的擴(kuò)展
網(wǎng)頁鏈接:http://m.5511xx.com/article/djhejoh.html