[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/ )