0

Struts2 フレームワークを使用する JSP ページの次のコードが提供されました。

<s:form id="crud" action="crudmerge" namespace="templates">
    <s:hidden name="crudMode" />
    <s:hidden name="item.id" />    
    ...    
    <s:if test="crudMode == 1">             
            ...             
    </s:if>
    <s:else>
        <s:if test="%{version != null}">                
            ...             
        </s:if>
        <s:else>                
            ...             
        </s:else>
    </s:else>
</s:form>

この JSP ページを生成するアクション クラスには、(特に) 次のメソッドがあります: getCrudMode()getItem()、アイテムには と呼ばれるメソッドがありgetId()ます。

struts2 がこれらのメソッドを使用して<s:hidden>タグを埋める方法を理解しています。ただし、次の行に問題があります。

 <s:if test="%{version != null}">

getVersion()まず、これは他の 2 つと同じように機能し、Struts2 はアクション クラスのメソッドを実行すると思いました。ただし、呼び出されるフィールドversionもメソッドもありませんgetVersion()<s:set name="version">JSP には変数タグもありません。このコードのポイントは何でしょうか? %{}本当に必要ですか?

crudmodeこれは削除する必要があるレガシー コードである可能性がありますが、最初の 2 つとitem.id後者の違いが何であるかはわかりません%{version}

4

1 に答える 1

1

タグのtest属性にはs:ifを入れる必要はありません%{}。この省略形は OGNL 式の範囲を示すために使用され、評価前に削除されます。version評価している間、 で変数を検索していますvalueStack。アクション オブジェクトは にtopあるvalueStackため、名前の付いたプロパティが見つかった場合versionは実行getVersion()され、結果が返されます。アクションで が見つからなかった場合は、名前のプロパティが見つかるまでversion全体を検索し続けます。ほぼ同じことがドキュメントに記載されています。valueStackversion

XWork には特別な OGNL PropertyAccessor があり、探しているプロパティを持つオブジェクトが見つかるまで、スタック内のすべてのエントリを (上から下に) 自動的に調べます。

于 2013-11-28T11:22:18.457 に答える