2013-05-01 88 views
0

我有一些名爲Configuration的類有一些類型爲java.util.List和java.util.Map的字段。從jsp傳遞java.util.Map到servlet

public class Configuration { 
    List<String> objects; 
    Map<String, Integer> maps; 
     // getters, setters... 
} 

我有一些JSP頁面,用戶可以編輯這個領域。

與列表我沒有問題,我只是命名我的輸入字段相同的字段中命名的字段和春季轉換它在@ModelAttribute。

<input type="text" name="objects"/> 
<input type="text" name="objects"/> 
<input type="text" name="objects"/> 

隨着地圖我有一些probmels - 我不知道如何命名我的輸入字段鍵和值。當我將它們命名爲key和value時,我在servlet中獲得null。

<input type="text" name="key"/><input type="text" name="value"/> 

Wnen我我命名他們像maps.key和maps.value我得到的servlet

<input type="text" name="maps.key"/><input type="text" name="maps.value"/> 

空的地圖,當我給它們命名,例如地圖,我得到春天轉換錯誤

<input type="text" name="maps"/><input type="text" name="maps"/> 

將地圖從jsp傳遞給servlet的正確方法是什麼?

+0

你的意思是從servlet把jsp通過地圖? jsp在servlet之後被處理。您通常會將該映射設置爲一個bean,然後使用標記庫在jsp中呈現bean值(Map stuff)。 – KyleM 2013-05-01 19:25:28

+0

不,我的意思是將地圖從jsp傳遞給servlet使用post方法和控制器使用post方法和@ModelAttribute – Xenobyte 2013-05-01 19:30:15

回答

2

我不會讓春天爲你做這個。我不知道它是否能夠深入。

在你的jsp中,也許你有一個javascript按鈕,每當你想添加一個整數時,就會爲整數添加一個<input>字段(假設爲Map<String, Integer>)。您應該能夠設置該字段的名稱屬性並始終使用某個特定的前綴。例如,使用前綴NUMBER_OF_。然後,字段將變爲,例如,NUMBER_OF_players,其中players是您提供的值。所以輸入會是什麼樣子:

<input type="text" name="NUMBER_OF_players" /> 

在你的控制器,通過HttpServletRequest到您的處理方法,並呼籲getParameterMap()

Map<String, String[]> parameterMap = request.getParameterMap(); 
for (String key: parameterMap.keySet()) { 
    if (key.startsWith("NUMBER_OF_")) { 
     parameterKeyList.add(key); // add it to a list of parameters that are going to be 
            // used for your Configuration instance 
            // you know this is a good one because it has the prefix 
    } 
} 

Map<String, Integer> maps = ...; 

for (String parameter : parameterKeyList) { 
    String value = request.getParameter(parameter); 
    Integer integer = Integer.parseInt(value); 
    maps.put(parameter, integer); 
} 

Configuration config = new Configuration(); 
config.setMaps(maps); 

我沒有加入所有的null檢查和異常處理,我離開那對你。

你可以讓Spring生成Configuration實例的一部分(已知的字段),然後用上面的方法自己完成剩下的工作。

+0

Thx爲您的答案。我也想過這個決定,但我仍然希望有一個使用spring的簡單方法。 – Xenobyte 2013-05-01 20:14:37

+0

@Xenobyte Spring使用您的bean字段名稱來映射請求參數。由於這是一張地圖,因此沒有任何內容告訴它要獲取哪個參數(使用一個鍵)。 Spring可能讓你做的是註冊一個自定義綁定,但其中的邏輯將如上所述。 – 2013-05-01 20:18:36

+0

@Xenobyte或者你也可以看看這個答案:http:// stackoverflow。COM /問題/ 736186 /罐-A-彈簧外形命令待A-MAP – 2013-05-01 20:20:36

0

你可以使用Spring:bind標籤來幫助你檢查這linklink