struts2 ognl表达式

时间:2012-06-27 07:47:12

标签: struts2

在我的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:propertys:textarea中解决。{ / p>

有人知道为什么它会以这种方式运作吗?


我尝试了%{${param.objId}}而不是%{#${param.objId}},而且效果很好。

但我无法解释为什么会有效......

1 个答案:

答案 0 :(得分:0)

如果没有检查过,我认为以下解释应该有所帮助:

考虑到在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上下文)。

希望有所帮助。