[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10029] Velocity って使って ますか ?



  高橋(智)です。
  3,4ヶ月前の読書会の打ち上げで少し話題にさせていただきましたVelocity
のご紹介です。


  ずいぶん前から使っている Jakartaプロジェクトのテンプレートエンジン
Velocity(今はVer1.2)ですが、Super BOFの時にも少し話題にさせていただき
ました。ちなみに、会場に居られた方々は、結構、自作・自社製のテンプレ
ートフレームワークを作成しておられるようでした。
  私自身あまりJSPが好きではなくて、VelocityのようなものとServletを
組み合わせたような古典的な手法が好きでして、以下のようなサンプルを
作ってみました。
  example.vmをパースして、キーワードを置き換えるだけです。出力結果
は一番下にあります。
  referenceInsertメソッドによる「出力直前の文字列処理」や「テンプ
レートの中に別のテンプレートを繰り返し入れる」というのも結構使える
と思います。
  JSPよりスッキリしてますよね? いかがでしょうか? :-)

--- example.vm ---------------------------------------------
<html>
<head>
</head>
<body>
$keywordtest
<table border="1">
<tr>
<td>$bean.getFirstname()</td><td>$bean.getLastname()</td><td>$bean.getAge()</td>
</tr>
$tabletest
</table>
</body>
</html>
--- example2.vm ---------------------------------------------
<tr>
<td>$col1</td><td>$col2</td><td>$col3</td>
</tr>
--- Untitled1.java -----------------------------------------
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.velocity.*;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.event.*;
import org.apache.velocity.context.*;
import org.apache.velocity.servlet.*;

public class Untitled1 extends VelocityServlet
                                   implements ReferenceInsertionEventHandler {

  protected Template handleRequest(HttpServletRequest request,
                                   HttpServletResponse response,
                                   Context ctx) throws java.lang.Exception {
    EventCartridge ec = new EventCartridge();
    ec.addEventHandler(this);
    ec.attachToContext(ctx);

    ctx.put("keywordtest", "Hi, All");

    Bean1 b = new Bean1();
    b.setFirstname("ken");
    b.setLastname("takahashi");
    b.setAge(29);
    ctx.put("bean", b);

    Object[][] cols = {{new Integer(1), new Long(2), new Float(3.0)},
                       {new Boolean(true), "test", null}};
    ctx.put("tabletest", cols);

    return getTemplate("/template/example.vm", "Shift_JIS");
  }

  public Object referenceInsert(String reference, Object value) {
    try {
      if( reference.equals("$keywordtest") )
      {
        return value.toString() + " This is Velocity test. :)";
      }
      
      if( reference.equals("$tabletest") )
      {
        StringWriter w = new StringWriter();
        Object[][] cols = (Object[][])value;
        for(int i = 0; i < cols.length; i++)
        {
          VelocityContext ctx = new VelocityContext();
          ctx.put("col1", cols[i][0]);
          ctx.put("col2", cols[i][1]);
          ctx.put("col3", cols[i][2]);
          Velocity.mergeTemplate("/template/example2.vm", "Shift_JIS", ctx, w);
        }
        return w;
      }
    }
    catch(Exception e) {
      return e;
    }
    return value;
  }
}
--- Bean1.java -----------------------------------------
public class Bean1 {
  private String firstname;
  private String lastname;
  private int age;
  public Bean1() {
  }
  public String getFirstname() {
    return firstname;
  }
  public void setFirstname(String firstname) {
    this.firstname = firstname;
  }
  public void setLastname(String lastname) {
    this.lastname = lastname;
  }
  public String getLastname() {
    return lastname;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public int getAge() {
    return age;
  }
}
----------------------------------------------------------

--- 結果 ---------------------------------------------
<html>
<head>
</head>
<body>
Hi, All This is Velocity test. :)
<table border="1">
<tr>
<td>ken</td><td>takahashi</td><td>29</td>
</tr>
<tr>
<td>1</td><td>2</td><td>3.0</td>
</tr>
<tr>
<td>true</td><td>test</td><td>$col3</td>
</tr>
</table>
</body>
</html>
----------------------------------------------------------

-- 
高橋智宏
  Java読書会( http://www.t3-jpn.com/bof/ )
  T3-Japan( http://www.t3-jpn.com/ )