なんじゃくにっき

プログラミングの話題中心。

Scala製テンプレートエンジンScalateを使ってみた

 ScalateというScala製のテンプレートエンジンを見つけた。
http://scalate.fusesource.org/
http://github.com/scalate/scalate
 
特徴としては…

  • WEBアプリじゃなくても単体で動く
  • Servletとしても使用可能
  • Play-Frameworkと連携するplay-scalateというプロダクトがある
  • テンプレートのフォーマットとしては2種類選べる

 
 ServletとしてフォーマットはSSPの方を使ってみた。
MVCのController部分はT2を使った。
 
 使ってみた感じとしては
SSPはVelocityというよりはJSPに近い。
 <%= hoge %>とか <%@ %>とかの記法があったりする。
・${hoge}みたいな記法があるけど値は自分でセットしないとダメみたい。
 VelocityとかFreemarkerみたいに勝手にスコープオブジェクトから見付けてきてセットしてくれるわけではないみたい。
・Snippet呼び出すとか書いてある辺りはLiftっぽい?
SSP初呼び出し時にコンパイルが走る。
 これがちょっと遅い。
 今の所SSPのプリコンパイルはない模様・・?
 プリコンパイルする方法もあり。
 GAEだとプリコンパイルしてからじゃないと動かない。
 
 使用するには以下のjarにPathを通す必要あり。

  • scala-compiler.jar
  • scala-library.jar
  • scalate-core.jar

 
 
以下ソース

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

<display-name>ScalateExampleJ</display-name>
<filter>
<filter-name>t2</filter-name>
<filter-class>org.t2framework.t2.filter.T2Filter</filter-class>
<init-param>
<param-name>t2.rootpackage</param-name>
<param-value>example.page</param-value>
</init-param>
</filter>

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

<servlet>
<servlet-name>TemplateEngineServlet</servlet-name>
<servlet-class>org.fusesource.scalate.servlet.TemplateEngineServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>TemplateEngineServlet</servlet-name>
<url-pattern>*.ssp</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

 
 
/**
* "name"パラメータの値をリクエストスコープにセットしてindex.sspフォワードするだけ
*/

package example.page

import javax.servlet.http.HttpServletRequest
import org.t2framework.t2.contexts.{ Request, Response, Session }
import org.t2framework.t2.annotation.core._
import org.t2framework.t2.navigation.Forward

@Page("/index")
class IndexPage {
@Default
def index(req: Request, @RequestParam("name") name: String) = {
req.getNativeResource.setAttribute("name", name)
Forward.to("/index.ssp")
}
}

  
 

index.ssp
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>Hello
<%= request.getAttribute("name") %> !
</p>
</body>
</html>