【问题标题】:Struts2 OGNL runtime expressionStruts2 OGNL 运行时表达式
【发布时间】:2012-02-10 11:09:31
【问题描述】:

我正在验证对象列表。为了向用户显示他们输入的错误内容,我需要在转换错误时重新填充字段。我读到为了重新填充页面上的字段值,我需要执行以下操作:

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

为了重新填充数组,我必须通过索引来引用它们。如此处所述: update a list of value in textfield in 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>

我正在为对象用户使用访问者验证器。

<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 的值。似乎它没有在 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">

我需要花费大量的英语努力来解释你们为什么误解了我。我们可以删除这个帖子吗?谢谢

【问题讨论】:

  • 计数器值将用于指向列表中对象的生日属性,如users.get(0).getBirthDay();,这意味着计数器实际上并不存在。
  • 不使用已有产品的“具体原因”是什么?
  • 虽然我们可以使用 Prepare 拦截器,即使有任何错误,它也会负责使值可用,但我仍然认为您的索引值不会存在。为什么您使用索引?可能还有其他的替代品
  • 实际上,即使我使用#status.index,我也无法完成这项工作。我通过过滤索引省略了列表中的一些值。这就是我使用备用索引计数器的原因

标签: validation struts2 ognl repopulation


【解决方案1】:

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

我不明白这个...

<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)“用户”是“用户”类型的列表,b)struts2转换框架已被告知用户是“用户”类型的列表这就像添加这样的注释一样简单:http://struts.apache.org/2.3.1.2/docs/keyproperty-annotation.html

满足这些条件...一次发送尽可能多的数据,而无需使用数组表示法,您可以重新填充字段。

现在,您为什么希望表单值在提交失败后重新填充?那是你如何使用验证?如果由于某种原因您不是,您已经在 INPUT 或 ERROR 的值上创建了一些操作映射以直接返回输入页面(当验证框架存在时,这是一种浪费努力)。

【讨论】:

  • 对不起,如果我在这里很固执。我们公司有一些政策,一定要尽量避免标注。因此应用程序可以具有可扩展性。这就是我使用数组表示法的原因。根据用户规范,如果验证失败,则必须重新填充表单值。我不知道为什么我的修改后的代码不适用于我的项目。也许是注释,我猜?我正在使用 Struts 2.2.3 和 Hibernate 4.0。对不起,如果我是这里唯一的固执者
  • @batbaatar:可扩展性与注解有什么关系?
  • 我猜,我们不想在 java 上输入常量字符串,而是在属性文件上的 XML 上输入
  • 注解使事情更具可读性,我喜欢 xml,但更适合全局设置。在 struts.xml 中设置 struts2 常量或定义拦截器堆栈对我来说最有意义,用 xml 声明我的 spring 服务是有意义的。但是在提供的示例中,struts2 将假定列表的值是字符串或映射的值是字符串。因为擦除它不能更好地知道所以你需要告诉它类型,注释是最有意义的。但是你可以,如果你真的想使用一个属性文件......你会在文档中看到如何。
【解决方案2】:

请尝试以下代码,它可能会工作

<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>

【讨论】:

  • 我不这么认为,我的计数器在其他 struts 标签上工作正常。当我将计数器更改为 0 时,它会正确获取 users[0].birthdate 的值。当我使用上面的代码时,它在该字段上什么都没有显示。
  • 我的 JAVA 上没有名为 COUNTER 的变量,会不会导致这个问题?
  • “修复了 OGNL”是什么意思。我的 OGNL 出了什么问题?
  • 好的。但是那个正确的 OGNL 不适用于我的项目。正如我告诉你的那样,如果我像这样输入常量值: value="%{users[0].birthdate}" 它会得到正确的值。这就是为什么我认为我的列表没有问题。
  • @DaveNewton 对不起,我不相信你在你的电脑上试过。你能告诉我你使用的整个代码吗?使用 pastebin 什么的。也许我可以通过看到你的错误来理解我的错误
猜你喜欢
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2014-05-06
相关资源
最近更新 更多