日記
サーバーとクライアントでテンプレートを共有したい場合Edit

データとテンプレートの配置 その3で書いたように、同じURL引数違いで出力フォーマットを変えるインターフェースを、作ったり使ったりして試してみている。基本的な方向性は悪くなさそう。

  • データ層 - ここは好きにやる
  • 汎用データ取得層 - ここは汎用クラスとして一般的なインターフェースを持たせる
  • アプリケーション用データ取得処理 - アプリケーション内で共用するインターフェースとして作る(キャッシュとかはここでかます)
  • データ出力層 - HTML、XML、JSON、TXTなどリクエストに応じて、形式を変えて出力する

なんて感じで作ってみている。

で、そういう作り方をしていると、データ出力層では出力形式に合わせて複数のテンプレートを使い分けたりするわけだけど、どうせならばHTML形式の場合に、リクエスト側でHTML展開する時に使うテンプレートファイルを指定できるようにしておけば、それでいいんじゃないかって気がしてきた。

JavaScriptでがりがり出力したい場合は、

http://example.com/path/to/resource?format=json

とかやって、JSON形式で受け取ったデータをJavaScript側でDOM操作なりJavaScriptテンプレートエンジンなりを使って出力してやればよく、たいていの場合はその方法を使うことになるんだろう。その場合の流れは、

  1. クライアント - サーバーにリクエストを投げる
  2. サーバー - データをJavaScriptが扱いやすいフォーマットで返す
  3. クライアント - 受け取ったデータをJavaScriptネイティブな変数に展開する
  4. クライアント - DOM操作やJavaScriptテンプレートを使って、データを出力する

どうしてもサーバーサイドにあるテンプレートを使いたい場合は、

http://example.com/path/to/resource?format=html&template=templatename

とかやって、必要に応じてサーバーサイドで部品レベルのテンプレート展開処理をしてもらい、その結果を受け取ればいい。その場合の処理は、

  1. クライアント - サーバーにリクエストを投げる
  2. サーバー - データを指定されたテンプレートで展開したHTMLとして返す
  3. クライアント - 受け取ったHTMLをそのまま表示する

ただしこういうやり方は、サーバーサイド実装者とクライアント実装者が同じ場合にはやりやすいけど、そうじゃない場合(たとえば別管理者が公開しているリソースを利用したい場合)はそう簡単にはいかない。

けど、その場合はクライアント実装者が、自前のサーバーに簡単なプロキシ(+テンプレート展開エンジン)を用意すればいいだろう。その場合の流れは、

  1. クライアント - プロキシにリクエストを投げる
  2. プロキシ - リソース提供サーバーにリクエストを投げる
  3. リソース提供サーバー - プロキシにリソースデータを返す
  4. プロキシ - 受け取ったリソースデータとローカルのテンプレートを使ってHTML展開処理を行う
  5. プロキシ - 展開したHTMLをクライアントに返す
  6. クライアント - 受け取ったHTMLをそのまま表示する

なんて感じか。

ひとまずそういう方向でいろいろ実験してみる。

Published At2006-02-22 00:00Updated At2006-02-22 00:00