Struts2 OGNL运行时表达式



我正在验证对象列表。为了向用户显示他们键入的错误内容,我需要重新填充转换错误的字段。我读到为了重新填充页面上的字段值,我需要做这样的事情:

<s:textfield name="user.name" value="%{user.name}"/>

对于重新填充数组,我必须通过索引引用它们。如前所述:更新struts2 中文本字段中的值列表

我有一个用户列表,我需要对其进行验证。由于特定的原因,我在迭代器上有自己的索引计数器。

<s:set name="counter" value="0"/>
<s:iterator value="users" var="user">
   <s:textfield name="users[%{#counter}].birthdate" value="%{users[#counter].birthdate}"/>
   <s:set name="counter" value ="%{#counter + 1}"/>
</s:iterator>

我正在使用对象User的访问者验证器。

<field name="birthdate">
    <field-validator type="conversion">
        <param name="repopulateField">true</param>
            <message>${getText("E011", {"birthdate"})}</message>
    </field-validator>
</field>

正如我所说,由于特定的原因,我不使用迭代器索引计数器。

问题是这个value="%{users[#counter].birthdate}"部件不工作。如果我将counter更改为0,它将重新填充users[0]的值。birthdate right。似乎它并没有得到OGNL表达式中计数器的值。

我尝试过:

value="%{users[counter].birthdate}"
value="%{users[%{#counter}].birthdate}"
...
and so on.

有人能帮我做这件事吗?

更新

最后,我应该提到我的特殊情况:

<s:iterator value="users" var="user" status="status">
  <s:if test="#status.index != removeIndex">

我发现我不需要为字段名指定值来重新填充值。但我需要使用它,因为这条线:

<s:if test="#status.index != removeIndex">

我会花很多英语来解释你们为什么误解我。我们可以删除这个帖子吗?。感谢

如果你问如何做某事会更好。。。而不是说你有理由这样做,当然这种方式行不通。它让我头疼。。。

我不明白。。。

<s:set name="counter" value="0"/>
<s:iterator value="users" var="user">
   <s:textfield name="users[%{#counter}].birthdate" value="{users[counter].birthdate}"/>
   <s:set name="counter" value ="%{#counter + 1}"/>
</s:iterator>

我会重写(不测试)我认为你的意思。。。

<s:iterator value="users">
   <s:textfield name="users.birthdate" value="birthdate"/>
</s:iterator>

以上要求满足以下条件。。。a) "users"是一个类型为"User"的列表,b)struts2转换框架被告知users是一个"User"类型的列表,只需添加这样的注释即可:http://struts.apache.org/2.3.1.2/docs/keyproperty-annotation.html

在满足这些条件的情况下。。。一次发送尽可能多的字段,而不需要使用数组表示法,就可以重新填充字段。

现在,为什么您希望表单值在提交失败后重新填充?这就是您使用验证的方式?如果出于某种原因,您没有创建INPUT或ERROR值的操作映射,以直接返回到输入页面(当验证框架存在时,这有点浪费精力)。

请尝试下面的代码,它可能工作

<s:set name="counter" value="0"/>
<s:iterator value="users" var="user">
  <s:textfield name="users[#counter].birthdate" value="%{users[#counter].birthdate}"/>
  <s:set name="counter" value ="%{#counter + 1}"/>
</s:iterator>

最新更新