国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Spring MVC數據綁定的擴展

開發 后端
Spring MVC經過三個版本,功能已經改進和完善了很多。尤其是2.5以來采用的Annotation的參數綁定,極大的方便了開發,3.0對其進行更進一步的完善。

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

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

  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.     } 

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

  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++; 

到此擴展的話需要添加自己的類型,如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); 

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

  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); 

兩個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)){//綁定的關鍵過程 
  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(); 

同時還需要一個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. <bean class="com.company.springext.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapterExt">     
  2. </bean>   

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

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

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

添加自己的擴展方法:

  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<Contract> getContractList(@RequestParamExt(value = "ds_search", type = "ds") Contract cp) throws Exception { 
  5. Page<Contract> page = method1(); 
  6. return page; 

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

【編輯推薦】

  1. Spring事務配置的五種方式
  2. Spring聲明性事務常見問題分析
  3. 深入淺出Java三大框架SSH與MVC的設計模式
  4. Spring MVC攔截器實現分析
  5. 用Spring讓Java Mail支持簡化郵件發送
責任編輯:林師授 來源: GhostZhang的博客
相關推薦

2021-11-02 19:14:58

Spring數據

2024-02-01 08:28:28

2012-06-17 20:19:29

2021-09-01 10:37:25

鴻蒙HarmonyOS應用

2022-05-30 09:32:07

Spring容器

2009-06-19 11:28:45

2009-06-19 11:43:59

Spring MVC框

2023-09-04 11:52:53

SpringMVC性能

2011-08-29 09:48:30

springMVC

2021-10-30 18:56:12

Spring工作框架

2009-06-24 16:01:28

Spring MVC

2023-09-28 08:49:41

springBean

2021-09-01 14:36:14

鴻蒙HarmonyOS應用

2023-11-02 18:01:24

SpringMVC配置

2011-12-08 09:01:59

JavaSpring

2011-05-24 09:22:44

Spring3異常處理

2023-07-10 08:00:13

架構Rest返回值

2009-06-11 10:37:58

netbeans spMVC基礎

2009-06-22 11:54:28

Spring MVCSpringframe

2009-12-01 09:30:34

ASP.NET MVC
點贊
收藏

51CTO技術棧公眾號

日韩视频在线观看一区二区| 极品美女销魂一区二区三区免费| 三级成人黄色影院| 白白色视频在线| 999在线免费视频| 日韩高清在线播放| 97免费资源站| 国产999精品久久久影片官网| 在线日韩第一页| 九九久久精品一区| 午夜精品福利久久久| 国产成人精品免费视频大全最热| 制服诱惑亚洲| 婷婷综合另类小说色区| 日本www在线视频| 免费人成黄页网站在线一区二区 | 亚洲观看高清完整版在线观看| 欧美另类videos| 成人h动漫精品一区二区| 国产欧美日韩专区发布| 一个色免费成人影院| 亚洲男人天堂网站| 麻豆免费在线| 亚洲欧洲99久久| 992tv在线观看在线播放| 8x8x华人在线| 日韩电影一二三区| 久久香蕉国产线看观看av| free性护士videos欧美| 亚洲色图欧洲色图| 激情视频国产| 国产不卡一区视频| 欧美精品一区二区三区在线四季| 韩国在线一区| 亚洲欧洲精品在线| 欧美日韩国产欧| 日本精品二区| 东方aⅴ免费观看久久av| 日韩av电影免费观看| 日本女人一区二区三区| 中文字幕一区二区三区5566| 亚洲激情综合| 久久免费一区| 美女性感视频久久| 污版视频在线观看| 狠狠爱在线视频一区| 中文字幕资源网在线观看| 色老头一区二区三区| 国产另类在线| 国产精品久久久久久久久久东京| 亚洲天堂偷拍| 精品无人区一区二区三区竹菊 | 日韩午夜小视频| 日韩在线亚洲| 91动漫在线看| 天堂在线中文字幕| 国产精品国产三级国产普通话蜜臀| 日韩中文字幕三区| 91亚洲国产成人精品一区二区三| 五月天男人天堂| 久久久99精品免费观看| 日本在线天堂| 成人黄色av网站| 91女神在线视频| 国内高清免费在线视频| 国产成人免费电影| 亚洲h在线观看| 欧美一站二站| 欧美精品成人网| 欧美成人一区二区三区片免费| 日韩电影免费在线观看| wwwav91| 欧美高跟鞋交xxxxxhd| 极品销魂美女一区二区三区| 超碰免费在线观看| 成人做爰www免费看视频网站| 亚洲欧美自拍偷拍| 理论片一区二区在线| 妞干网在线视频观看| 午夜欧美在线一二页| 天堂99x99es久久精品免费| 国产一级二级三级精品| 色综合 综合色| 国产精品黑丝在线播放| 国产二区三区四区| 国产成人亚洲综合青青| 亚洲一二三四在线| 国产精品3区| 日本三级免费网站| 精品自在线视频| 中文字幕中文在线不卡住| 91精品尤物| 伦理片一区二区三区| 成人免费看片网址| 欧美一级爆毛片| 中文字幕av一区二区三区| 91高清在线观看视频| 裸体女人亚洲精品一区| 欧美少妇激情| 色香阁99久久精品久久久| 久久综合久久鬼色| 高清一区二区中文字幕| 亚洲欧美在线精品| 亚洲精品欧美极品| 欧美日韩亚洲成人| 日韩国产高清在线| 国产精品3区| wwwxxx在线观看| 国产精品视频网站在线观看| 97国产精品免费视频| 色94色欧美sute亚洲线路一ni| 国产在线精品不卡| 成人午夜网址| 午夜神马福利影院| 欧美精品一区二区三区四区五区 | 国产精品一区在线观看乱码| 香蕉久久夜色精品国产使用方法 | 一区二区高清在线| 国产精品女主播一区二区三区| 成人亚洲精品| 免费在线观看av| 一级片a一级片| 依人在线免费视频| 国产自产在线视频| 精品日本一区二区三区| 视频在线一区二区| 日韩欧美国产三级电影视频| 亚洲一区二区三区影院| 国产一区二区精品久久99| 午夜久久一区| 国产精品久久久久久久免费观看| 丝袜老师在线| 在线观看午夜看亚太视频| 亚洲中文字幕无码一区二区三区| 91亚洲国产成人久久精品网站 | 性色av一区| 1024欧美极品| 色综合天天色综合| 亚洲三区在线观看| 国产视频精品网| 久久乐国产精品| 国产亚洲精品久久久久久| 这里是久久伊人| 亚洲一区二区在线观看视频 | 国产激情欧美| 亚洲欧美日韩综合一区| 亚洲欧洲成人自拍| 成人永久在线| 这里只有精品66| 欧美日韩在线视频一区| 国产免费久久| 在线观看免费网站| 国产成人涩涩涩视频在线观看| 精品一区二区三区香蕉蜜桃 | 成人久久网站| 丁香六月综合| 日本午夜大片a在线观看| 忘忧草在线www成人影院| 日韩国产网站| 亚洲精品一线| 久久er99热精品一区二区三区| 欧美一区二区三级| 精品国产一级| 日本一区二区在线| 亚洲韩国欧洲国产日产av| 久久精品一区二区三区四区| 91在线你懂得| 亚洲一二三四在线| 日韩精品一区二区在线| 日韩一级黄色av| 国产精品免费久久久| 国产欧美日韩视频一区二区三区| 涩涩涩999| 国产主播在线看| 福利在线播放| 狠狠久久伊人中文字幕| 91精品精品| 久久婷婷综合激情| 综合av第一页| 日韩电影大全免费观看2023年上| 2020国产精品视频| 国产又粗又大又爽的视频| 亚洲国产日韩美| 男女视频在线看| 深夜福利视频一区二区| 国产成人一二片| 九九国产精品视频| 亚洲精品高清在线观看| 亚洲精品美女视频| 91高跟黑色丝袜呻吟在线观看| 99色这里只有精品| 91亚洲精选| 欧美先锋影音| 黄色成人av在线| 亚洲性日韩精品一区二区| 国产精品久久久一区| 国产一区二区在线视频播放| 丝袜美腿一区| 韩国一区二区视频| 精品国产一区二区在线观看|