<html: select> внутри <logic: iterate> - PullRequest
2 голосов
/ 26 ноября 2011

У меня есть itemList, и для каждого item отображается раскрывающийся список оценок.После того, как пользователь оценил каждый item в itemList, я хочу сохранить эти ставки в массиве.Как мне это сделать?selectedRate ниже относится к типу Integer, и код не смог решить проблему.

<logic:iterate id="item" name="itemList">
  <tr>
    <td>
      <html:select name="aForm" property="selectedRate">
        <html:optionsCollection name="allRates" label="description" value="value" />
      </html:select>
    </td>
  </tr>
</logic:iterate>

1 Ответ

4 голосов
/ 26 ноября 2011

Каждый параметр select должен быть связан с конкретным элементом.

Самый простой способ - использовать коллекцию Item с и присвоить каждому Item a rating свойство. Я использовал Integer для этого примера.

<html:select> использует обозначение массива и напрямую устанавливает рейтинг каждого элемента. (я использую список тарифов из самой формы и более простую схему; игнорируйте эти различия.)

<logic:iterate id="item" name="ratesForm" property="itemList" indexId="i">
  ${item.name}&nbsp;
  <html:select property="itemList[${i}].rating">
    <html:optionsCollection name="ratesForm" property="rates" label="description" value="value" />
  </html:select>
  <br/>
</logic:iterate>

Действие позволяет получить рейтинг предметов, как мы и ожидали:

RatesForm ratesForm = (RatesForm) form;
List<Item> items = ratesForm.getItemList();
for (Item item : items) {
    System.out.println(item.rating);
}

Если у предметов нет ассоциированного рейтинга, вам нужно будет использовать карту ключей идентификаторов предметов и значений рейтинга. Это более запутанный; Я рекомендую коллекцию.

Во-первых, карта будет Map<String, Object> из-за способа работы индексированных свойств. В дополнение к обычному получателю для самой карты, предоставьте индексированные методы:

private Map<String, Object> itemRatings;

public Map<String, Object> getItemRatings() {
    return itemRatings;
}

public Object getItemRating(String key) {
    return itemRatings.get(key);
}

public void setItemRating(String key, Object val) {
    itemRatings.put(key, val);
}

JSP будет аналогичным, но используйте "()" вместо "[]" для использования методов индексированной формы.

<logic:iterate id="item" name="ratesForm" property="itemList">
    ${item.name}&nbsp;
      <html:select property="itemRating(${item.id})">
        <html:optionsCollection name="ratesForm" property="rates" label="description" value="value" />
      </html:select>
    <br/>
</logic:iterate>

Когда форма отправлена, карта itemRatings будет содержать строковые ключи, представляющие идентификатор каждого элемента. Ключ и значение будут String с, и вам нужно будет выполнить любые преобразования в числовые значения вручную.

...