Velocity を使ってみよう(後編)

いよいよプログラム本体です。

package jp.mydns.akanekodou;

import java.io.StringWriter;
import java.util.List;
import java.util.ArrayList;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import java.sql.*;

import jp.mydns.akanekodou.bean.*;

public class Products {
    public static void main(String[] args) {
        String DBSERVER = "jdbc:mysql://localhost:3306/menudb";
        String USER = "scott";
        String PASSWD = "tiger";
    
        try {
            Class.forName("com.mysql.jdbc.Driver");

            Connection con = DriverManager.getConnection(DBSERVER,USER,PASSWD);

            Statement stmt = con.createStatement();
            String query = "SELECT * FROM 商品マスタ";

            ResultSet rs = stmt.executeQuery(query);

            List<Product> list = new ArrayList<Product>();
            while(rs.next()) {
                Product p = new Product();
                p.setId(rs.getInt("商品ID"));
                p.setName(rs.getString("商品名"));
                list.add(p);
            }

            rs.close();
            stmt.close();
            con.close();

            Velocity.init();
            VelocityContext vc = new VelocityContext();
            vc.put("list",list);

            StringWriter sw = new StringWriter();
            Template template = Velocity.getTemplate("template/products.vm");
            template.merge(vc, sw);

            System.out.println(sw.toString());
            sw.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

前半はデータベースに接続してデータを取得してくる部分です。変数 list に List<Product> 型のリストが出来上がります。

後半が Velocity によるテンプレートへのデータの差し込みです。init メソッドで初期化をし、VelocityContext を用意します。そこに list という名前で先ほど作った list を渡します。put の第一引数の "list" はテンプレートで使った $list に対応します。次に StringWriter を用意します。テンプレートを指定し、merge でテンプレートにデータを流し込んでいます。これで sw にはデータが流し込まれた状態で出力が格納されていますので String に変換して println で出力します。
で、出力はこうなるわけですが。

1 : デスクトップ型パソコン
2 : ノート型パソコン
3 : 17型_ディスプレイ
4 : 19型_ディスプレイ
5 : 15型_液晶ディスプレイ
6 : デジタルカメラ
7 : プリンタ
8 : スキャナ
9 : HUB
10 : ターミナルアダプタ

何かこれだと、Velocity のありがたみが良くわからないですね。しかし、重要なのはそこではありません。

テンプレートを利用する最大の利点は「テンプレートを見れば出力が大体想像がつく」ことにあります。再び年賀状の例を思い出してください。テンプレートが用意されていることにより、宛名がどのように印刷されるのか、大方予想がつきますよね。それこそがテンプレートエンジンを採用する最大の利点なのです。

JSP & Servlet にしろ Struts にしろ、View を作るには JSP を利用します。これは JSP 式やカスタムタグが含まれているので、そのままでは出力を予想するのは知識のない人には困難です。

そこで、View の部分を Velocity で作る、という方法を取ることがあります。Velocity Tools には独自の Servlet が用意されていて、テンプレートである vm ファイルを変換してデータを差し込むことができます。そして vm ファイルは jsp ファイルと比較するとより HTML に近いので、知識が少ない人でも出力が予測しやすいという利点があります。MVC モデルのコンセプトであった「分業」がよりやりやすくなるわけです。

さらに Velocity は Google App EngineAndroid などでも利用できることを考えると、使い方を覚えて損はないテクノロジーであると言えます。