struts2 ognl expression



在我的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中解析。

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


我尝试了%{${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 上下文)。

希望有帮助。

最新更新