struts2 s:选择值ognl表达式

struts2 s:选择值ognl表达式,struts2,ognl,Struts2,Ognl,在Struts2标签教程中,我看到: <s:select label="Pets" name="petIds" list="petDao.pets" listKey="id" listValue="name" multiple="true" size="3" required="true" value="%{petDao.pets.{id}}" />

在Struts2标签教程中,我看到:

<s:select label="Pets"
       name="petIds"
       list="petDao.pets"
       listKey="id"
       listValue="name"
       multiple="true"
       size="3"
       required="true"
       value="%{petDao.pets.{id}}"
/>                          ^  ^

我的问题是:为什么value=%{petDao.pets.{id}?为什么不简单地使用value=%{petDao.pets.id}?这些后面的大括号是什么意思?

主要原因是%{}语法用于强制OGNL求值,否则Struts会将值视为字符串文本

比如说,

将在值堆栈中查找name属性,即通过调用getName检索的值

如果要强制它使用文本值名称,则需要使用%{}语法-

资料来源:
这是不必要的;我怀疑这是由于标记源文件中的错误造成的


如果IDE支持S2和/或OGNL,例如IntelliJ,并且我已经做了一个更新说明,那么它可以使用,但不是必需的,它将无法通过IDE验证。

这是一个从petDao.pets获取所有id值作为列表的方法,这意味着其中的所有值都将被预先选择。

误解:我知道什么是%{}但是我不知道…pets.{id}和…pets.id之间的区别提供的链接更多的是用来区分值堆栈上的项和值堆栈上下文中的项,例如,需要引用的项。这里没有任何涉及字符串文字的内容,如果有什么的话,引用S2或OGNL文档会让误解变得更有意义。哦,对不起,老实说,我不知道为什么,但可能是因为语言语法,问候语@这是完全合法的OGNL表达。@AndreaLigios不,Aleksandr是正确的;这是一个列表投影,一个OGNL特性,我已经不止一次忘记了。在本教程中,这可能是正确的行为,也可能不是正确的行为,在我看来,这似乎不太可能是目的,但我不知道。我将删除这个答案。有趣!您可以编辑而不是删除,您或AleksandrM应该从中添加更多详细信息,例如,+1,我再次忘记了OGNL的一些功能。这很讽刺,因为我曾经在S2邮件列表上被非正式地加冕为OGNL之王,因为我会用它做一些奇怪的事情。尽管我不相信这是一个好例子,或者在本教程的上下文中是正确的。我仍然要删除它以避免混淆,因为它至少也不被IntelliJ识别,导致更多混淆。同意,它不应该出现在标记示例中。