 |
私は、Velocity で私の発見したことを共有したいと思います。
私は、我々のアプリケーション・サーバーで、埋め込みメールの
テンプレート処理をするシステムで Velocity を使用しています。
私がこのサブプロジェクトを開始したとき、私は我々の
アプリケーション・サーバーでは、テンプレート出力の生成に
言語として JSP を使っていました。
それは、恐ろしいものでした。
私がソケット上ではなくて直接のメソッド呼び出しを通して通信
することができたアプリ・サーバーにおいて、servlet エンジンを
はめ込むことの難しさは言うまでもなく、多くの問題が、ありました。
VTL テンプレート対 JSP テンプレートは、Velocity 議論に特有です。
私の JSP テンプレートを見てください。
パッケージ名は、害が無いように変更しています。
例は、ここにあります:
----------------8<---------------
<%@ page session="false"
import="java.util.*,
foo.events.*,
foo.emeeting.*,
foo.validation.*,
foo.util.actionevent.ActionEvent,
java.util.Date"%>
<jsp:useBean id="meeting" scope="request" type="foo.IMeeting"
class="foo.Meeting"/>
<html>
<!-- etc -->
<table width="600" border="0" cellspacing="0" cellpadding="4"
bgcolor="white">
<tr>
<td>
<%
Iterator events = meeting.getStoredEventsIterator();
int repId = 0;
%>
<i><b>Topic: <%= meeting.getTopic()%></b></i>
<p>
<%
while (events.hasNext()) {
Object event = events.next();
Participation yapper =
meeting.getParticipation(((MeetingEvent)event).getFromId());
if(event instanceof ChatEvent) {
if("R".equals(yapper.getRole()) ) {
%>
<font color="#000000"><b><%=yapper.getName()%>:</b></font>
<%
repId = yapper.getParticipantId();
} else {
%>
<font color="#0000f0"><b><%=yapper.getName()%>:</b></font>
<%
}
ChatEvent ce = (ChatEvent) event;
%>
<br>
<%
} else if(event instanceof URLPushedEvent) {
if("R".equals(yapper.getRole()) ) {
%>
<font color="#000000"><b><%=yapper.getName()%>:</b></font>
<%
} else {
%>
<font color="#0000f0"><b><%=yapper.getName()%>:</b></font>
<%
}
URLPushedEvent pe = (URLPushedEvent) event;
%>
<a href="<%=pe.getStoredData()%>">"<%=pe.getStoredData()%>"</a> <br>
<%
}
}
%>
<hr>
<br><%=meeting.getMeetingId()%>:<%=repId%><br>
</td>
</tr>
</table>
</div>
</body>
</html>
----------------8<---------------
気持ち悪くなりました?
さて、上記と同じものを達成している Velocity テンプレートは、
こうなりました:
----------------8<---------------
<html>
<!-- etc -->
<table width="600" border="0" cellspacing="0" cellpadding="4"
bgcolor="white">
<tr>
<td>
<i><b>Topic: $meeting.getTopic()</b></i><p>
#foreach( $event in $meeting.getStoredEventsIterator() )
#set( $yapper = $meeting.getParticipation($event.getFromId()) )
#if( $event.getClass().getName().equals($urlEvent) )
#if( $repRole.equals($yapper.getRole()) )
#set( $repId = $yapper.getParticipantId() )
<font color="$blk"><b>$yapper.getName()</b></font>
#else
<font color="$blu"><b>$yapper.getName()</b></font>
#end
<a href="$event.getStoredData()">$event.getStoredData()</a> <br>
#elseif( $event.getClass().getName().equals($chatEvent) )
#if($repRole.equals($yapper.getRole()) )
#set( $repId = $yapper.getParticipantId() )
<font color="$blk"><b>$yapper.getName()</b></font>
#else
<font color="$blu"><b>$yapper.getName()</b></font>
#end
$event.getStoredData() <br>
#end
#end
<hr>
<br>$meeting.getMeetingId():$repId<br>
</td>
</tr>
</table>
</div>
</body>
</html>
----------------8<---------------
私はその後マクロへのそのやや大きい foreach ループを定義して、
より短縮させることができました、Velocity の #macro 機能を使い、
このようにします。
#drawStandardHtmlTranscript ( $meeting )
2 行追加するだけで (1行は、#parse でもう一行は #drawStandardHtmlTranscript です)
コードを 20 行もテンプレートから削除できました。
コンテキストをプールすると、(私はそうしないと 2 倍になりますが)
Velocity の実行時の呼び出しでは、最終的にテンプレートのマージ
のために消費されるのは、20 〜 50 ミリ秒です。
また、これは素晴らしいパフォーマンスです!
最後だけれどもおろそかにできないのは、テンプレートを書くために
Webデザイン・チームに対する教育は、本当に開始から終わりまで10分
でした。彼らは、私に一度も質問をしませんでした。
--
Nick Bauman
Software Engineer
3600 Dupont
Minneapolis, MN
55412
Mobile Phone: (612) 810-7406
Home Phone: (612) 522-0165
|
 |