AFAIK вы должны использовать:
<s:form action="hello-world">
<s:textfield name="helloBeans[1].name" label="name1"/>
<s:textfield name="helloBeans[1].age" label="age1"/>
<s:textfield name="helloBeans[2].name" label="name2" />
<s:textfield name="helloBeans[2].age" label="age2"/>
<s:submit />
</s:form>
Я думаю, что самая большая проблема не в том, что это должно быть сделано таким образом, а в том, что вы думаете, что это означает, что он не может быть динамическим, считайте, что текстовые поля отображаются более-менее (на самом деле меньше, потому что я удалил 'id' и атрибуты 'value'):
<input type="text" name="helloBeans[1].name"/>
<input type="text" name="helloBeans[1].age"/>
...
Нет причины, по которой вы просто не можете обрабатывать это в вашем jsp динамически, как это делается для проверки представления:
<h1>Display HelloBeans</h1>
<table>
<s:iterator value="helloBeans">
<tr>
<td><s:property value="name"/></td>
<td><s:property value="age"/></td>
</tr>
</s:iterator>
</table>
Или, если ваша проблема на стороне клиента, тогда используйте JavaScript (или, лучше, библиотеку JS, такую как jQuery), чтобы добавить новые текстовые поля в DOM ... и используйте конкатенацию строк для построения правильного OGNL для атрибутов 'name'.
Обратите внимание, если ваше динамическое поведение на стороне сервера в JSP, тогда
<s:property value="#helloBeans.index" />
даст вам индекс текущей итерации при использовании внутри тега s: iterator.