Secret Staircase

Scalate を Java から使う

May 3, 2013

Scalate は Scala で書かれたテンプレートエンジン。Java から利用することも可能です。

Spring MVC から利用する

Spring MVC 用の ViewResolver が提供されています。依存ライブラリを pom.xml に書きます。

<dependency>
  <groupId>org.scala-lang</groupId>
  <artifactId>scala-compiler</artifactId>
  <version>2.10.1</version>
</dependency>
<dependency>
  <groupId>org.fusesource.scalate</groupId>
  <artifactId>scalate-spring-mvc_2.10</artifactId>
  <version>1.6.1</version>
</dependency>

次に ViewResolver を設定します。ここでは SSP を使うようにしました。

@Configuration
public class ScalateConfig {
  @Bean
  public ViewResolver scalateViewResolver() {
    ScalateViewResolver r = new ScalateViewResolver();
    r.setPrefix("/WEB-INF/scalate/");
    r.setSuffix(".ssp");
    r.setContentType("text/html; charset=utf-8");
    return r;
  }
}

これで準備 OK。

テンプレートファイル

Scalate ではレイアウト機能がありますのでそれを使ってみます。

親レイアウトとなる basic.ssp を用意。

<%@ val title: String %> <%@ val body: String %>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="../../../stylesheets/main.css" />
    <title>${title}</title>
  </head>
  <body>
    ${include("../layout/navibar.ssp")}
    <div class="container">
      ${unescape(body)}
    </div>
    ${include("../layout/footer.ssp")}
    <script src="../../../javascripts/jquery-2.0.0.min.js"></script>
    ${unescape(script)}
  </body>
</html>

コンテンツ側から basic.ssp を指定すると ${unescape(body)} のところに差し込まれます。

<%@ val wikiPage: net.physalis.javaviews.domain.model.WikiPage %> <%
attributes("layout") = "/WEB-INF/scalate/layout/basic.ssp" %> <%
attributes("title") = "Scalate" %>
<article>
  <h1>${wikiPage.getTitle}</h1>
</article>

デフォルト HTML エスケープ

Scalate では何も設定しなくてもデフォルトで HTML エスケープされます。

前回までに使っていたのと同じモデルを使って動作を検証してみます。

WikiPage wikiPage = new WikiPage(
    "<strong>Tokyo</strong>",
    new WikiText("<strong>Tokyo</strong> is the capital of Japan."));

まず title の出力です。

string

エスケープできていますね。 Java のクラスを参照する場合、プロパティ名ではなく ${wikiPage.getTitle} のように存在するメソッドを指定する必要があるのがちょっと微妙です。

続いて WikiPage の出力。

object

WikiPage#toString() の結果をエスケープできています。

今度は明示的にエスケープを回避してみます。${unescape(...)} を使うとエスケープなしで出力できます。

string noescape

クラス定義によりエスケープをスキップする方法はわかりませんでした。

まとめ

Scalate は Java からも使え、Spring MVC 用のクラスが提供されていて簡単に組み込むことができます。レイアウト機能を標準装備、型安全で、SSP だけでなく Jade や Mustache などいろんなテンプレートが使えるなど魅力的な要素がたくさんありますね。

設定なしで HTML エスケープされ、${unescape(...)} によりエスケープなしで出力することができます。getXXX のようにプロパティ名ではなくメソッド名を使わないといけないのは微妙ですが許容範囲かな。

Java から Scala を呼び出すということで、別のバージョンの scala-compiler.jar を要求するライブラリがあったらどうしようとか、何か問題があった時のために Scala のコードを読めた方が安心とか、このへんが許容できるプロジェクトでかつ Scala じゃなくて Java を使わないといけないプロジェクト (どんなの?) なら使ってもおもしろいかも。

  • 検証に使ったソースコードは github にあります
  • こちらのサイトで動作を確認できます (非常に遅いです)