2009-12-24 41 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框架,這是一個很好的考慮。

相關問題