在ActionForm中使用集合属性是可以也是很方便的,但是如何使用好是有技巧的。
假如在一个页面提交一个List,如下图:
一般情况下,我们会用request的getParameterValues这个方法取得HTTP request中的数据,返回一个String数组。
是否有办法让struts帮我们来组装HTTP request中的数据到ActionForm中呢?
有办法,下面我们来看看应该如何让struts帮我们来组装HTTP request中的数据到ActionForm中
首先我们先建立一个ActionForm,叫TestCForm,用来存页面中的NAME和URL,具体代码如下:
public class TestCForm extends ActionForm {
private String name;
private String url;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
接下来建立一个ActionForm,叫TestBForm,用来存页面上的TestCForm List,具体代码如下:
public class TestBForm extends ActionForm {
private List testCForms;
public List getTestCForms() {
return testCForms;
}
public void setTestCForms(List testCForms) {
this.testCForms = testCForms;
}
public TestCForm getTestCForm(int index) {
if (testCForms == null) testCForms = new ArrayList();
if (index >= testCForms.size()) {
for (int i = testCForms.size()-1; i < index; i++) {
testCForms.add(new TestCForm());
}
}
return (TestCForm)this.testCForms.get(index);
}
public void setTestCForm(int index, TestCForm testCForm) {
if(testCForms == null) testCForms = new ArrayList();
if (testCForms.size() < index + 1) {
testCForms.add(index, testCForm);
} else {
testCForms.set(index, testCForm);
}
}
}
注意这里关键是getTestCForm和setTestCForm这两个方法,如果没有这两个方法Struts是不能自动组装HTTP Request中的数据的。
好的,ActionForm建立好了,下面看一下页面如何来实现,
如果要struts能自动组装HTTP Request中的数据,需要使input标签的name属性有特定的格式。
Struts是使用Jakarta Commons BeanUtils来实现组装HTTP Request中的数据的,
BeanUtils.populate( ) 用request中参数的名字来决定使用ActionForm中哪个合适的setter方法,下面是几个ActionForm组装的例子:
HTML form input tag | Generated request pair | Resulting method call |
---|---|---|
<input type="text" name="bar"> | bar=someValue | Form.setBar("someValue") |
<input type="text" name="sna.fug"> | sna.fug=blah | Form.getSna( ).setFug("blah"); |
<input type="text" name="baz[0]"> | baz[0]=someValue | Form.setBaz(0,"firstVal"); |
<input type="text" name="glub[1].waf"> | glub[1].waf=halb | Form.getGlub(1).setWaf("halb"); |
<input type="text" name="dog.leg[2]"> | dog.leg[2]=lame | Form.getDog( ).setLeg(2, "lame"); |
根据上面的例子我们对ActionForm组装有了一定的了解,下面我们接着上面的例子实践一下。
建一个JSP文件,叫testlist.jsp,其中input标签的代码片段如下:
<tr>
<td><input type="text" name="testCForm[0].name" /></td>
<td><input type="text" name="testCForm[0].url" /></td>
</tr>
<tr>
<td><input type="text" name="testCForm[1].name" /></td>
<td><input type="text" name="testCForm[1].url" /></td>
</tr>
<tr>
<td><input type="text" name="testCForm[2].name" /></td>
<td><input type="text" name="testCForm[2].url" /></td>
</tr>
<tr>
<td><input type="text" name="testCForm[3].name" /></td>
<td><input type="text" name="testCForm[3].url" /></td>
</tr>
注意input标签name属性的写法,BeanUtils.populate( ) 中会根据testCForm来找到合适的getter和setter方法:getTestCForm和setTestCForm
最后再建一个JSP文件叫testout.jsp,用来显示输入的内容,部分代码如下:
<table align='left'>
<tr>
<td>NAME</td>
<td>URL</td>
</tr>
<logic:iterate id="item" name="bForm" property="testCForms" indexId="index">
<tr>
<td><bean:write name="item" property='name'/></td>
<td><bean:write name="item" property='url'/></td>
</tr>
</logic:iterate>
</table>
在上面的例子中我们使用的是HTML中的input标签,我们还可以使用Struts中的html:text标签来实现:
<logic:iterate id="testCForm" name="bForm" property="testCForms" indexId="id">
<tr>
<td><html:text name="testCForm" property='name' indexed="true" /></td>
<td><html:text name="testCForm" property='url' indexed="true" /></td>
</tr>
</logic:iterate>
注意使用html:text时一定要将indexed设置为true,否则生成的input标签的name属性的值不会是testCForm[0].name这样的格式。
具体内容请参照附件: http://88fly.com.cn/bbs/viewthread.php?tid=107&extra=page%3D1