JSP から Struts2 アクションのマップ プロパティを設定したいと考えています。使用すべきデータ名の形式は何ですか? 最初は Map<String, String> に値を設定することに興味がありましたが、将来的には、DomainClass が独自のプロパティを持つ Map<String, DomainClass> に値を設定することに興味があります。
3 に答える
次のようなプロパティを持つアクションがあります-
private Map<String,String> assetProps;
...
public Map<String, String> getAssetProps() {
return assetProps;
}
public void setAssetProps(Map<String, String> assetProps) {
this.assetProps = assetProps;
}
マップに値を設定するには、基本的に 2 つの手順があります。まず、OGNL はマップをインスタンス化できないため、ユーザー次第です。私のアクションでは、Preparable インターフェイスを実装しますが、次のように「public String input()」メソッドを実行する前にインスタンス化します -
public class EditAction extends ActionSupport implements Preparable {
...
public void prepare() {
// just satisfying Preparable interface so we can have prepareInput()
}
public void prepareInput() throws Exception {
assetProps = new HashMap<String,String>();
}
これで、オブジェクトは非 null になりました。JSP で次のような構文を使用できます。
<s:iterator value="asset.properties" var="prop">
<sjx:textfield name="%{'assetProps[\\'' +#prop.propName +'\\']'}"
value="%{#prop.propValue}"
label="%{#prop.propName}" size="25"/>
</s:iterator>
イテレータは、一連のオブジェクトをスタックから引き出し、それを反復処理します。重要な部分は "name=" セクションです。二重エスケープされた一重引用符に注意してください。そうすれば、ページがレンダリングされると、入力要素の名前は (たとえば) - assetProps['Screen Size'] になります。ページが送信されると、「public void execute()」メソッド内で、assetProps が完全に入力されます。
これは、誰かを助ける場合に備えて、同様のことを行う別のコードスニペットです。
<s:iterator value="storageIds" var="sids">
<s:hidden name="%{'storageIds[\\'' + key +'\\']'}" value="%{#sids.value}"/>
</s:iterator>
私のアクションにはMap<String,String>
名前がありますstorageIds
マップを反復処理すると、キーと値がMap.Entry
プロパティに解決されます。