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

最後に、submit タグ:

<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}}、うまくいきました。

しかし、なぜそれが機能するのか説明できません...

4

1 に答える 1

0

確認せずに、次の説明が役立つと思います。

OGNL で OGNL 式をエスケープすることを考慮する%{}と、次のことが適用されます。

OGNL には、ルート コンテキストからBean の値を取得する式#beanNameorがあります。次のようにすると、実際には最初に Bean の名前を検索し、次にその文字列を使用して OGNL ルート コンテキストで値を検索します。${beanName}beanName#${beanName}

したがって、 について#${param.innerDdAttr}.idは、次のことが起こります。

  • OGNLparamコンテキストで検索する
  • プロパティの値を取得しinnerDdAttrます (おそらく「ddRepeatingAttrId」の値が得られます)。
  • これは が#${param.innerDdAttr}.idに解決されることを意味する#ddRepeatingAttrId.idので、
  • OGNLddRepeatingAttrIdコンテキストで検索する
  • プロパティの値を取得しidます (「4」の値が得られます)。

対照的に、#${param.objId}何が起こるかは次のとおりです。

  • OGNLparamコンテキストで検索する
  • プロパティの値を取得しobjIdます(おそらく値「7」になります)
  • これは が#${param.innerDdAttr}.idに解決されることを意味する#7ので、
  • OGNL7コンテキストを検索しても何も見つからないため、何も出力されません。

IMHO、代わりに%{#${param.objId}}、おそらく必要%{#param.objId}または単に%{param.objId}(違いは#、ルートコンテキストのみを考慮し、そうでない場合はOGNLコンテキストを検索することです)。

それが役立つことを願っています。

于 2012-06-27T08:10:48.897 に答える