2010-12-12 94 views
0

我在使用struts 2中的類型轉換來轉換bean的集合時遇到了麻煩。 我下面的動作類:struts 2集合類型轉換問題

@Validation() 
@Conversion() 
public class HelloWorldAction extends ActionSupport { 


    private List<HelloBean> helloBeans = new ArrayList<HelloBean>(); 


    public String execute() throws Exception { 
     System.out.println(helloBeans); 
     return SUCCESS; 
    } 
    public List<HelloBean> getHelloBeans() { 
     return helloBeans; 
    } 

    @TypeConversion(rule = ConversionRule.COLLECTION, converter = "foo.HelloBean") 
    public void setHelloBeans(List<HelloBean> helloBeans) { 
     this.helloBeans = helloBeans; 
    } 

} 

和我的bean類:

public class HelloBean { 
    private String name; 
    private Integer age; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Integer getAge() { 
     return age; 
    } 
    public void setAge(Integer age) { 
     this.age = age; 
    } 

} 

和我的JSP文件:

<s:form action="helloWorld"> 

    <s:textfield name="helloBeans.name" label="name1"/> 
    <s:textfield name="helloBeans.name" label="name2" /> 
    <s:textfield name="helloBeans.age" label="age1"/> 
    <s:textfield name="helloBeans.age" label="age2"/> 
     <s:submit /> 
    </s:form> 

當過程已經提交,支柱總是給我4對象,而不是內部集合中的2個對象。我知道使用索引屬性中的其他解決方法將解決問題,但對於我的情況,我需要收集是動態的。有辦法解決這類問題嗎?

我已經試過別人的註釋以及:

@Element(value =foo.HelloBean.class) 
    @CreateIfNull(value = true) 
    @KeyProperty(value = "name") 
    private List<HelloBean> helloBeans = new ArrayList<HelloBean>(); 

但這些都不曾

+0

僅供參考:您無需在您的操作中初始化helloBeans。你的二傳手會做到這一點。 – 2010-12-12 16:45:45

回答

0

據我所知,你必須使用:

<s:form action="hello-world"> 
     <s:textfield name="helloBeans[1].name" label="name1"/> 
     <s:textfield name="helloBeans[1].age" label="age1"/> 
     <s:textfield name="helloBeans[2].name" label="name2" /> 
     <s:textfield name="helloBeans[2].age" label="age2"/> 
     <s:submit /> 
    </s:form> 

我認爲最大的問題不在於它必須以這種方式完成,但是您認爲這意味着它不能動態化,請考慮文本字段的渲染更少(實際上更少是因爲我刪除了「id」和「value」屬性):

<input type="text" name="helloBeans[1].name"/> 
<input type="text" name="helloBeans[1].age"/> 
... 

沒有理由你根本無法自行處理這在你的JSP動態地爲完成測試觀點:

<h1>Display HelloBeans</h1> 
    <table> 
     <s:iterator value="helloBeans"> 
      <tr> 
       <td><s:property value="name"/></td> 
       <td><s:property value="age"/></td> 
      </tr> 
     </s:iterator> 
    </table> 

或者,如果你的問題是客戶端,然後使用JavaScript(或更好的JS庫(如jQuery)將新的文本字段添加到DOM ...並使用字符串連接爲「name」屬性構建正確的OGNL。

注意如果您的動態行爲是在JSP服務器端就

<s:property value="#helloBeans.index" /> 

在S內使用時,會得到當前迭代的索引:iterator標籤。