如何让Spring MVC接收零配置参数要多久的参数可以转换为java对象

9179人阅读
javaweb(68)
springMVC(17)
spring(48)
格式化数据输入输出
Spring3.0的重要接口:HttpMessageConveter为我们提供了强大的数据转换功能,将我们的请求数据转换为一个java对象,或将java对象转化为特定格式输出等。比如我们常见的从前端注册表单获取json数据并转化为User对象,或前端获取用户信息,后端输出User对象转换为json格式传输给前端等。
spring 为我们提供了众多的HttpMessageConveter实现类,其中我们可能用得最多的三个实现类是:
FormHttpMessageConverter
从请求和响应读取/编写表单数据。默认情况下,它读取媒体类型 application/x-www-form-urlencoded 并将数据写入MultiValueMap&String,String&
MarshallingHttpMessageConverter
使用 Spring 的 marshaller/un-marshaller 读取/编写 XML 数据。它转换媒体类型为 application/xml
MappingJacksonHttpMessageConverter
使用 Jackson 的 ObjectMapper 读取/编写 JSON 数据。它转换媒体类型为application/json
转换器的装配方式有两种,一种是通过注册org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter来装配messageConverters,如下所示:
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&
name="messageConverters"&
bean="jsonConverter" /&
id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"&
name="supportedMediaTypes" value="application/json" /&
另一种是启用注解&mvc:annotation-driven /&
该注解会会初始化7个转换器:
- ByteArrayHttpMessageConverter
- StringHttpMessageConverter
- ResourceHttpMessageConverter
- SourceHttpMessageConverter
- XmlAwareFormHttpMessageConverter
- Jaxb2RootElementHttpMessageConverter
- MappingJacksonHttpMessageConverter
通过以上两种方法,我们即可完成我们的转换器注册。
但我们想要在控制层完成数据的输入输出转换,需要通过下列途径:
1. 使用@RequestBody和@ResponseBody对处理方法进行标注。其中@RequestBody通过合适的HttpMessageConverter将HTTP请求正文转换为我们需要的对象内容。而@ResponseBody则将我们的对象内容通过合适的HttpMessageConverter转换后作为HTTP响应的正文输出。
2. 使用HttpEntity、ResponseEntity作为处理方法的入参或返回值
通过以上讲解,我们已经有足够的知识准备,来完成我们的实例:将json数据转换为合适的java对象输入,并将java对象转换为符合格式的json字符输出:
1. 导入需要的jar包
装配MappingJacksonHttpMessageConverter需要我们的jackson相关jar包,我们使用maven来管理项目,在pom.xml中配置如下信息:
&org.codehaus.jackson&
&jackson-core-asl&
&org.codehaus.jackson&
&jackson-mapper-asl&
2. 装配MappingJacksonHttpMessageConverter
这里我们使用上面提到的方式二更为便利,在spring容器中加入:
&mvc:annotation-driven /&
关于springMVC所需的其他配置,可参考我的另一篇文章,或通过文尾的源码下载获取
3. 编写测试文件
下面是我们的User POJO测试类
public class User {
private String userN
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", password="
+ password + "]";
下面是我们的控制层测试文件:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("getUser")
public void getUser( @RequestBody User user){
System.out.println(user);
@RequestMapping("getUser1")
public void getUser1( HttpEntity&User& userEntity){
System.out.println(userEntity.getBody());
@ResponseBody
@RequestMapping("getUser2")
public User getUser2(User user){
System.out.println(user);
@RequestMapping("getUser3")
public HttpEntity&User& getUser3(User user){
System.out.println(user);
HttpEntity&User& uEntity = new HttpEntity&User&(user);
上面分别展示了注解和HttpEntity的用法。关于HttpResponse只是在HtppEntity的基础上进一步对相应信息进行封装,如修改一些相应头信息等
关于以上的getUser()getUser1()能将我们的json字符串转换为相应的对象,我们可以任何参数名输入:
{“id”:10,”password”:”myPassword”,”userName”:”myUserName”}
在这里我们需要的是需将请求头的contentType设置为”application/UTF-8“。这样spring才能找到对应的json解析器对我们的json字符串进行解析。否则会报错误:415 Unsupported Media Type
程序中方法调用User的toString()在控制台打印字段:
User [id=10, userName=asd, password=qwe]
对于以上的getUser2()和getUser3()方法,我们访问如:
http://localhost:8080/springMVC/user/getUser3?id=10&password=qwe&userName=asd。然后spring会帮我们自动将参数对应User对象的属性名绑定到方法入参的user对象中(关于复杂对象、集合绑定可参考我后面系列的文章)。根据上面url传入的参数,spring自动将我们的User对象转换为json格式字符串输出,内容如下:
{"id":10,"userName":"asd","password":"qwe"}
选择合适的数据转换器
在前面讲解中,我们通过AnnotationMethodHandlerAdapter注册了众多的数据转换器,而spring会针对不同的请求响应媒体类型,spring会为我们选择最恰当的数据转换器,它是按以下流程进行寻找的:
首先获取注册的所有HttpMessageConverter集合
然后客户端的请求header中寻找客户端可接收的类型,比如
Accept application/json,application/xml等,组成一个集合
所有的HttpMessageConverter 都有canRead和canWrite方法 返回值都是boolean,看这个HttpMessageConverter是否支持当前请求的读与写,读对应@RequestBody注解, 写对应@ResponseBody注解
遍历HttpMessageConverter集合与前面获取可接受类型进行匹配,如果匹配直接使用当前第一个匹配的HttpMessageConverter,然后return(一般是通过Accept和返回值对象的类型进行匹配)
本例的示例代码可到的mvc_messageConvertor1文件夹中下载
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:299370次
积分:4341
积分:4341
排名:第7870名
原创:132篇
评论:61条
文章:29篇
阅读:6513
阅读:6762
阅读:1500
文章:16篇
阅读:89582
阅读:19739
文章:45篇
阅读:136041
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'自由、创新、研究、探索
Linux/Windows Mono/DotNet [ Open Source .NET Development/ 使用开源工具进行DotNet软件开发]锐意进取,志存高远.成就梦想,只争朝夕.从你开始,创新世界.【That I exist is a perpetual supprise which is life. Focus on eCommerce】
SpringMVC是目前主流的Web MVC框架之一。&
如果有同学对它不熟悉,那么请参考它的入门blog:
public String method(Integer num, Date birth) {
Http请求传递的数据都是字符串String类型的,上面这个方法在Controller中定义,如果该方法对应的地址接收到到浏览器的请求的话,并且请求中含有num和birth参数,那么num会被自动转换成Integer对象;birth会被自动转为Date对象(Date转换需要配置属性编辑器)。
本文将分析这一原理,解释SpringMVC是如何实现数据类型的转换。
属性编辑器介绍
在讲解核心内容之前,我们先来了解一下Java中定义的属性编辑器。
sun设计属性编辑器主要是为IDE服务的,让IDE能够以可视化的方式设置JavaBean的属性。
PropertyEditor是属性编辑器的接口。
我们使用属性编辑器一般都是将String对象转换成我们需要的java对象而使用的。
有个方法setAsText很重要。 比如String对象"1"要使用属性编辑器转换成Integer对象,通过setAsText里Integer.parseInt(text)得到Integer对象,然后将Integer对象保存到属性中。
它的基本实现类是PropertyEditorSupport,一般我们要编写自定义的属性编辑器只需要继承这个类即可。
Spring中有很多自定义的属性编辑器,都在spring-beans jar包下的org.springframework.beans.propertyeditors包里。
CustomBooleanEditor继承PropertyEditorSupport并重写setAsText方法。
重要接口和类介绍
&刚刚分析了sun设计的属性编辑器。 下面我们来看下Spring对这方面的设计。
1.PropertyEditorRegistry接口
  封装方法来给JavaBean注册对应的属性编辑器。
2.PropertyEditorRegistrySupport:PropertyEditorRegistry接口的基础实现类
  PropertyEditorRegistrySupport类有个createDefaultEditors方法,会创建默认的属性编辑器。
3.TypeConverter接口
  类型转换接口。 通过该接口,可以将value转换为requiredType类型的对象。
4.TypeConverterSupport:TypeConverter基础实现类,并继承了PropertyEditorRegistrySupport  
  有个属性typeConverterDelegate,类型为TypeConverterDelegate,TypeConverterSupport将类型转换委托给typeConverterDelegate操作。
5.TypeConverterDelegate
  类型转换委托类。具体的类型转换操作由此类完成。
6.SimpleTypeConverter
  TypeConverterSupport的子类,使用了PropertyEditorRegistrySupport(父类TypeConverterSupport的父类PropertyEditorRegistrySupport)中定义的默认属性编辑器。
7.PropertyAccessor接口
  对类中属性操作的接口。
8.BeanWrapper接口
  继承ConfigurablePropertyAccessor(继承PropertyAccessor、PropertyEditorRegistry、TypeConverter接口)接口的操作Spring中JavaBean的核心接口。
9.BeanWrapperImpl类
  BeanWrapper接口的默认实现类,TypeConverterSupport是它的父类,可以进行类型转换,可以进行属性设置。
10.DataBinder类
  实现PropertyEditorRegistry、TypeConverter的类。支持类型转换,参数验证,数据绑定等功能。
  有个属性SimpleTypeConverter,用来进行类型转换操作。
11.WebDataBinder
  DataBinder的子类,主要是针对Web请求的数据绑定。
部分类和接口测试
由于BeanWrapper支持类型转换,属性设置。以BeanWrapper接口为例,做几个测试,让读者对它们有更清晰的认识:
以TestModel这个JavaBean为例,属性:
测试方法1:
TestModel tm = new TestModel();
BeanWrapper bw = new BeanWrapperImpl(tm);
bw.setPropertyValue("good", "on");
System.out.println(tm);
good是boolean属性,使用BeanWrapperImpl设置属性的时候,内部会使用类型转换(父类TypeConverterSupport提供),将String类型转换为boolean,CustomBooleanEditor对于String值是on,1,true,yes都会转换为true,本文介绍PropertyEditorRegistrySupport的时候说明过,CustomBooleanEditor属于默认的属性编辑器。
测试方法2:
TestModel tm = new TestModel();
BeanWrapperImpl bw = new BeanWrapperImpl(false);
bw.setWrappedInstance(tm);
bw.setPropertyValue("good", "1");
System.out.println(tm);
不使用默认的属性编辑器进行类型转换。 很明显,这段代码报错了,没有找到合适的属性编辑,String类型不能作为boolean类型的值。
错误信息:Failed to convert property value of type 'java.lang.String' to required type 'boolean' for property 'good';&
测试方法3:
TestModel tm = new TestModel();
BeanWrapper bw = new BeanWrapperImpl(tm);
bw.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
bw.setPropertyValue("birth", "");
System.out.println(tm);
默认属性编辑器中并没有日期类型的属性编辑器,我们注册一个Spring提供的CustomDateEditor属性编辑器,对应Date对象,并且为空。有了CustomDateEditor,设置birth的时候会通过类型转换自动转化成Date对象。
关于其他属性的设置,读者自行测试吧。
本文所使用的Spring版本是4.0.2
在分析RequestParamMethodArgumentResolver处理请求参数之前,我们简单回顾一下SpringMVC是如何对http请求进行处理的。
HandlerAdapter会对每个请求实例化一个ServletInvocableHandlerMethod对象进行处理,我们仅看下WebDataBinderFactory的构造过程。
WebDataBinderFactory接口是一个创建WebDataBinder的工厂接口。
以如下方法为例:
public ModelAndView test(boolean b, ModelAndView view) {
view.setViewName("test/test");
view.addObject("attr", "b is true");
view.addObject("attr", "b is false");
楼主在另外一篇博客中已经分析,boolean类型的参数会被RequestParamMethodArgumentResolver这个HandlerMethodArgumentResolver处理。
下面我们进入RequestParamMethodArgumentResolver看看是如何处理的。
RequestParamMethodArgumentResolver的resolveArgument方法是由它的父类AbstractNamedValueMethodArgumentResolver中定义的:
ServletRequestDataBinderFactory创建ExtendedServletRequestDataBinder。
ExtendedServletRequestDataBinder属于DataBinder的子类。
我们在介绍重要接口的时候说过DataBinder进行类型转换的时候内部会使用SimpleTypeConverter进行数据转换。
下面看看测试:
CustomBooleanEditor处理ohmygod会抛出IllegalArgumentException。 最终被截获处理成http 400错误。
PS:以上例子boolean类型改成Boolean类型的话,不传参数的话b就是null,我们解释默认属性编辑器的时候Boolean类型的参数是允许空的。但是boolean类型不传参数的话,默认会是false,而不会抛出异常。 原因就是resolveArgument方法中handleNullValue处理null值,spring进行了特殊的处理,如果参数类型是boolean的话,取false。 读者可以试试。
再看看个例子:
public ModelAndView testObj(Employee e, ModelAndView view) {
view.setViewName("test/test");
view.addObject("attr", e.toString());
该方法会被ServletModelAttributeMethodProcessorr这个HandlerMethodArgumentResolver处理。
ServletModelAttributeMethodProcessorr的resolveArgument方法是由它的父类ModelAttributeMethodProcessor中定义的:
&这里WebDataBinder方法bind中会使用BeanWrapper构造对象,然后设置对应的属性。BeanWrapper本文已介绍过。
编写自定义的属性编辑器
Spring提供的编辑器肯定不会满足我们日常开发的功能,因此开发自定义的属性编辑器也是很有必要的。
下面我们就写1个自定义的属性编辑器。
public class CustomDeptEditor extends PropertyEditorSupport {
public void setAsText(String text) throws IllegalArgumentException {
if(text.indexOf(",") & 0) {
Dept dept = new Dept();
String[] arr = text.split(",");
dept.setId(Integer.parseInt(arr[0]));
dept.setName(arr[1]);
setValue(dept);
throw new IllegalArgumentException("dept param is error");
SpringMVC中使用自定义的属性编辑器有3种方法:
1. Controller方法中添加@InitBinder注解的方法
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Dept.class, new CustomDeptEditor());
2. 实现WebBindingInitializer接口
public class MyWebBindingInitializer implements WebBindingInitializer {
public void initBinder(WebDataBinder binder, WebRequest request) {
binder.registerCustomEditor(Dept.class, new CustomDeptEditor());
之前分析源码的时候,HandlerAdapter构造WebDataBinderFactory的时候,会传递HandlerAdapter的属性webBindingInitializer。
因此,我们在配置文件中构造RequestMappingHandlerAdapter的时候传入参数webBindingInitializer。
3. @ControllerAdvice注解
@ControllerAdvice
public class InitBinderControllerAdvice {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Dept.class, new CustomDeptEditor());
加上ControllerAdvice别忘记配置文件component-scan需要扫描到这个类。
最终结果:
分析了Spring的数据转换功能,并解释这个神奇的转换功能是如何实现的,之后编写了自定义的属性编辑器。
大致讲解了下Spring类型转换中重要的类及接口。
SpringMVC这个系列目前准备在写3篇,拦截器、HandlerAdapter和视图。希望本系列文章对读者有帮助。
文章难免会出现错误,希望读者能够指出。
阅读(...) 评论()
随笔 - 16270
评论 - 14582013年3月 总版技术专家分月排行榜第二
2014年2月 Java大版内专家分月排行榜第一2013年8月 Java大版内专家分月排行榜第一2013年5月 Java大版内专家分月排行榜第一2013年4月 Java大版内专家分月排行榜第一2013年3月 Java大版内专家分月排行榜第一2013年2月 Java大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。是否可以将request当做参数传递到service层中 - ITeye问答
是否可以将request当做参数传递到service层中,service层接收到request后通过getParameter()取到多个参数,然后执行完相应的业务逻辑后,在service层通过request获取session对象,将结果数据放进session中,请问这样的编码是否有问题,是否符合规范?
&& 如果是小型项目, 代码量比较少, 变更又不多, 可以这么用, 反正能满足需求.
&& 如果是比较正式的项目, 建议不要这么用. 主要有两个原因: (1) 不适合做单元测试. 如果你想对Service层的方法做单元测试. 但是其参数是HttpServletRequet, 此时你必须用Mock的Request对象或者自己生成Request stub片段来完成. (2) 如果Service的客户端不仅仅是Web的Controller, 加入是一个走其他协议的RPC框架, 他没法构造(或者说完全没有必要)HttpServletRequet.
&& 在正式项目中, 慎用. 让架构的每一层尽量保持独立.
现在这样肯定是有问题的,楼上的各位都说了。
LZ为什么不封装一下呢,如果从request获取的参数不多,可以将service封装一下,接收所有参数,并将结果返回。LZ可以调用,将参数传进去,然后将结果放在session中。
这样做是可以实现功能,但是很不规范,代码块之间这样传参依赖太多,而且接口的通用性也差,service层也不该这么做。你简单封装一下所要用到的数据,或者就直接用jdk自带的集合类来传参都可以的。
从request中获取参数的操作应该放在action层(或者servlet)中,因为action层本就是做这个事情的——从request中解析参数然后调用合适的业务逻辑处理用户请求。
规范都是人定的,可以遵守也可以不遵守。但是有些约定俗成的东西确实是前人智慧的结晶,如果不加借鉴和学习,便会走很多弯路。
比如MVC的思想,就是为了分层,各层之间解耦,使得各层和各部分职责明确单一,代码结构清晰明了,这样可读性也就强多了(其实很有很多好处)。
试想当你看到解析request参数、业务处理逻辑以及操作数据库的代码全部放在一个类甚至一个方法里,你会是什么感受。
所以严格的分层是非常必要的,这样别人看到你的代码才会赏心悦目,同样你也愿意看到这样的结构清晰的代码,而不是一团乱麻型的代码。
1,、是否可以将request当做参数传递到service层中?
按照分层的思想,你这种把request传递到底层,就类似于把service层的逻辑处理放到orm层,这样推断,service层就可以取消掉了,那么分层就没意义了。
2、service层接收到request后通过getParameter()取到多个参数,然后执行完相应的业务逻辑后,在service层通过request获取session对象,将结果数据放进session中
一些mvc做的除了dispather,也就是把http请求的参数封装成bean,你这样直接操作getParameter方法,不是多此一举么?直接传递封装好的bean给service不是更好么?至于数据放到session中,最好是占用空间小的数据(如:User等),大的数据放到session,并发数过多,会导致堆空间不足的。
3、请问这样的编码是否有问题,是否符合规范?
如果考虑维护成本,考虑公司的编码规范,肯定不能这么做。
代码走的通,但是:
1、action层即作为控制器,它做的事情就是,拿到用户的参数,判断调用什么业务逻辑方法,然后把业务逻辑方法的返回值再传递给用户,你就可以把他当作一个快递分检站
service就里就做具体的业务逻辑判断,dao里面就写直接跟数据库打交道的东西。
2、action层负责选择不同的展示UI,为了保证系统能够在不同的UI界面做移植,action不要涉及业务逻辑。
不规范 避免
web层的东西怎么能跑到 service呢 ?& 你可以把数据封装为一个context(如Map) 然后传过去&
假设明天我要提供个webservice/rmi服务等 咋办 它们没有request 对不
已解决问题
未解决问题java web将前台传递的request数据转换成指定对象 - Java,Spring,MVC,REQUEST - New - ITeye论坛
java web将前台传递的request数据转换成指定对象
锁定老帖子
该帖已经被评为新手帖
等级: 初级会员
来自: 南京
发表时间:&&
相关知识库:
如在spring mvc中,获取前台传递的参数值并没有struts2那么方便,需要从request.getParameter来获取,比较麻烦,这里提供一个比较方便一点的方法(该方法经过一般性测试,还是可以使用的)
1、定义一个JsonRequest对象,包含三个成员变量,pageIndex、pageSize和Data,如下
public class JsonRequest&T& {
/** 当前页 */
private int pageI
/** 页面大小 */
private int pageS
/** 请求数据 */
* 获取当前页
public int getPageIndex() {
return pageI
* 设置当前页
* @param pageIndex
public void setPageIndex(int pageIndex) {
this.pageIndex = pageI
* 获取页面大小
public int getPageSize() {
return pageS
* 设置页面大小
* @param pageSize
public void setPageSize(int pageSize) {
this.pageSize = pageS
* 获取请求数据
public T getData() {
* 设置请求数据
* @param data
public void setData(T data) {
this.data =
2、定义一个Conver转换器接口和ConverFactory,用来将String类型转换成其他指定的类型。定义如下:
public interface Conver&T& {
* 将Object转换成对象,且转换过程中不会抛出异常
* @param str
public T conver(Object obj);
* 将Object转换成对象,若该对象为null或转换过程中出现异常,则使用默认值
* @param obj
* @param defvalue
public T conver(Object obj, T defvalue);
* 将Object对象转换成数组
* @param obj
public T[] converArray(Object obj);
public final class ConverFactory {
/** 转换器Map集合 */
private static Map&Class&?&, Conver&?&& CONVER_MAP = new ConcurrentHashMap&Class&?&, Conver&?&&();
* 静态语句块,设置Class与转换器的映射关系
CONVER_MAP.put(boolean.class, new BooleanConver(false));
CONVER_MAP.put(Boolean.class, new BooleanConver());
CONVER_MAP.put(byte.class, new ByteConver((byte) 0));
CONVER_MAP.put(Byte.class, new ByteConver());
CONVER_MAP.put(char.class, new CharacterConver((char) 0));
CONVER_MAP.put(Character.class, new CharacterConver());
CONVER_MAP.put(double.class, new DoubleConver(0.0));
CONVER_MAP.put(Double.class, new DoubleConver());
CONVER_MAP.put(float.class, new FloatConver(0f));
CONVER_MAP.put(Float.class, new FloatConver());
CONVER_MAP.put(int.class, new IntegerConver(0));
CONVER_MAP.put(Integer.class, new IntegerConver());
CONVER_MAP.put(long.class, new LongConver(0l));
CONVER_MAP.put(Long.class, new LongConver());
CONVER_MAP.put(short.class, new ShortConver((short) 0));
CONVER_MAP.put(Short.class, new ShortConver());
CONVER_MAP.put(String.class, new StringConver());
CONVER_MAP.put(Date.class, new DateConver());
* 根据Class类型获取相应的类型转换器
* @param clazz
public static Conver&?& getConver(Class&?& clazz) {
Conver&?& conver = CONVER_MAP.get(clazz);
if (conver == null) {
conver = new DefaultConver();
* 私有构造方法
private ConverFactory() {
3、将从request中获取的parameterMap转换成指定类型的对象,代码如下
public static &T& T toJavaBean(Map&?, ?& map, T object, Class&T& clazz) {
if (t == null) {
t = clazz.newInstance();
Method[] methods = clazz.getMethods();
for (Method method : methods) {
String methodName = method.getName();
Type[] types = method.getGenericParameterTypes();
if (methodName.startsWith("set") && methodName.length() & 3 && types != null && types.length == 1) {
Class&?& pclass = (Class&?&) types[0];
String fieldName = methodName.toLowerCase().charAt(3) + methodName.substring(4);
Object value = map.get(fieldName);
if (value != null) {
Class&?& _clazz =
Object _value =
Conver&?& conver = ConverFactory.getConver(_clazz);
if (pclass.isArray()) {
_value = conver.converArray(value);
_value = conver.conver(value);
method.invoke(t, _value);
catch (Exception ex) {
catch (Exception ex) {
ex.printStackTrace();
4、外部封装,调用3的toJavaBean方法,可以在BaseAction中实现,这样所有Action方法继承它就可以使用了,另外这里还提供了一个支持接送数据的方式。代码如下:
@SuppressWarnings("unchecked")
public &T& JsonRequest&T& getRequestBody(HttpServletRequest request, Class&T& clazz) throws Exception {
JsonRequest&T& jsonRequest =
boolean jsonAuth = Boolean.parseBoolean(request.getHeader("JsonAuthenticationFilter"));
if (jsonAuth) {
String jsonString = readRequestBody(request);
jsonRequest = JSON.parseObject(jsonString, JsonRequest.class);
t = JSON.parseObject(jsonString, clazz);
catch (Exception ex) {
logger.warn("Unable to get a json data from request body");
Map&?, ?& parameters = request.getParameterMap();
t = (T) ReflectTools.toJavaBean(parameters, t, clazz);
jsonRequest = ReflectTools.toJavaBean(parameters, jsonRequest, JsonRequest.class);
jsonRequest.setData(t);
return jsonR
public static final String readRequestBody(ServletRequest request) throws UnsupportedEncodingException, IOException {
String charset = request.getCharacterEncoding();
if (charset == null) {
charset = "utf-8";
BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream(), charset));
CharArrayWriter data = new CharArrayWriter();
char[] buf = new char[8192];
while ((ret = in.read(buf, 0, 8192)) != -1) {
data.write(buf, 0, ret);
return data.toString();
5、实现Conver类,这里面可以定义IntegerConver、StringConver等等,代码如下
public abstract class AbstractConver&T& implements Conver&T& {
/** 实体Class类型 */
private Class&T& entityC
/** 默认返回值,当转换后值为null则默认返回该值 */
@SuppressWarnings("unchecked")
public AbstractConver() {
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
entityClass = (Class&T&) type.getActualTypeArguments()[0];
public T conver(Object obj) {
Object _obj = this.array2Object(obj);
T result = this.converObject(_obj);
if (result == null) {
result = this.
public T conver(Object obj, T defvalue) {
Object _obj = this.array2Object(obj);
T result = this.converObject(_obj);
if (result == null) {
public T[] converArray(Object obj) {
T[] result =
if (obj != null) {
if (obj.getClass().isArray()) {
Object[] _array = (Object[])
result = getArray(_array.length);
for (int i = 0; i & _array. i++) {
result[i] = this.converObject(_array[i]);
result = getArray(1);
result[0] = this.converObject(obj);
* 在进行数据转换时,可能传入的是一个数组,这时在转换成JavaBean对象时,就需要把数组转换成对象&br&
* 目前的处理方式是获取数组的第一个值
* @param obj
protected Object array2Object(Object obj) {
if (obj != null && obj.getClass().isArray()) {
if (((Object[]) obj).length & 0) {
obj = ((Object[]) obj)[0];
* 将Object类型数据转换成指定类型值
* @param obj
protected abstract T converObject(Object obj);
* 由于T类型不可new,且不能使用Class.newInstance()方式创建对象,所以需要每一个实现类各自new一个T类型的数组
* @param length
protected abstract T[] getArray(int length);
* 获取泛型的实体Class类型
public Class&T& getEntityClass() {
return entityC
* 获取默认返回值,当转换后值为null则默认返回该值
public T getDefvalue() {
* 设置默认返回值,当转换后值为null则默认返回该值
* @param defvalue
public void setDefvalue(T defvalue) {
this.defvalue =
public class IntegerConver extends AbstractConver&Integer& {
* 默认的构造方法
public IntegerConver() {
* 具有指定默认值的构造方法
* @param defvalue
public IntegerConver(Integer defvalue) {
super.setDefvalue(defvalue);
protected Integer converObject(Object obj) {
Integer result =
if (obj != null) {
if (obj instanceof Integer) {
result = (Integer)
result = Integer.parseInt(obj.toString());
catch (Exception ex) {
protected Integer[] getArray(int length) {
return new Integer[length];
public abstract class DatetimeConver&T extends Date& extends AbstractConver&T& {
/** 默认的日期样式 */
public static String DEFAULT_STYLE = "yyyyMMddHHmmss";
/** 日期时间格式 */
protected static List&String& dateS
* 静态语句块
dateStyles = new ArrayList&String&();
dateStyles.add("yyyyMMdd");
dateStyles.add("yyyyMMddHHmmss");
dateStyles.add("yyyy-MM-dd");
dateStyles.add("yyyy-MM-dd HH:mm:ss");
* 根据指定的日期时间字符串转换
* @param value
protected Date converDate(String value) {
Date result =
result = DateTools.getTime(value, DEFAULT_STYLE);
if (result == null) {
for (String style : dateStyles) {
if (!DEFAULT_STYLE.equals(style)) {
result = DateTools.getTime(value, style);
if (result != null) {
* 获取日期时间格式
public static List&String& getDateStyles() {
return dateS
* 设置日期时间格式
* @param dateStyles
public static void setDateStyles(List&String& dateStyles) {
DatetimeConver.dateStyles = dateS
public class DateConver extends DatetimeConver&Date& {
* 默认的构造方法
public DateConver() {
* 具有指定默认值的构造方法
* @param defvalue
public DateConver(Date defvalue) {
super.setDefvalue(defvalue);
protected Date converObject(Object obj) {
Date result =
if (obj != null) {
if (obj instanceof Date) {
result = (Date)
result = super.converDate(obj.toString());
catch (Exception ex) {
protected Date[] getArray(int length) {
return new Date[length];
jinnianshilongnian
文章: 1113
积分: 2290
发表时间:&&
springmvc数据绑定已经很强大了,不知道哪方面没满足你的需求,能给个案例不
请登录后投票
簡單從泚銷夨
等级: 初级会员
来自: 文一西路969号
发表时间:&&
最新的spring可以支持对象绑定了
请登录后投票
文章: 1018
来自: 陕西
发表时间:&&
spring mvc现在还需要 用req.getParameter获取参数,我的神啊,太落伍了!!
请登录后投票
hellostory
等级: 初级会员
来自: 北京
发表时间:&&
最后修改:
引用
如在spring mvc中,获取前台传递的参数值并没有struts2那么方便,需要从request.getParameter来获取,比较麻烦
恳请楼主把这句话删除!建议楼主看些 SpringMVC入门级 的文章,磨刀不误砍柴工!
请登录后投票
hypercube1024
等级: 初级会员
来自: 北京
发表时间:&&
-_-b 看来楼主得多看看 SpringMVC的文档。。。
请登录后投票
等级: 初级会员
来自: 珠海
发表时间:&&
jinnianshilongnian 写道springmvc数据绑定已经很强大了,不知道哪方面没满足你的需求,能给个案例不
如果应用程序就没用Spring框架,如何是好?
可有时间,做个研究完成 request到form bean的转换,以及 用tag库来完成 form的显示?
请登录后投票
jinnianshilongnian
文章: 1113
积分: 2290
发表时间:&&
xzcgeorge 写道jinnianshilongnian 写道springmvc数据绑定已经很强大了,不知道哪方面没满足你的需求,能给个案例不
如果应用程序就没用Spring框架,如何是好?
可有时间,做个研究完成 request到form bean的转换,以及 用tag库来完成 form的显示?
很多BeanUtils,如orika、common-beanutils(struts1使用该组件做绑定), tag的话如jstl等也有许多。
请登录后投票
跳转论坛:移动开发技术
Web前端技术
Java企业应用
编程语言技术}

我要回帖

更多关于 接收零配置参数要多久 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信