Логика 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>
Другие вопросы по тегам