s:includeによるJSPの部品化再び

以前JSPの部品化を検討したときに s:includeによる部品化は仮引数が使えないなどいまいち使い勝手が良くないと結論付けたが最近とても良い方法を思いついた。

それは

s:pushと組み合わせて仮引数的な扱いの変数をs:includeに渡す方法である。

たとえば次のように何か固定的なフォーマットでの出力を行うテンプレートの buhin.jsp を用意したとして、message や value が変数とする。

<%@page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:property value="message"/><br>
<s:property value="value"/>

呼び出し側では

  :
<s:push value="#{ 'message' : 'TESTのメッセージ',
                  'value'   : 'TESTの値' }"/>
  <s:include value="buhin.jsp"/>
</s:push>
<s:push value="#{ 'message' : 'TEST2のメッセージ',
                  'value'   : 'TEST2の値' }"/>
  <s:include value="buhin.jsp"/>
</s:push>
  :

とすればいい。

これはs:pushにより生成したMapがValueStackの一番上に積まれるため s:include では特に指定なしにプロパティが参照できて仮引数のように扱える
名前空間も汚染されないので、部品化した中でさらに別の部品を呼び出すような場合も名前の衝突など気にせず行える。

この方法による部品化は s:component によるものより大分使い勝手が良い。
また変数もグローバル変数で渡すよりは抵抗が少ない。