2009-12-24 27 views
0

我想将一个ServletRequest的参数绑定到任意域对象。 PARAMS可作为地图类型如何将ServletRequest参数绑定到域对象?

Map<String, String[]> // String = key, String[] = values 

它们应转换并结合到目标对象的字段。我喜欢有这样的方法:

// definition: 
public void bind(Map<String, String[]>, T target) 

// usage: 
bind(request.getParameterMap(), domainObject); 

将请求参数绑定到Java Servlet中的域对象的最佳方法是什么?什么库可用于此目的,或者如何编写一个?

+1

数据绑定是一个复杂的问题,除了最平凡的应用程序之外的所有应用程序。 Web框架在这方面花费了很多精力,你不应该期待通过自己的方式找到一个简单的解决方案。这个框架的存在是为了很好的理由:) – skaffman 2009-12-24 14:27:39

回答

0

我会说这取决于什么样的物体的实际domainObject是。如果它是一个bean,你可以使用一个基于反射自动化豆填充器如我BeanPropertyController(它是免费的,所以给它一个尝试许可证是ASF2.0!)做到以下几点:

/* Assumed parameter input: 
* a=hello 
* c=123 
* e=f,g,h 
* 
* Matching bean: 
*/ 
public class ParamBean { 
    private String a; 
    private int c; 
    private String[] e; 
    /* + all the normal getters and setters you'd see in a bean */ 
} 

/* somewhere in your servlet: */ 

BeanPropertyController bpc = BeanPropertyController.of(ParamBean.class); 

for (Entry<String, String[]> entry : request.getParameterMap().entrySet()) { 
    bpc.mutate(entry.getKey(), 
       getNiceValue(entry.getValue(), bpc.typeOf(entry.getKey())); 
} 

ParamBean bean = bpc.getObject(ParamBean.class); 

/* somewhere else in the class */ 

public Object getNiceValue(String[] objs, Class<?> desiredClass) { 
    if (objs.length == 1) { 
     Object o = objs[0]; 
     return convertString(o); 
    } else { 
     Object[] newObjs = Object[objs.length]; 

     for (int i=0;i<objs.length;i++) { 
      newObjs[i] = convertString(objs[i]); 
     } 

     return (Object) newObjs; 
    } 
} 

private Object convertString(String value, Class<> desiredClass) { 
    if (Number.class.isAssignableFrom(desiredClass)) { 
     Double d = null; 
     try { 
      d = Double.parseDouble(value) 
     } catch (NumberFormatException e) { 
      // Not of the desired type, do whatever you want 
     } 
     if (Double.class.isAssignableFrom(desiredClass)) { 
      return d; 
     } else if (Long.class.isAssignableFrom(desiredClass)) { 
      return d.longValue(); 
     } else if (Integer.class.isAssignableFrom(desiredClass)) { 
      return d.intValue(); 
     } // and so on... 
    } else if (Boolean.class.isAssignableFrom(desiredClass)) { 
     try { 
      return Boolean.valueOf(value); 
     } catch (NullPointerException e) { 
      // Not of the desired type, do whatever you want 
     } 
    } else { 
     return value; // or whatever your default type is 
    } 
} 
+0

对于我的用例,getNiceValue方法将是最有趣的事情。我需要从平面地图到对象结构的实际转换。 – deamon 2009-12-24 13:32:56

+0

不够公平,更新了代码示例。这可能是越野车,但我目前远离我的家用电脑,不得不使用记事本。圣诞节快乐! – Esko 2009-12-24 14:05:55

1

你调查过Spring MVC(http://springsource.org)框架呢?它提供了可以在Spring之外使用的绑定功能。另外,如果你目前还没有使用另一个MVC框架,这是一个很好的考虑。

相关问题