struts 2集合类型转换问题

时间:2010-12-12 03:59:57

标签: types struts2 type-conversion

我在struts 2中使用类型转换来转换bean的集合时遇到了麻烦。 我跟着动作课:

@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>

当提交进程时,struts总是给我4个对象,而不是集合中的2个对象。我知道在属性中使用索引的其他解决方法将解决问题,但对于我的情况,我需要集合是动态的。有没有办法解决这类问题?

我也尝试过其他注释:

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

但这些都不起作用

1 个答案:

答案 0 :(得分: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'和'价值'属性):

<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标记内使用时获取当前迭代的索引。