4

我目前有以下代码,数据显示正常。

<logic:iterate name="myList" id="product"  indexId="iteration" type="com.mycompany.MyBean">  
    <tr>  
        <td> <bean:write name="product" property="weight"/> </td>  
        <td> <bean:write name="product" property="sku"/> </td>  
        <td> <bean:write name="product" property="quantity"/> </td>  
    </tr>  
</logic:iterate>  

但现在我需要使“数量”部分可修改。用户应该能够更新该字段,按下提交,当它发送到服务器时,“myList”应该会自动更新为新的数量。

我已经尝试在这方面寻求帮助,但我一直在寻找的只是有关如何仅显示数据而不是修改数据的示例。任何帮助,将不胜感激。

4

4 回答 4

4

所以这很棘手,因为要让它发挥作用,需要做很多事情。首先,使用 html 标签在迭代器中声明您的标签,属性 INDEXED=TRUE 和 ID 与名称不同,我还取出“indexId”属性以使用简单的“index”词作为索引:

<logic:iterate name="myList" id="myListI"   type="com.mycompany.MyBean">  
<tr>  
    <td> <html:input name="myListI" property="weight"  indexed="true"/> </td>  
    <td> <html:input name="myListI" property="sku"  indexed="true"/> </td>  
    <td> <html:input name="myListI" property="quantity"  indexed="true"/> </td>  
</tr>  

之后,为了让 struts 能够获取和设置 bean 的属性,您需要在集合对象中声明 EXTRA get 和 set 方法,使用您在 iterate 标记的 id 中编写的名称。在这种情况下,您将为 "myListI" 编写 2 个额外的 get 和 set 方法:

public void setMyListI(int index, myBean value){
    this.myList.add(value);
}
public myBean getMyListI(int index){
    return this.myList.get(index);
}
于 2012-04-20T13:17:31.623 回答
2

我认为 Th0rndikes 的回答大多是正确的。我的实现略有不同,因此也值得尝试。

形式

private List<Parameter> activeParameters;

public List<Parameter> getActiveParameters() {
    return activeParameters;
}

public Parameter getParam(int index){
    return this.activeParameters.get(index);
}

JSP

<logic:iterate name="MyForm" property="activeParameters" id="param">
  <tr>
    <td><bean:write name="param" property="prompt"/></td>
    <td><html:text name="param" property="value" indexed="true"/></td>
  </tr>
</logic:iterate>

综上所述,我没有在 iterate 标签中使用 Type,而是使用 property 标签。在 bean 中添加一个 getter,它与 JSP(参数)中的迭代 ID 的名称相匹配,并将索引作为方法参数就可以了。

于 2012-10-07T15:35:01.680 回答
2

看看这个:http ://wiki.apache.org/struts/StrutsCatalogLazyList

索引属性

Struts html 标签有一个 indexed 属性,它会在提交表单时生成适当的 html 来填充 bean 的集合。诀窍是将 id 属性命名为与索引属性相同的名称

比如下面的jsp...

   <logic:iterate name="skillsForm" property="skills" id="skills">

       <html:text name="skills" property="skillId" indexed="true"/>

   </logic:iterate>

...将生成以下 html

<input type="text" name="skills[0].skillId value="..."/>
<input type="text" name="skills[1].skillId value="..."/>
....
<input type="text" name="skills[n].skillId value="..."/>

提交表单时,BeanUtils 将首先调用 getSkills(index) 方法来检索索引 bean,然后在检索到的 bean 上调用 setSkillId(..)。

于 2015-04-29T11:53:09.153 回答
1

理论上,indexedstruts html 标签的属性可以用于:

仅在logic:iterate标签内部有效。如果为 true,则 html 标记的名称将呈现为“id[34].propertyName”。括号中的数字将为每次迭代生成并取自祖先逻辑:迭代标记。

但是,标签上没有对应indexed的属性html:errors,这限制了它的用途。此外,所需的 和 属性组合id可能nameproperty相当混乱。

我发现使用 jsp scriptlet 生成包含迭代索引的属性名称更容易。以下代码要求您的表单具有字符串数组属性“数量”。

<% int idx=0; %>
<logic:iterate ...>
    <html:text property='<%= "quantity[" + idx + "]" %>'/>
    <html:errors property='<%= "quantity[" + idx + "]" %>'/>
    <% i++; %>
</logic:iterate>
于 2012-04-20T13:10:16.320 回答