ひがやすを技術ブログ

電通国際情報サービスのプログラマ

LayoutとViewのコンポーネント

上記のように訂正。
まさたかさんのコメントを受けて、Viewのコンポーネントは、Maya風にしました。Maya風と書いているのは、Mayaのようにt:hoge.htmlのようにプレフィックスはつけないためです。レイアウトの継承をサポートするなら、Viewのコンポーネントを使うのは、ほぼ一ヶ所になるので、S2JSFとしては、はずしてあります。


layout.html


<html xmlns:m="http://www.seasar.org/maya">
<meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" />
<head>
<title><span m:value="#{title}"/></title>
</head>

<body>
<table border="0" width="100%" cellspacing="5">
<tr>
<td colspan="2"><span m:inject="header.html" m:title="#{title}"/></td>
</tr>
<tr>
<td width="140" valign="top">
<span m:inject="menu.html"/>
</td>
<td valign="top" align="left">
<span m:inject="s:insert" m:name="body"/>
</td>
</tr>
<tr>
<td colspan="2">
<hr>
</td>
</tr>
<tr>
<td colspan="2">
<span m:inject="footer.html"/>
</td>
</tr>
</table>
</body>
</html>

継承してパラメータを上書きすることも出来ます。

hoge.html


<html xmlns:m="http://www.seasar.org/maya" m:extends="layout.html">
<span m:inject="f:param" m:name="title" m:value="hogeタイトル"/>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" />
<head>
<title>hogeどうせ無視される
</head>
<body>
この辺に適当に書いても実行時には無視される
<span m:inject="s:insert" m:name="body">
ここに個別のページの内容を記述
</span>
この辺に適当に書いても実行時には無視される
</body>
</html>
個人的な感想で言えば、inject属性でtaglib以外の様々なものを指定できるようにするのは避けたいと思っています。仕様が増えるたびに既存のソースに手が入るためです。
inject属性では、taglibのみを指定するということにしておけば、仕様が追加されても新しいtaglibを追加するだけで済みます。