Struts 1 - Iteration in Iteration - 内排法
Struts 1 - Iteration in Iteration - Inner row method
我在 logic:iterate
中有一个 logic:iterate
。我可以编辑此 table 中的所有字段。对于每个 logic:iterate
我有一个 getXXX
行方法。
首先,我点击“添加”按钮。迭代充满了 3 个人。
第一个有一个地址,第二个有两个,第三个有三个。 (在实际应用中是动态的)
现在我更改了一些输入字段并单击我的发送按钮。现在调用行方法来初始化旧状态。但是我如何正确实施行地址方法呢?它只会被调用三次,但我必须准确填写人员字段并将其取回,或者?
希望它能像上一个线程一样更好地描述我的问题。
编辑:
尝试更好地解释它。我有一个个人列表,在我的 getRowPerson- 方法中没有问题,因为 "index" 仅来自此列表。但是现在我在这个例子中有三个地址列表,我无法关联哪个 "list" 调用了 getRowAdress。 (此时我必须return一个来自正确索引的正确人的地址,但我不知道这个人只知道地址列表中的位置)
如果 getRowAdress 在人 class 中,它也是不同的,但它从未调用过。
另一个问题是 getRowAdress 只被调用了三次,在我看来,我应该为每个地址行项目调用一次。以我为例六次。我认为内部迭代有问题。我尝试了 nested:iteration 但也没有用。
控制台:
adress index2<br>
adress index1<br>
adress index0<br>
person index1<br>
person index2<br>
person index0<br>
Html:
<logic:iterate id="rowPerson" name="iterateForm" indexId="rowIndex" property="persons" >
<html:text name="rowPerson" property="name" indexed="true"/>
<logic:iterate id="rowAdress" name="rowPerson" indexId="rowAdressIndex" property="address" >
<html:text name="rowAdress" property="addressname" indexed="true"/>
</logic:iterate>
<br>
</logic:iterate>
<html:submit value="Send" property="submitvalue"/>
<html:submit value="Add" property="submitvalue"/>
</html:form>
动作
public class HelloWorldAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
HelloWorldForm helloWorldForm = (HelloWorldForm) form;
String submitvalue = request.getParameter("submitvalue");
if (submitvalue == null) {
return mapping.findForward("success");
} else if ("Add".equals(submitvalue)) {
for (int i = 0; i < 3; i++) {
PersonForm person = new PersonForm();
person.setName("Person " + i);
for(int y = 0 ; y <= i ; y++){
AddressForm add = new AddressForm();
add.setAddressname("Adress" + y);
person.getAddress().add(add);
}
helloWorldForm.getPersons().add(person);
}
}
return mapping.findForward("success");
}
}
ActionForm
public class HelloWorldForm extends ActionForm{
private static final long serialVersionUID = -473562596852452021L;
private List<PersonForm> persons = new ArrayList<>();
public PersonForm getRowPerson(int index){
System.out.println("person index" + index);
while(persons.size() <= index){
persons.add(new PersonForm());
}
return persons.get(index);
}
public AddressForm getRowAdress(int index){
System.out.println("adress index" + index);
// ???? dont know ???
return new AddressForm();
}
public List<PersonForm> getPersons() {
return persons;
}
public void setPersons(List<PersonForm> persons) {
this.persons = persons;
}
}
Personform 和 Addressform 只有 setter & getter
您的 JSP 正在呈现此 HTML 代码:
<input type="text" name="rowPerson[0].name" value="Person 0">
<input type="text" name="rowAdress[0].addressname" value="Adress0">
这会在您的 HelloWorldForm
中触发对 getRowPerson(0)
和 getRowAdress(0)
的调用。但是我们实际上想要嵌套元素,为此我们必须使用 nested 标签库:
<nested:iterate property="persons">
<nested:text property="name"/>
<nested:iterate property="address">
<nested:text property="addressname"/>
</nested:iterate>
<br>
</nested:iterate>
这会生成:
<input type="text" name="persons[0].name" value="Person 0">
<input type="text" name="persons[0].address[0].addressname" value="Adress0">
使用相同的方法读取和写入列表可以简化解决方案。如果您的操作中的 scope
设置为 session
,这是默认值,那么您的表单将在您提交后覆盖值,您无需担心列表的动态增长。你可以简单地拥有:
public class HelloWorldForm extends ActionForm{
private List<PersonForm> persons = new ArrayList<>();
public List<PersonForm> getPersons() {
return persons;
}
public void setPersons(List<PersonForm> persons) {
this.persons = persons;
}
}
否则,如果您的操作映射中有 scope="request"
,在 struts-config.xml
中,您将需要动态重新创建列表。为此,一个选项是使用 commons-collection LazyList:
public class HelloWorldForm extends ActionForm {
private final Factory personFactory = new Factory() {
@Override public Object create() { return new PersonForm(); }
};
// commons-collection 4 offers a LazyList<E> with generics
private List lazyPersons = LazyList.decorate(new ArrayList(), personFactory);
public List<PersonForm> getPersons() {
return lazyPersons;
}
public void setPersons(List<PersonForm> persons) {
this.lazyPersons = LazyList.decorate(persons, personFactory);
}
}
(也为 PersonForm
实现上面的代码)
需要动态增长的列表是一个常见的 Struts 问题。
如果您想进一步阅读,这里有一个解决方案目录:http://wiki.apache.org/struts/StrutsCatalogLazyList
我在 logic:iterate
中有一个 logic:iterate
。我可以编辑此 table 中的所有字段。对于每个 logic:iterate
我有一个 getXXX
行方法。
首先,我点击“添加”按钮。迭代充满了 3 个人。 第一个有一个地址,第二个有两个,第三个有三个。 (在实际应用中是动态的)
现在我更改了一些输入字段并单击我的发送按钮。现在调用行方法来初始化旧状态。但是我如何正确实施行地址方法呢?它只会被调用三次,但我必须准确填写人员字段并将其取回,或者?
希望它能像上一个线程一样更好地描述我的问题。
编辑: 尝试更好地解释它。我有一个个人列表,在我的 getRowPerson- 方法中没有问题,因为 "index" 仅来自此列表。但是现在我在这个例子中有三个地址列表,我无法关联哪个 "list" 调用了 getRowAdress。 (此时我必须return一个来自正确索引的正确人的地址,但我不知道这个人只知道地址列表中的位置)
如果 getRowAdress 在人 class 中,它也是不同的,但它从未调用过。
另一个问题是 getRowAdress 只被调用了三次,在我看来,我应该为每个地址行项目调用一次。以我为例六次。我认为内部迭代有问题。我尝试了 nested:iteration 但也没有用。
控制台:
adress index2<br>
adress index1<br>
adress index0<br>
person index1<br>
person index2<br>
person index0<br>
Html:
<logic:iterate id="rowPerson" name="iterateForm" indexId="rowIndex" property="persons" >
<html:text name="rowPerson" property="name" indexed="true"/>
<logic:iterate id="rowAdress" name="rowPerson" indexId="rowAdressIndex" property="address" >
<html:text name="rowAdress" property="addressname" indexed="true"/>
</logic:iterate>
<br>
</logic:iterate>
<html:submit value="Send" property="submitvalue"/>
<html:submit value="Add" property="submitvalue"/>
</html:form>
动作
public class HelloWorldAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
HelloWorldForm helloWorldForm = (HelloWorldForm) form;
String submitvalue = request.getParameter("submitvalue");
if (submitvalue == null) {
return mapping.findForward("success");
} else if ("Add".equals(submitvalue)) {
for (int i = 0; i < 3; i++) {
PersonForm person = new PersonForm();
person.setName("Person " + i);
for(int y = 0 ; y <= i ; y++){
AddressForm add = new AddressForm();
add.setAddressname("Adress" + y);
person.getAddress().add(add);
}
helloWorldForm.getPersons().add(person);
}
}
return mapping.findForward("success");
}
}
ActionForm
public class HelloWorldForm extends ActionForm{
private static final long serialVersionUID = -473562596852452021L;
private List<PersonForm> persons = new ArrayList<>();
public PersonForm getRowPerson(int index){
System.out.println("person index" + index);
while(persons.size() <= index){
persons.add(new PersonForm());
}
return persons.get(index);
}
public AddressForm getRowAdress(int index){
System.out.println("adress index" + index);
// ???? dont know ???
return new AddressForm();
}
public List<PersonForm> getPersons() {
return persons;
}
public void setPersons(List<PersonForm> persons) {
this.persons = persons;
}
}
Personform 和 Addressform 只有 setter & getter
您的 JSP 正在呈现此 HTML 代码:
<input type="text" name="rowPerson[0].name" value="Person 0">
<input type="text" name="rowAdress[0].addressname" value="Adress0">
这会在您的 HelloWorldForm
中触发对 getRowPerson(0)
和 getRowAdress(0)
的调用。但是我们实际上想要嵌套元素,为此我们必须使用 nested 标签库:
<nested:iterate property="persons">
<nested:text property="name"/>
<nested:iterate property="address">
<nested:text property="addressname"/>
</nested:iterate>
<br>
</nested:iterate>
这会生成:
<input type="text" name="persons[0].name" value="Person 0">
<input type="text" name="persons[0].address[0].addressname" value="Adress0">
使用相同的方法读取和写入列表可以简化解决方案。如果您的操作中的 scope
设置为 session
,这是默认值,那么您的表单将在您提交后覆盖值,您无需担心列表的动态增长。你可以简单地拥有:
public class HelloWorldForm extends ActionForm{
private List<PersonForm> persons = new ArrayList<>();
public List<PersonForm> getPersons() {
return persons;
}
public void setPersons(List<PersonForm> persons) {
this.persons = persons;
}
}
否则,如果您的操作映射中有 scope="request"
,在 struts-config.xml
中,您将需要动态重新创建列表。为此,一个选项是使用 commons-collection LazyList:
public class HelloWorldForm extends ActionForm {
private final Factory personFactory = new Factory() {
@Override public Object create() { return new PersonForm(); }
};
// commons-collection 4 offers a LazyList<E> with generics
private List lazyPersons = LazyList.decorate(new ArrayList(), personFactory);
public List<PersonForm> getPersons() {
return lazyPersons;
}
public void setPersons(List<PersonForm> persons) {
this.lazyPersons = LazyList.decorate(persons, personFactory);
}
}
(也为 PersonForm
实现上面的代码)
需要动态增长的列表是一个常见的 Struts 问题。 如果您想进一步阅读,这里有一个解决方案目录:http://wiki.apache.org/struts/StrutsCatalogLazyList