既存の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()することができ、それらは正しく表示されています。ただし、これらの値はタイル属性に渡されません。
これを修正する方法はありますか?
${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の詳細については、 このチュートリアル を参照してください。