uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

SiteMesh概要

SiteMeshはGrailsの重要な構成要素のひとつですが、他のもの(Groovy, Spring, Hibernate)と比べると知名度は低いですよね。日本語の情報もあまりありません。

なのでちょっとhttp://www.opensymphony.com/sitemesh/にあるSiteMesh概要を要約してみました。


(翻訳ここから)

SiteMesh概要

java.netにある「Will IversonのSiteMesh紹介」を読んで始めてもいいよ。
あるいは全然読まずに今すぐにダウンロードしても良いかもね。

  • SiteMeshはwebページのレイアウトとデコレーションのためのフレームワークで、一貫性をもったルック&フィール、統一的なナビゲーションとレイアウトスキーマが必須であるような、たくさんのページからなる大規模サイトの作成を助けるwebアプリケーション統合フレームワークでもあります。
  • SiteMeshはWebサーバ経由で要求される任意の静的もしくは動的なHTMLページに対するリクエストを横取りし、ページを構文解析して、コンテンツからプロパティとデータを生成し、オリジナルのページに変更を加えて、最終的に適切なページを生成します。これは良く知られたGang Of Fourの「デコレータ」デザインパターンに基づいています。
  • また、SiteMeshはHTMLページ全体を他のページの一部のパネルとしてインクルードすることもできます。これはサーバサイドインクルードと似ていますが、HTMLドキュメントはページ中のヴィジュアルウィンドウを作成するために(ドキュメントのメタデータを利用しつつ)変更されます。この機能を使ってポータル型のWEBサイトを手早く効果的に作成することができるのです。これはよく知られたGOFの「コンポジット」デザインパターンに基づいています。
  • SiteMeshはJava 2のServlet, JSPそしてXML技術を使って作られています。このことはJ2EEアプリケーションでの利用には理想的なのですが、CGI(Perl/Python/c/c++/etc)やPHP、Cold FusionなどのJavaベースではないWEBアーキテクチャ(CGI, PHP,)に対しても統合に用いることができます。
  • SiteMeshは極めて拡張性が高く、カスタマイズのしやすいやりかたで設計されています。


問題


世の中ではたくさんのWebアプリケーションプラットフォームが使われており、フレームワークの数はそれ以上です。典型的には、WEBアプリケーションは特定のプラットフォーム上の特定のフレームワークに対して作成されます(たとえばJ2EEプラットフォーム上のカスタムJSPタグライブラリを使って、あるいはCGIを用いたカスタムPerlコラボレーションAPIを使って、あるいはPHPですでに書かれたアプリケーションとか)。WEBサイトは多種多様な技術を使って作られたたくさんのWEBアプリケーションでできているのです。


しかしながら、これらのWebアプリケーションは固有の表示がなされ、それぞれに期待するように動作するので、既存のWEBサイトのレイアウトに統合することは困難となり、独立したまま単なるハイパーリンクとしてサイトにくっつけておくことになりがちです。


このもっとも大きな原因は、サイトがカスタム開発によるページ/アプリケーション、および「持ってきて箱から出せばすぐに動く」ような、すでに出来上がったソフトウェアの混合だということです。これらのソフトウェアは、サイトの他の部分のルック&フィールと同じように設定すべきなのにそれは難しく、開発者がサイトの他のページのアプリケーションの断片を使うのに制約があります。


たとえば、一貫して整合性のあるサイトで検索して、「検索結果」ページにいったとたん、同じサイトにいるのかどうかわからなくなったりしたことはありませんか?あるいは、あなたのサイトに使いたいのに、既存の部分に統合できなくて使えないフレームワークやWebアプリケーションを見たことはありませんか?


解決策は、多種多様なWebアプリケーションのバックエンドのコードのハッキングをする代わりに、それらによって生成されたHTMLを使うことです(ちなみにSiteMeshはHTMLベースのサイトを処理しますが、拡張しやすく作られているので、XMl,WML,PDFなどの他のメディアに適合させるのも簡単です)。


それぞれのアプリケーションは表示したいプレーンなバージョンのHTMLコンテンツを生成する必要があります。それが保存されているかどうかはどうでも良いです。静的HTMLページでも、XML/XSLTでも、ServletでもCGIスクリプトその他でもOKです。


HTMLコンテンツはHTMLの解析処理を行うwebブラウザーに戻る途中で横取りされます。タグとタグの内容は抽出されます。ページのメタデータプロパティ(titleや、タグやタグやタグの属性など)も同様です。


抽出されたメタデータから、適切なデコレータが決定されます。デコレータはページのスキンと考えてかまいません。それはプレインなページの見た目を一貫性の保たれたルック&フィールで包み込みます。このデコレータは元のページの上にオーバーレイされます。


SiteMeshを使うには、インストールして設定しいくつかのデコレータを作成する必要があります。この作業は数分で終わり、コーディング作業は必要ありません。既存のWebページやWebアプリケーションを修正する必要はありません。


以下は例です。

http://www.opensymphony.com/sitemesh/images/overview.gif

(翻訳ここまで)

Grailsアプリを書く上で具体的にどこでSiteMeshに関係があるかというと、grails-app/views/layoutsにあるのがSiteMeshのレイアウトですね。ViewのGSPの頭のほうで指定するMetaタグ「」などがSiteMeshのレイアウト指定ということになります。