Struts 1: форма может читать значение компонента, но при отправке не записывает в него
Здравствуйте, дорогие люди переполнения стека. Недавно я столкнулся с проблемой в моем приложении Struts. У меня есть JSP, который отображает некоторые значения бина правильно (я вставляю только соответствующую часть кода, я упростил до крайности):
<table>
<logic:iterate name="bean" property="list1" id="listItem">
<tr>
<td>
<html:checkbox name="listItem" property="selected">
</html:checkbox>
</td>
</logic:iterate>
</table>
У моего bean-компонента есть свойство list1 с его методами получения и установки
private List<RandomObject> list1;
public List getList1() {
return list1;
}
public void setList1(List list1) {
this.list1=list1;
}
и мой подчиненный компонент имеет выбранное свойство:
private boolean selected;
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
Теперь, когда вводите этот jsp, значения, которые я получаю, являются правильными, то есть: если мой сопоставленный объект в БД был в selected=true, флажок установлен. Что я не получаю, это как сохранить изменения, которые я делаю в этой форме. Когда я отправляю, все изменения теряются. Это связано с чисто Struts, потому что при отладке, когда я вхожу в StrutsAction, связанный с отправкой, полученная мной ActionForm уже потеряла все интересные значения. Также я чувствую, что это связано с тем фактом, что значение, которое я хочу сохранить, не хранится непосредственно в главном компоненте, а является свойством вспомогательного компонента, поскольку на той же странице есть много других свойства непосредственно на главном бобе, что у меня нет проблем с сохранением.
Что я упустил?
2 ответа
В моем случае я должен был поместить атрибут имени в итерации, иначе это дает мне ошибку (не может найти свойство ни в одном бине...)
Я решил удалить имя атрибута в флажок: кажется, он создает новый объект в области видимости страницы, который не связан с формой.
Это мой код:
<nested:iterate id="apertura" type="it.puglia.innova.view.actionform.AperturaForm" indexId="index" name="strutturaRuraleForm" property="listAperturaForm">
<nested:checkbox styleId="checkbox_${index}" property="flagContinuato" onchange="changeOrarioContinuato(${index})"/>
вот и все:-) не нужно также менять html: форму на вложенную.
до свидания
Возможно, это неправильно name
атрибуты в отображаемом HTML. Если вы посмотрите на сгенерированный исходный код вашей страницы, он, вероятно, выглядит так:
<input type="checkbox" name="selected" ...>
который будет искать selected
поле в вашей форме класса бобов.
Если вы используете коллекцию, которая является полем в компоненте формы, вы хотите использовать <nested:form>
, <nested:iterate>
а также <nested:checkbox
Теги Struts, а не <html:form>,
and
`ы. Так что это будет выглядеть так:
<nested:form action="foo">
...
<nested:iterate property="list1" id="listItem">
<tr>
<td>
<nested:checkbox property="selected">
</nested:checkbox>
</td>
</tr>
</nested:iterate>
...
</nested:form>
Обратите внимание, что я удалил name
атрибуты из тегов Struts, потому что они не нужны (по моему опыту они действительно вызывают всевозможные проблемы - если вы используете <nested:*>
теги не используют name
атрибуты). В случае с <nested:iterate>
уровень вложенности - это сам компонент формы, поэтому он знает, что ему нужно искать list1
собственность в виде бобов.
Этот тег создает свой собственный уровень вложенности, поэтому <nested:checkbox
знает, что нужно искать selected
свойство текущего элемента в итерации.
Визуализированный HTML будет выглядеть примерно так (для первого элемента):
<input type="checkbox" name="list1[0].selected" ...>
что означает selected
поле первого элемента (индекс 0) в коллекции, на которую ссылается list1
поле вашей формы бобов.
И, конечно же, вам нужно убедиться, что вы используете бин формы в области сеанса, а не в области запроса.