1

在我的 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:propertyand 中解析s:textarea

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


我试过%{${param.objId}}而不是%{#${param.objId}}它,它奏效了。

但我无法解释为什么它会起作用......

4

1 回答 1

0

在没有检查的情况下,我认为以下解释应该会有所帮助:

考虑到在 OGNL 中%{}转义了 OGNL 表达式,以下适用:

在 OGNL 中,您有一个表达式#beanName或从根上下文${beanName}中获取 bean 的值。beanName如果您执行以下操作:#${beanName},您实际上将首先查找 bean 的名称,然后使用该字符串在 OGNL 根上下文中查找一个值。

因此,对于#${param.innerDdAttr}.id,会发生以下情况:

  • param在 OGNL 上下文中查找
  • 获取innerDdAttr属性的值(大概会给你一个“ddRepeatingAttrId”的值)
  • 这意味着#${param.innerDdAttr}.id将解析为#ddRepeatingAttrId.id,那么
  • ddRepeatingAttrId在 OGNL 上下文中查找
  • 获取id属性的值(它为您提供“4”的值)。

相反,#${param.objId}发生的事情是:

  • param在 OGNL 上下文中查找
  • 获取objId属性的值(大概是你的值“7”)
  • 这意味着#${param.innerDdAttr}.id将解析为#7,那么
  • 在 OGNL 上下文中查找7,它没有找到任何内容,因此它不打印任何内容。

%{#${param.objId}}恕我直言,您可能想要%{#param.objId}或只是想要而不是%{param.objId}(不同之处在于#它只会考虑根上下文,否则搜索 OGNL 上下文)。

希望有帮助。

于 2012-06-27T08:10:48.897 回答