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 поле вашей формы бобов.

И, конечно же, вам нужно убедиться, что вы используете бин формы в области сеанса, а не в области запроса.

Другие вопросы по тегам