Unfiltered と Scalate を Servlet で使う

Unfiltered と Scalate を組み合わせる方法として unfiltered-scalate があります。簡単に使えて便利ですがサーブレット環境に依存しないように作られているために ServletRenderContext を使うのがなかなか難しいんですよね。

※ ServletRenderContext があればテンプレートから呼ぶ Scala 関数 でリクエスト/レスポンスにアクセスできます

unfiltered-scalate では RenderContext 生成をカスタマイズできるようになっています。ServletRenderContext を生成するには HttpServletRequest と HttpServletResponse が必要で、そのためにこちらがコミットされたみたい。

https://github.com/unfiltered/unfiltered/commit/63e1951fe7c58f804e9aa55f4d70cc00135508cb

だけどこっちで HttpServletResponse にアクセスできなくなってしまいました。

https://github.com/unfiltered/unfiltered/commit/5acb1308f0af3befbf7fe91b672c74e207fd6abc

いろいろやりようはあると思いますが、さっぱりサーブレット環境専用のライブラリを作った方が便利そうなので作りました。

unfiltered-scalate-servlet

sbt を設定します:

resolvers ++= Seq(
  "akr4 release" at "http://akr4.github.com/mvn-repo/releases"
)

"net.physalis" %% "unfiltered-scalate-servlet" % "2.0"

DefaultScalateSupport を mixin して、Scalate で response function を返します:

import net.physalis.unfiltered.scalate.servlet.DefaultScalateSupport
class Hello extends Plan with DefaultScalateSupport {
  def intent = {
    case req => Scalate(req, "WEB-INF/scalate/templates/hello.jade")
  }
}

ここでは ServletTemplateEngine と ServletRenderContext が利用されます。ServletTemplateEngine をカスタマイズするには DefaultScalateSupport を継承します:

trait ScalateSupport extends DefaultScalateSupport {
  override def configureScalateTemplateEngine(engine: ServletTemplateEngine) {
    engine.layoutStrategy = new DefaultLayoutStrategy(engine, "/scalate/layouts/default.jade")
    engine.mode = "dev" // or production
  }
}

class Hello extends Plan with ScalateSupport {
  def intent = {
    case req => Scalate(req, "WEB-INF/scalate/templates/hello.jade")
  }
}

ソースコードはこちら https://github.com/akr4/unfiltered-scalate-servlet