在我的JSP中,我有:
<s:textarea name="${param.objId}"/>
这将呈现以下内容:
<textarea name="categoryObject.linkAttrValue[#ddAttr.id].link.id"
cols="" rows=""
id="browseCategoryObject_categoryObject_linkAttrValue_#ddAttr_id__link_id">7</textarea>
同样,我有一个属性标签:
<s:property value="${param.objId}"/>
它呈现:
7
最后,提交标签:
<s:submit action="addRepeatingCategoryObject" value="addNew"
onclick="$('input[name=ddRepeatingAttrId]').val(%{#${param.objId}}); alert(%{#${param.objId}}); $('input[name=ddRepeatingAttrId]').val(%{#${param.innerDdAttr}.id}); " />
呈现:
<input type="submit" id="browseCategoryObject_addRepeatingCategoryObject"
name="action:addRepeatingCategoryObject" value="addNew"
onclick="$('input[name=ddRepeatingAttrId]').val(); alert(); $('input[name=ddRepeatingAttrId]').val(4); "/>
表达式%{#${param.innerDdAttr}.id}
在s:submit
中解析,但%{#${param.objId}}
不是在s:submit
中解析,而是在s:property
和s:textarea
中解析。
有人知道它为什么以这种方式工作吗?
我尝试了%{${param.objId}}
而不是%{#${param.objId}}
,它奏效了。
但我无法解释为什么它有效...
在没有检查的情况下,我认为以下解释应该会有所帮助:
考虑到在 OGNL %{}
中转义 OGNL 表达式,以下内容适用:
在 OGNL 中,您有一个表达式#beanName
或${beanName}
,用于从根上下文中获取 Bean beanName
的值。 如果执行以下操作:#${beanName}
,实际上将首先查找 Bean 的名称,然后使用该字符串在 OGNL 根上下文中查找值。
因此,对于#${param.innerDdAttr}.id
,会发生以下情况:
- 在 OGNL 上下文中查找
param
- 获取
innerDdAttr
属性的值(大概会给你一个值"ddRepeatingAttrId") - 这意味着
#${param.innerDdAttr}.id
将解析为#ddRepeatingAttrId.id
,因此 - 在 OGNL 上下文中查找
ddRepeatingAttrId
- 获取
id
属性的值(该属性的值为"4")。
相比之下,对于#${param.objId}
,发生的事情是:
- 在 OGNL 上下文中查找
param
- 获取
objId
属性的值(大概会给你一个值"7") - 这意味着
#${param.innerDdAttr}.id
将解析为#7
,因此 - 在 OGNL 上下文中查找
7
,该上下文找不到任何内容,因此不会打印任何内容。
恕我直言,而不是 %{#${param.objId}}
,您可能想要%{#param.objId}
或只是%{param.objId}
(不同之处在于,使用 #
它只会考虑根上下文,否则搜索 OGNL 上下文)。
希望有帮助。