Struts学习笔记之在ActionForm中使用集合属性并自动组装(populate)数据

4 篇文章 0 订阅

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值