2011年11月28日月曜日

lime-mvcを使ってみた

久々にWebアプリを作る機会があったのでlime-mvcを使ってみた。
今のところ(2011/11/28現在)あまり知名度がなく、日本語の記事など一切存在していないので
今後の参考にメモ。
lime-mvc - http://code.google.com/p/lime-mvc/

lime-mvcとは

Google Guiceを拡張して作られたMVCパターンのフレームワーク。

セットアップ

lime-mvcはMavenリポジトリから利用可能になっているのでpom.xmlに下記を追加するだけ。
<dependency>
  <groupId>org.zdevra</groupId>
  <artifactId>lime-velocity</artifactId>
  <version>0.2.0.rc2</version>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.0.1</version>
  <scope>provided</scope>
</dependency>
<!-- ViewとしてJSPを使う場合は必要 -->
<!-- Velocity等を使用する場合は不要 -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
  <scope>provided</scope>
</dependency>

lime-mvcを使用する場合、MvcModuleのconfigureControllersをオーバーライドして
URLパターンとコントローラーのマッピングを行う。
これはアプリケーション起動時に呼ぶ必要があるため、GuiceServletContextListenerを継承して
デプロイメントディスクリプタ(web.xml)にリスナーとして登録する必要がある。
public class WebAppContextListener extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new MvcModule() {
            @Override
            protected void configureControllers() {
                // URLパターンとコントローラーのマッピングを行う
                control("/samples/*").withController(WebAppController.class);
            }
        });
    }
}

Guiceは上記リスナーでマッピングしたデータをGuiceFilterでキャッチしてDispatchするので
ここではすべてのリクエストに対してGuiceFilterを通す設定をweb.xmlに記述する。
<filter>
  <filter-name>guiceFilter</filter-name>
  <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>guiceFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
  <listener-class>jp.u1aryz.products.samples.lime.listener.WebAppContextListener
  </listener-class>
</listener>

/helloworld/(.*)というパスに対してリクエストがあった場合にdoActionメソッドを呼び出し
main.jspに転送する場合のコントローラーは下記の通りとなる。
メソッドの戻り値をデータとしてビューに渡すことが出来る。
@Controller
public class WebAppController {

    @Path("/helloworld/(.*)")
    @ModelName("msg")
    @ToView("main.jsp")
    public String doAction(@UriParameter(1) String name) {
        return "Hello World " + name + "!";
    }
}

coreタグライブラリでModelNameアノテーションより指定された変数名で出力することにより、
JSPで表示することが出来る。
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<head>
</head>
<body>
<c:out value="${msg}" />
</body>
</html>

コンテキストパスが"/"の場合はhttp://localhost:8080/samples/helloworld/hogeでアクセスすれば
下記のように出力されるはず。
Hello World hoge!

ほかにもlime-mvcはビューとしてJSilverやVelocity、Freemarkerを使えるので
Velocity使いとしてはありがたや〜。

0 件のコメント:

コメントを投稿