Логика Struts: повторять поле ввода
В настоящее время у меня есть следующий код, и данные отображаются нормально.
<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 ответа
Так что это сложно, потому что есть много вещей, которые нужно сделать, чтобы это работало. Во-первых, объявите ваши теги внутри итератора с тегами html, с атрибутом INDEXED=TRUE и идентификатором, ОТЛИЧНЫМ ОТ ИМЕНИ. Я также удалил атрибут 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 внутри вашего объекта коллекции, используя имя, которое вы написали в id тега iterate. В этом случае вы должны написать 2 дополнительных метода get и set для "myListI":
public void setMyListI(int index, myBean value){
this.myList.add(value);
}
public myBean getMyListI(int index){
return this.myList.get(index);
}
Я думаю, что ответ 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>
Таким образом, я не использовал Type в теге iterate, вместо этого использовал тег свойства. В bean-компоненте добавилось средство получения с сопоставленным именем идентификатора итерации в JSP (параметр) с индексом в качестве параметра метода.
Взгляните на это: http://wiki.apache.org/struts/StrutsCatalogLazyList
Индексированные свойства
HTML-теги Struts имеют индексированный атрибут, который будет генерировать соответствующий 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) для извлечения индексированного компонента, а затем setSkillId (..) для полученного компонента.
Теоретически, indexed
Для этого можно использовать атрибут html-тегов Struts:
Действительно только внутри
logic:iterate
тег. Если true, то имя тега html будет отображаться как "id[34].propertyName". Число в скобках будет сгенерировано для каждой итерации и взято из логики предка: итерационный тег.
Но нет соответствующего indexed
атрибут на html:errors
тег, который ограничивает его полезность. Также необходимая комбинация id
, name
а также property
атрибуты могут быть довольно запутанными.
Я обнаружил, что проще использовать jsp скриптлеты для генерации имени свойства, включая индекс итерации. Следующий код требует, чтобы ваша форма имела свойство строкового массива "количество".
<% int idx=0; %>
<logic:iterate ...>
<html:text property='<%= "quantity[" + idx + "]" %>'/>
<html:errors property='<%= "quantity[" + idx + "]" %>'/>
<% i++; %>
</logic:iterate>