Saturday, February 12, 2011

テンプレートhtmlをファイルじゃなくDBに保存できる

Webアプリのテンプレート、といえばJSPファイルです。しかし、mixer2ではカスタムタグ満載のjspではなく、デザイナーさんが作った普通のモックhtmlのファイルでOKです。

さらに、mixer2のテンプレートは、ファイルである必要すらありません。HelloWorldの例のようなjava.io.Fileオブジェクトだけでなく、Stringもテンプレートとして読み込めるからです。メソッドはloadHtmlTemplate(java.lang.String)です。

たとえばECサイト構築のASPサービスがあるとします。店舗ごとにまったく異なるデザインを見せるために、テンプレートは店舗ごとに異なるものを管理する必要があります。ブログサービスでも似たようなものですね。

店舗が10個くらいのうちはいいのですが、数百、数千となってくると、テンプレートをファイルで管理することが難しくなってきます。商品データ等と同様に、テンプレートもDB上で管理したくなってきます。

しかしJSPではテンプレートをDBで管理することは事実上困難です。Velocityも、DataSourceResourceLoaderによってテンプレートをDB管理することはできるものの、J2EEサポートを必要とするといった制約があり、使い勝手はあまりよくないようです。

しかしmixer2では単なるStringとして定義されたテンプレートhtmlを扱えます。
SAStrutsでのHelloWorldサンプルを、テンプレートをDBから読み込むとすると次のようになります。
// O/RマッパーとしてS2JDBCを使っていて、
// TEMPLATE_TABLEのTEMPLATEというカラムに
// テンプレートが保存されていると仮定します。
public class IndexAction {

    @Resource
    protected Mixer2Engine mixer2Engine;

    @Resource
    protected JdbcManager jdbcManager;

    public String htmlString;

    @Execute(validator = false)
    public String index() throws IOException, TagTypeUnmatchException {
        TemplateTable tt = jdbcManager
            .from(TemplateTable.class)
            .where(eq(id(),999))
            .getSingleResult();
        String templateString = tt.template;
        Html html = mixer2Engine.loadHtmlTemplate(templateString);
        html.getById("hellomsg", Div.class).unsetContent();
        html.getById("hellomsg", Div.class).getContent().add("Hello World!");
        htmlString = mixer2Engine.saveToString(html);
        return "index.jsp";
    }
}

以上、TIPSでした。

No comments:

Post a Comment