Вы сказали, что у вас есть переменное количество строк. Давайте назовем это 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 сделает преобразование просто правильно ... Вы просто должны знать, что объекты, индексы которых отсутствуют, будут нулевыми ... Поэтому вы должны отфильтровать их в действии.