Struts2 Заполнить списки - PullRequest
1 голос
/ 26 марта 2012

У меня проблемы с заполнением списка пользовательских атрибутов объекта в Struts2.

Вот мой пример (опущены получатели / установщики):

public class Foo {private Stringattr1;приватная строка attr2;}

public class Bar {private List foos;}

открытый класс StrutsAction extends ActionSupport {private Bar bar;}

У меня есть код в JSP следующим образом (извлечение):

<tr><td><input type="text" name="bar.foos.attr1"/></td><td><input type="text" name="bar.foos.attr2"</td></tr>
<tr><td><input type="text" name="bar.foos.attr1"/></td><td><input type="text" name="bar.foos.attr2"</td></tr>

Мне нужна каждая строка таблицы, чтобы создать 1 элемент foo в списке с каждым атрибутом, однако мой кодсоздает новый объект foo для каждого атрибута при прохождении, и я получаю 4 foos вместо 2!

Я понимаю, что могу решить проблему с жестким кодированием индекса в html следующим образом:

<tr><td><input type="text" name="bar.foos[0].attr1"/></td><td><input type="text" name="bar.foos[0].attr2"</td></tr>
<tr><td><input type="text" name="bar.foos[1].attr1"/></td><td><input type="text" name="bar.foos[1].attr2"</td></tr>

Мне было интересно, можно ли это сделать без жесткого кодирования индексов?

Ответы [ 2 ]

0 голосов
/ 26 марта 2012

Вы сказали, что у вас есть переменное количество строк. Давайте назовем это numOfRows ... Попробуйте переписать ваш пример так:

<table>
<s:iterator status="stat" value="(numOfRows).{ #this }" >
    <tr>
        <td><input type="text" name="bar.foos[%{#stat.index}].attr1"/></td>
        <td><input type="text" name="bar.foos[%{#stat.index}].attr2"/></td>
    </tr>
</s:iterator>
</table>

Вы можете найти документы о теге Iterator там ... Посмотрите на нижнюю часть страницы.


Если у вас нет numOfRows на этапе рендеринга, то я боюсь, что единственный способ генерировать текстовые поля - это JavaScript на стороне клиента ....

[EDIT]

Относительно индексов ... Вам не нужно беспокоиться, если у вас есть индексы примерно так:

<table>
    <tr>
        <td><input type="text" name="bar.foos[0].attr1"/></td>
        <td><input type="text" name="bar.foos[0].attr2"/></td>
    </tr>
    <tr>
        <td><input type="text" name="bar.foos[3].attr1"/></td>
        <td><input type="text" name="bar.foos[3].attr2"/></td>
    </tr>
    <tr>
        <td><input type="text" name="bar.foos[5].attr1"/></td>
        <td><input type="text" name="bar.foos[5].attr2"/></td>
    </tr>
</table>

Struts сделает преобразование просто правильно ... Вы просто должны знать, что объекты, индексы которых отсутствуют, будут нулевыми ... Поэтому вы должны отфильтровать их в действии.

0 голосов
/ 26 марта 2012

Я думаю, вы можете использовать тег итератора Struts 2:

<s:iterator var="foo" value="bar.foos">
   <tr><td><s:property value="attr1"/> .....
</s:iterator>

Если он не работает, мы можем подумать о другом решении.

Более подробную информацию вы можете найти здесь: http://struts.apache.org/2.3.1/docs/iterator.html

[] с

...