`
qqchinaok
  • 浏览: 217449 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Spring MVC 数据绑定的扩展

阅读更多


Spring MVC 数据绑定的扩展

Spring MVC经过三个版本,功能已经改进和完善了很多。尤其是2.5以来采用的Annotation的参数绑定,极大的方便了开发,3.0对其进行更进一步的完善。对于一些特殊的前台框架,传到后台的不是普通的request中的参数,而是request流中的xml格式,这时就不能采用SpringMVC自带的参数绑定方法。这时候考虑是否能扩展一下。SpringMVC默认使用的是AnnotationMethodHandlerAdapter.java,可以修改这个类来实现扩展。关键位置在如下方法中:protected 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;&#64;Target(ElementType.PARAMETER)&#64;Retention(RetentionPolicy.RUNTIME)&#64;Documentedpublic &#64;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配置:<bean class="com.company.springext.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapterExt">  </bean>  到此就实现了自定义格式的数据绑定。对于特定格式的输出,如果需要自定义的话,同样需要修改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(...);        };使用方式如下:    &#64;RequestMapping(value="/getContractList")    &#64;ResponseBodyExt(isCheck=true, resultType="sql", sqlColumns="ID,TUREID")     public Page<Contract> getContractList(&#64;RequestParamExt(value = "ds_search", type = "ds") Contract cp) throws Exception { Page<Contract> page = method1(); return page; }QQ:24889356

0
2
分享到:
评论

相关推荐

    spring MVC数据绑定大全

    Spring MVC 是一个强大的Java Web开发框架,用于构建...对于从Struts2转向Spring MVC的开发者来说,虽然初始学习曲线可能稍陡,但深入理解和实践后,你会发现Spring MVC在数据绑定上的便利性和可扩展性是其独特的优势。

    Spring MVC 4.2.3

    5. **数据绑定和验证**:Spring MVC提供强大的数据绑定功能,将HTTP请求参数自动映射到处理方法的参数,并支持JSR-303/JSR-349 Bean Validation标准进行数据验证。 6. **异常处理**:通过定义全局异常处理器,可以...

    Mastering Spring MVC 4(2015.09)源码

    Spring MVC 是一个强大的Java Web开发框架,它是Spring框架的一部分,专为构建高度可扩展和模块化的Web应用程序而设计。在2015年的版本中,Spring MVC 4已经相当成熟,提供了许多特性来简化开发流程并提高开发效率。...

    spring mvc jar包

    以上这些库构成了 Spring MVC 开发的基础环境,开发者可以利用它们来创建控制器、定义模型、配置视图解析器,以及实现事务管理、数据访问等复杂功能。通过 Spring MVC,开发者能够以声明式的方式组织应用程序,提高...

    spring mvc mybatis 整合源码,带数据库脚本,带详细注释

    - 在Spring MVC的Controller中,通过@Autowired注入Mapper接口,调用其方法进行数据操作。 4. **数据库脚本** - 提供的数据库脚本通常包含创建表、插入初始数据等内容,是项目启动前必要的准备工作。 - 使用...

    精通Spring MVC4

    Spring MVC支持自动的数据绑定,将请求参数自动映射到Controller方法的参数上。同时,使用JSR-303/JSR-349提供的注解可以进行数据验证,如@NotNull、@Size等。 9. **上传下载** 使用MultipartFile处理文件上传,...

    Spring mvc5.0.3 所有jar包

    在Spring MVC中,可以用于视图解析、数据绑定等方面。 14. **MessageConverter**: Spring MVC使用MessageConverter处理HTTP请求和响应的转换,支持JSON、XML等多种格式。 15. **模板引擎**: Spring MVC支持多种...

    开发Spring MVC应用程序补充—程序源码下载.rar_spring_spring mvc_spring mvc 源码_sp

    Spring MVC源码的深入理解有助于开发者更好地掌握框架的工作原理,优化代码性能,甚至为自定义扩展提供基础。 压缩包内的文件"www.pudn.com.txt"可能是一个链接或说明文档,指向更多关于该主题的资源,例如在pudn....

    spring、 spring mvc、 mybatis 开发的java客户关系管理系统,前端采用easyui编写.zip

    在CRM系统中,Spring MVC负责处理HTTP请求,将数据绑定到模型对象,调用业务逻辑,最后将结果呈现给用户。它的分层设计使得系统更易于测试和扩展。 3. MyBatis:MyBatis是一个持久层框架,它简化了SQL操作,将SQL...

    Spring MVC学习框架

    8. **数据绑定与验证**:Spring MVC 提供了数据绑定功能,可以自动将请求参数映射到 Controller 方法的参数。同时,通过 @Valid 和 Validation API 可以实现数据校验。 9. **拦截器(Interceptor)**:拦截器可以在...

    Spring MVC框架简介和使用

    Spring MVC 提供了一种结构化的开发方式,旨在简化 Web 层的开发过程,同时提供了高度灵活性和扩展性。 #### Spring MVC 的核心功能: - **简化 Web 层开发**:通过提供一系列简洁易用的接口和工具,Spring MVC ...

    Spring mvc整合mybatis例子

    整合Spring MVC和MyBatis的好处在于,Spring MVC提供了强大的MVC架构支持,MyBatis则提供了灵活的SQL操作,两者结合能够实现松耦合的Web应用,便于维护和扩展。 7. **最佳实践** - 使用@Autowired注解进行依赖...

    spring mvc集成webservice

    Spring MVC 是一个强大的Java Web开发框架,用于构建可维护、...通过理解Spring MVC的MVC模式,掌握Web服务的基本原理,以及学习如何在Spring环境中配置和调用Web服务,开发者可以构建更加灵活和可扩展的Web应用程序。

    spring mvc+ibats实例

    总之,这个实例覆盖了Spring MVC作为Web应用框架、iBatis作为数据访问层以及Maven作为构建工具的关键知识,提供了一个清晰、实用的参考案例。通过学习和实践这个实例,开发者可以提升自己的Java Web开发技能。

    Spring MVC 学习记录总结1

    Spring MVC 是一个广泛使用的 Java Web 开发框架,它实现了MVC(Model-View-Controller)设计模式,使得开发者可以更高效地构建可维护且松耦合的Web应用程序。在这个学习记录总结中,我们将深入理解Spring MVC的核心...

    Spring MVC框架的各种依赖包下载

    4. **Spring Web Flow**(可选):这是一个扩展Spring MVC的功能,用于管理复杂用户界面的流程。如果你的应用需要处理多步骤表单或者复杂的用户交互,这个模块可能会很有用。 5. **JSTL(JavaServer Pages Standard...

    Spring MVC Helloword代码

    这个简单的Spring MVC HelloWorld示例展示了框架的基础用法,包括请求映射、模型绑定和视图呈现。随着你对Spring MVC的深入学习,你可以了解到更多高级特性,如数据验证、国际化、异常处理、Ajax支持、RESTful API...

Global site tag (gtag.js) - Google Analytics