Content-Typeを動的に指定することは可能なのか

今回は、前回のマネージャーKのコラム(ページは見つかったのか。見つかっていないのか。)でちょっとだけ話に挙がった「Content-Type」についてお話します。

Webcenter Sites(以下WCS)では、Content-Typeをテンプレート作成時に指定することができます。

Content-Typeはテンプレートの設定項目の1つである、ページレットパラメータで”cs.contenttype”をキーに指定します。

ページレット

しかし、このページレットパラメータで指定したcs.contenttypeの値は、そのテンプレートで常に固定となるため、動的にContent-Typeの変更ができません。
サーブレットプログラムでは、下記コードのようにContent-Typeを動的に変更できます。

response.setContentType("text/html");

WCSのテンプレートでこのコードを書いてもエラーは発生しませんが、有効にもならないのです。

それでは、動的にContent-Typeを変更したい要件が出たときにはどうするべきでしょうか。

実際に携わった案件では、使われる可能性のあるContent-Typeのテンプレートを全て用意し、アクセスに応じて適切なContent-Typeのテンプレートを呼び出す方法を取りました。

例えば、gifへのアクセスであれば、cs.contenttypeが”image/gif”のテンプレートを呼出し、pdfへのアクセスであれば、”application/pdf”のテンプレートを呼び出すといった感じです。

呼出し方は色々な方法がありますが、Apacheのrewriteを使うのも一つの方法です。

Rewriteを使ったテンプレート呼出しイメージ

rewrite_image

もう一つ、こちらはまだ検証前ではありますが、テンプレートを”XML”タイプで開発することでContent-Typeを動的に変更できる可能性があります。

XMLにはHTTPのヘッダーを設定するタグ(ICS.STREAMHEADER)が用意されていて、このタグを使うことによってContent-Typeの指定が可能だということです。

実際にこのタグが有効かどうかは次の機会に検証したいと思います。

今のところ、JSPでの開発ではContent-Typeを完全な動的化にする方法が見つかっていませんが、上記に挙げた方法が参考になれば幸いです。


WebCenter Sitesを使った開発ではキャッシュも考えましょう

 通常、動的なページを出力するシステムでは、データベースから必要な情報を取得し、様々な処理を行った上でページを出力します。しかし、取得する情報が多くなったり、複雑な処理になるほど、ページの出力は遅くなっていきます。

WebCenter Sites(WCS)にはページ出力をアップさせるための仕組みを持っています。

それが「キャッシュ」です。

WCSのキャッシュは以下の特徴があります。

  • 一度生成したページ(またはページの一部)をメモリに保持しておき、表示条件が同じ場合には処理を行わずにメモリから結果をブラウザに戻す。
  • ページ単位やページをパーツに分けて、それぞれにキャッシュの有効/無効を設定したり、キャッシュとして残す時間を設定することが可能。
  • そのページと関連があるアセット(データ)を公開した際に、キャッシュを再作成することが可能。

 ただし、WCSのキャッシュは強力な反面、適切な設定を行わないと様々なトラブルの元になります。
例えば

  • キャッシュの時間が長すぎて、新着情報がなかなか表示されない。
  • キャッシュ生成の条件にミスがあり、うまくキャッシュが効かない。
  • 情報更新時に、大量のキャッシュを更新するような作りになっているため、情報更新に非常に時間がかかり、システムの負荷が高くなる。

 実際のところ、機能開発を行う際は、ついついキャッシュ管理を含めた運用への考慮を忘れがちになりますが、これが意外と開発の手戻りとなったりするものなのです。

 WCSでキャッシュを扱うには、システムや開発に対する知識だけでなく、コンテンツ更新のタイミングまで含めた運用的な視点と戦略が必要となってきます。

 なかなか複雑で面倒な仕組みではありますが、有効に活用できた際には、驚く程の効果があるのも確かで、キャッシュあってこそのWCSと言っても過言ではありません。(どれほどの効果があるのかは、また別の機会にお話ししましょう。今後もキャッシュについては、テーマとして書いていく予定です。)

 ジークスは、これまでの開発からキャッシュの強さ、怖さを経験してきました。そのような経験があったからこそ、WCSで最適なシステムを構築することができます。