我在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>();
但这些都不起作用
答案 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标记内使用时获取当前迭代的索引。