1

タイプjava.util.Listおよびjava.util.Mapのいくつかのフィールドを持つConfigurationという名前のクラスがあります。

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"/>

Map にはいくつか問題があります。入力フィールドにキーと値の名前を付ける方法がわかりません。キーと値のように名前を付けると、サーブレットでnullになります。

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

maps.key や maps.value のように名前を付けている場合、サーブレットで空のマップを取得します

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

マップのように名前を付けると、スプリング変換エラーが発生します

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

jspからサーブレットにマップを渡す正しい方法は?

4

2 に答える 2

3

私はSpringにこれをさせません。そこまで深くなるかどうかはわかりません。

あなたのjspには、追加したいたびに整数のフィールドを追加するjavascriptボタンがあるかもしれません<input>( と仮定)。Map<String, Integer>このフィールドの name 属性を設定し、常に特定のプレフィックスを使用できるようにする必要があります。たとえば、接頭辞 を使用します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インスタンスの一部 (既知のフィールド) を生成させてから、残りを上記で自分で行うことができます。

于 2013-05-01T20:00:42.573 に答える