スポンサーサイト

-------- --:--:-- --

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【slim3】slim3とvelocityを連携【velocity】

2011-09-30 00:03:24 Fri

概要


個人的にjspが苦手だから、というのもありつつ、
デザイナからHTMLをもらってこれにタグを埋め込んでいくなら
jspよりもvelocityのほうがやりやすいと思い、
slim3 jsp を使用せずにvtlを使用することにしました。

*.vmのアクセスでテンプレートのvmファイルをレンダリングして
レスポンスするようにslim3のview部分に少し手を加えました。

java6
slim3 1.0.13
velocity 1.6.2
velocity-tools 2.0

slim3のクラスパスなど設定は下記サイトを参照して行って下さい。
https://sites.google.com/site/slim3documentja/
スタートガイドが完了できる状態まで進めておいて下さい。

velocityはtoolsを利用するので、下記のToolsよりvelocity-tools-2.0.zip などをDLして下さい。
http://velocity.apache.org/download.cgi
これをそのまま展開します。
libフォルダにある下記をwar/WEB-INF/libにコピーしクラスパスを通しておいて下さい。


commons-beanutils-1.7.0.jar
commons-chain-1.1.jar
commons-collections-3.2.jar
commons-digester-1.8.jar
commons-lang-2.2.jar
commons-logging-1.1.jar
commons-validator-1.3.1.jar
velocity-1.6.2.jar
velocity-tools-2.0.jar




手順


1.web.xmlの編集


<servlet>
<servlet-name>VelocityCommonServlet</servlet-name>
<servlet-class>info.isann.utils.common.servlet.VelocityCommonServlet</servlet-class>
<init-param>
<param-name>org.apache.velocity.properties</param-name>
<param-value>/WEB-INF/velocity.properties</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>VelocityCommonServlet</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>




上記は、*.vmのURLでリクエストがあった際にVelocityCommonServletへの
マッピングを記述します。

2.VelocityCommonServletクラスを作成


package info.isann.utils.common.servlet;

import java.util.Enumeration;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import info.isann.utils.Renderer;

import org.apache.velocity.Template;
import org.apache.velocity.context.Context;
import org.apache.velocity.tools.view.VelocityViewServlet;

@SuppressWarnings({ "serial" })
public class VelocityCommonServlet extends VelocityViewServlet{

static final Logger logger = Logger.getLogger(VelocityCommonServlet.class.getName());

@SuppressWarnings("unchecked")
protected Template handleRequest(HttpServletRequest req,
HttpServletResponse res, Context ctx) {

logger.fine("☆☆☆vm handleRequest☆☆☆");
String uri = req.getRequestURI();
logger.fine("リクエストURI:" + uri);
/* テンプレートレスポンス */
String template = "WEB-INF/template" + uri;
logger.fine("テンプレートファイル:" + template);
// Context context = new VelocityContext();
Enumeration e = req.getAttributeNames();
logger.fine("▼▼▼▼▼");
while(e.hasMoreElements()) {
String key = e.nextElement();
ctx.put(key, req.getAttribute(key));
// logger.fine(key + ":" + req.getAttribute(key));
logger.fine(key);
}
logger.fine("△△△△△");
res.setContentType("text/html");
res.setCharacterEncoding("UTF-8");
// Renderer.render(template, context, res.getWriter());
return Renderer.getRenderTemplate(template, ctx);

}

}




このクラスは、org.apache.velocity.tools.view.VelocityViewServletクラスを継承します。
これによってGET/POSTメソッドのアクセスをhandleRequest(HttpServletRequest req,HttpServletResponse res, Context ctx)メソッドに転送してくれます。
これよりは自分で決めて作ってるのですが、アクセスされたURLのディレクトリによってWEB-INF/templateフォルダ以下のvmファイルを参照しviewを生成してレスポンスします。
例えば、http://localhost:8888/test/index.vmとアクセスされた場合、WEB-INF/template/test/index.vmを参照します。
また、リクエストスコープ(基本的に*.vmのURLはslim3よりforwardされることを前提にしています)にセットされたattributeをすべて取得し、contextにマッピングします。
これによって、slim3のControllerクラスでリクエストスコープに設定した値をビューへ出力することを可能にしています。

なお、もともとorg.apache.velocity.servlet.VelocityServletクラスを継承していましたが、このクラスは将来的に削除される可能性があり、「@deprecated」が指定され使用が推奨されていないため、org.apache.velocity.tools.view.VelocityViewServletクラスを使用しています。
一応、GAEにアップして動作確認していますが、org.apache.velocity.tools.view.VelocityViewServletクラスは設定ファイルを参照しにOSルートディレクトリを参照したり少し行儀が悪く、GAEサーバにセキュリティ例外で処理エラーになったことがありました。
1の手順で「/WEB-INF/velocity.properties」を指定していますが、これはそれを回避する為です。
もしそれでもダメな場合はorg.apache.velocity.servlet.VelocityServletクラスを使用すればひとまず問題はないと思います。

3.velocity.propertiesファイルを作成

これは中身が空で作成しました。
存在すればいいというだけです。
もし必要な設定があるならば記述することで有効になると思います。(設定が必要なかったため未確認です)

war/WEB-INF/velocity.properties

これで準備完了です。

使い方


http://localhost:8888/test/のアクセスで適当なvmファイルをレスポンスしてみます。

1.slim3のbuild.xmlのantタスクより「gen-controller-without-view」を実行 > /test/
2.出力された *.controller.test.IndexControllerクラスを下記のように変更。


@Override
public Navigation run() throws Exception {
requestScope("message", "メッセージ");
return forward("index.vm");
}


3.war/WEB-INF/template/test/index.vmファイルを下記のように作成

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset=utf-8 />
<title>Test</title>
<script src="./common/js/jquery.js"></script>
<script type="text/javascript">
</script>
</head>
<body>
test index
<br>
#if($message)
$message
#end
</body>
</html>



これでレンダリングされた画面がレスポンスされていると思います。
jspではなくvmファイルによる画面レスポンスができるようになったかと思います。


参考URL
http://www.tdtsh.com/blog/archives/617
スポンサーサイト

⇒comment

Secret

名言集
全記事(数)表示
全タイトルを表示
ブログ内検索
Loading
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。