2010-12-12 1 views
0

У меня проблемы с использованием преобразования типов в struts 2 для преобразования коллекции bean-компонентов. я следующий класс действий:стойки 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; 
    } 

} 

и мой класс боба:

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

FYI: Вам не нужно инициализировать helloBeans в вашем действии. Ваш сеттер сделает это. –

ответ

0

AFAIK вы должны использовать:

<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 ... и использовать конкатенацию строк для создания правильного OGNL для атрибутов 'name'.

Примечание Если динамическое поведение на стороне сервера в JSP затем

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

получит Вас индекс текущей итерации при использовании внутри с: итератора тега.

Смежные вопросы