web-dev-qa-db-ja.com

JSPからタイル属性に値を渡す方法は?

既存のTiles1WebアプリをTiles2アーキテクチャに変換しています。 JSPページからタイル属性に値を渡すのに問題があります。

これが私のタイル定義ファイル(tiles-definition.xml)です

<tiles-definitions>

    <definition name="cda.layout" template="/jsp/layouts/layout.jsp">
        <put-attribute name="pageTitle" value="StoryTitle" type="string"/>
        <put-attribute name="pageHeader" value="StoryHeader" type="string"/>
        <put-attribute name="resources" value="" type="string"/>
    </definition>

</tiles-definitions>

Layout.jspは次のようになります。

<html>
    <head>
    <title><tiles:insertAttribute name="pageTitle" flush="true"/></title> 
    </head>

    <body>
    ...
    ...

    <div class="content">
    <h1><tiles:insertAttribute name="pageHeader" flush="true"/></h1>
    </div>

    ...
    ...
    </body>
</html>

レイアウトを使用するストーリーページがあり、テンプレート属性に値を渡す必要があります。

    <%
    // create a business object and populate
    String mytitle= story.getTitle();
    String myheader = story.getHeader();
    %>

<tiles:insertTemplate template="../layouts/layout.jsp"  flush="false" >
    <tiles:putAttribute name="pageTitle" value="${mytitle}"/>
    <tiles:putAttribute name="pageHeader"value="${myheader}"/>
</tiles:insertTemplate>

Story.jspで、mytitle、myheaderの値をSystem.out.print()することができ、それらは正しく表示されています。ただし、これらの値はタイル属性に渡されません。

これを修正する方法はありますか?

10
Srinath Dasu

${mytitle}はJSPEL式です。つまり、「mytitle」という名前のページスコープ、リクエストスコープ、セッションスコープ、またはアプリケーションスコープで属性を検索します。

スクリプトレット変数を定義することにより、これらのスコープのいずれにも属性を定義していません。あなたが持っていればそれはうまくいくでしょう

pageContext.setAttribute("mytitle", mytitle);

ただし、JSPでスクリプトレットを使用することは悪い習慣です。あなたのストーリーBeanがどこから来たのかわかりませんが、おそらくリクエスト属性です。その場合、JSTLを使用して、次のように新しいページスコープ属性を定義できます。

<c:set var="mytitle" value="${story.title}"/>

ただし、この式はtilesタグで直接使用できるため、これは不要です。

<tiles:putAttribute name="pageTitle" value="${story.title}"/>

JSP ELの詳細については、 このチュートリアル を参照してください。

18
JB Nizet