2009-04-12 31 views
0

我想從JSP中填充Struts2操作的映射屬性。我應該使用什麼數據名稱的格式?最初我對填充地圖< String,String>感興趣,但將來我會在填充Map < String,DomainClass>時感興趣,其中DomainClass具有其自己的屬性。JSP中的Struts2映射條目的字段名稱

回答

3

我有一個動作,具有屬性如下: -

private Map<String,String> assetProps; 
... 
public Map<String, String> getAssetProps() { 
    return assetProps; 
} 

public void setAssetProps(Map<String, String> assetProps) { 
    this.assetProps = assetProps; 
} 

要設置值到地圖上,基本上有兩個步驟。首先,OGNL不能實例化地圖,因此取決於您。在我的動作,我實現了製備的接口,但如下運行前對其進行實例化「公共字符串輸入()」方法 -

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>(); 
    } 

現在,對象非空,我可以使用類似的語法以下在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被完全填充。

+0

感謝您的解釋,這幫助我解決了類似的情況。一方面,您實際上並不需要Preparable接口,您可以在聲明它時初始化Map。 – shakerlxxv 2012-11-01 02:42:28

2

這是另一個代碼片段,它可以做類似的事情,以防萬一。

<s:iterator value="storageIds" var="sids"> 
    <s:hidden name="%{'storageIds[\\'' + key +'\\']'}" value="%{#sids.value}"/> 
</s:iterator> 

我的操作有一個名爲Map<String,String>storageIds

當遍歷一個地圖,鍵和值解析爲Map.Entry屬性。

0

試試這個。爲我完美工作

<s:iterator value="configMap" id="daa"> 
    <s:hidden name="%{'configMap[\\'' + key +'\\']'}" value="%{#daa.value}" /> 
</s:iterator> 
相關問題