-「Tapestryの不満点」より

プログラマー日記(http://www.programmers-paradise.com/tdiary/?date=20050618)via
sugaさんのところ(http://suga.parfe.jp/td/index.cgi?date=20050621)。sugaさんのところのリンクに気がつかなくてどういうことかわからんかったのですが、先ほどふと題名がリンクになってることに気がつく。てっきりsugaさんがTapestryで案件をはじめて不満に思ったのかと。。。(あ、再度見たら、sugaさん見やすく直してる!)なるほど、お答えしましょう。

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
    <title>Maya samples</title>
  </head>
  <body>
    <div class="box" id="message">hoge</div>
  </body>
</html>

こういうHTMLタグがあったとして、

<?xml version="1.0" encoding="Shift_JIS"?>
<maya xmlns:m="http://www.seasar.org/maya" 
    xmlns:c="http://java.sun.com/jsp/jstl/core">
  <c:forEach m:id="message" begin="1" end="10" var="i">
      <c:if test="${ (i % 2) == 0 }">
        <c:out value="こんにちは ${i} 回目"/>
      </c:if>
  </c:forEach>
</maya>

こういう感じに、ネストしたタグを記述することができます。
ほか、

  • 設定ファイルがわかりにくい(XMLだとしょうがない?)。やっぱりCGIKitのほうがわかりやすい。
  • jwcid属性名にはnamespacesのprefixをつけてほしい。設定オプションとかでもいいんだけど、デフォルトでprefixをつけておいてほしい。
  • ページごとにクラスを作成するのが面倒。VelocityのようにMap(に相当するオブジェクト)に値を突っ込んで、それをテンプレートエンジンに渡すような仕組みがあるとうれしい。
  • 記述量が多い。たかがWebページひとつ作るだけで、いろんなファイル書かないといけない。Railsほどじゃなくていいから、もうちょっと手軽に作れるようにしてほしい。
  • 一番初めは、意図がよくわからないのだけど、Mayaでは設定XML無しでHTMLに、m:injectで設定を全部書けば、.mayaファイルはなしでOK(そういうことじゃないのかな?)。
  • jwcidの機能は、idとm:injectに分離してます。idはHTMLの属性なのでプレフィックスなしですが、独自のinjectは「http://www.seasar.org/maya名前空間URIにマッピングされたプレフィックスを付加します。逆に付加しないと動きません。
  • ページ毎にPOJOクラスを設定することもできますし、無しでもOKです。これは同じ問題意識をもって設計してますので、満たしているでしょう、たぶん。リクエスト毎にオブジェクトを初期化するロジックについては、別に説明します。
  • 最後、実はRailsより簡単だと思うんだよね、Maya。ただ、RailsとちがってMayaは表層のテンプレ機能しかないから、比較できないと思いますけど。Java vs Rubyのどちらが簡単かという比較論と注意深く分離して、テンプレエンジンとしてだけ比較したら、いいとおもうんだけどなぁ。Mayaはまだドメスティックかつマイナーなんで、私はTapestryだけでなくRailsも見て考えているけど、ハワードさんやRailsの人はMayaを見てないだろうからね。

あと、アドバンテージなのかわかりませんが、実装に力が入ったところとしては、XPathによるインジェクション機能があります。先のHTMLに対し、

  <c:forEach m:xpath="//div[@class='box']" 以下省略

というように、XPathのパターンマッチでインジェクションできるので、HTMLに引っ掛けのid属性さえいらないです。テンプレートのパース結果モデルをツリーで持ってないかぎりできない機能なんですが、Tapestry3ではモデルを持たない局所パースなアーキテクチャなので、簡単には追加できないと思います。もしTapestry4のlibに、(いまさらゼロからHTMLパーサ書かないとおもうんで)NekoHTMLとかが入ってたらこの機能を盛り込んでくることなのかもしれません。
すでにリリース中の0.9.6でバグあるかもしれませんが、上記機能は全部できてます。