動的なTilesのレイアウト変更

個別のページでinsertDefinition タグを呼び出して、name属性でレイアウト指定をしているが、nameに渡す属性は単なる文字列だからランタイムに変更できるはずなので実用するかどうかは別として試してみる。

tilesはStruts2のタグではないのでOGNL評価はしてくれない、色々試した結果次のようにすると動いた。

<tiles:insertDefinition name="<%= (String)request.getAttribute("layout") %>">
 <tiles:putAttribute name="title">タイトル</tiles:putAttribute>
 <tiles:putAttribute name="body" role="ROLE_USER">
  ボディー
 </tiles:putAttribute>
</tiles:insertDefinition>

struts.xml では例えば次のようにして layout をランタイムに設定

<action name="test" class="AuthenticationAction" method="doNothing" >
   <result type="dispatcher">${ (#request.layout='default.layout'), "/jsp/test.jsp" }</result>
</action>

<%= %> がいまいちだけど、まあ、おまじないなのでよしとする。※もっといい書き方があれば突っ込みを入れてください。

これなら layout と page を別々に指定する result-type とか簡単に作れそうだ。