27 September, 2008

[Scala] Web Flavor

Web Flavorの0.2.0が公開されたので動かしてみました。
Web Flavorは、

  • Scalaコードをスクリプトとして記述してすぐ実行できる
  • 更新されれば自動的にコンパイルされる
という機能を備えたWebフレームワークだそうです。

●動かし方。

 とりあえず何も考えずに、WebFlavor-samples-0.2.0.zip (Apache Tomcat入り実行パッケージ、ソースなし)をダウンロードしてみる。

 私の場合、Mac OS Xだが、~/work にファイルを置いて zip ファイルを解凍。~/work/WebFlavor-samples/ というディレクトリが作られた。

[~/work/WebFlavor-samples] % ls
Apache-Tomcat-LICENSE.txt* logs/
Apache-Tomcat-RELEASE-NOTES* startup.bat*
LICENSE.txt* startup.sh*
Scala-LICENSE.txt* temp/
bin/ webapps/
conf/ work/
lib/
[~/work/WebFlavor-samples] %

startup.sh を起動すると実はこれだけでサーバが立ち上がる。

[~/work/WebFlavor-samples] % ./startup.sh
Using CATALINA_BASE: /Users/miyamoto/work/WebFlavor-samples
Using CATALINA_HOME: /Users/miyamoto/work/WebFlavor-samples
Using CATALINA_TMPDIR: /Users/miyamoto/work/WebFlavor-samples/temp
Using JRE_HOME: /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
2008/09/27 1:38:24 org.apache.catalina.startup.ClusterRuleSetFactory getClusterRuleSet
情報: Unable to find a cluster rule set in the classpath. Will load the default rule set.
2008/09/27 1:38:24 org.apache.catalina.startup.ClusterRuleSetFactory getClusterRuleSet
情報: Unable to find a cluster rule set in the classpath. Will load the default rule set.
2008/09/27 1:38:24 org.apache.catalina.core.AprLifecycleListener init
情報: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: .:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
2008/09/27 1:38:24 org.apache.coyote.http11.Http11Protocol init
情報: Initializing Coyote HTTP/1.1 on http-8080
2008/09/27 1:38:24 org.apache.catalina.startup.Catalina load
情報: Initialization processed in 431 ms
2008/09/27 1:38:24 org.apache.catalina.core.StandardService start
情報: Starting service Catalina
2008/09/27 1:38:24 org.apache.catalina.core.StandardEngine start
情報: Starting Servlet Engine: Apache Tomcat/6.0.18
CLASS_PATH: /Users/miyamoto/work/WebFlavor-samples/webapps/webflavor/WEB-INF/lib/scala-compiler.jar:/Users/miyamoto/work/WebFlavor-samples/webapps/webflavor/WEB-INF/lib/scala-library.jar:/Users/miyamoto/work/WebFlavor-samples/webapps/webflavor/WEB-INF/lib/webflavor.jar:/Users/miyamoto/work/WebFlavor-samples/webapps/webflavor/WEB-INF/classes::/Users/miyamoto/work/WebFlavor-samples/bin/bootstrap.jar
2008/09/27 1:38:25 org.apache.coyote.http11.Http11Protocol start
情報: Starting Coyote HTTP/1.1 on http-8080
2008/09/27 1:38:25 org.apache.jk.common.ChannelSocket init
情報: JK: ajp13 listening on /0.0.0.0:8009
2008/09/27 1:38:25 org.apache.jk.server.JkMain start
情報: Jk running ID=0 time=0/54 config=null
2008/09/27 1:38:25 org.apache.catalina.startup.Catalina start
情報: Server startup in 605 ms


●サンプルを表示させてみる

http://localhost:8080/webflavor/ にアクセスすると、トッブページが表示される。

リンクを辿って、Echo (samples/Echo.scala) を表示させてみる。コンテキストルートの /webflavor/下と、/WEB-INF/src/下とがそのまま対応していることが判る。
Source = ~/work/WebFlavor-samples/webapps/webflavor/WEB-INF/src/samples/Echo.scala
URL = http://localhost:8080/webflavor/samples/Echo.scala

Eco.scala は、表示したいHTMLをXMLリテラルとして返す様なscalaのコード片(Flavorと呼ぶ)で、JSPみたいなもの。
内部的には前後にコードを付加する事で(context: Context, request: Request, response: Response, session: collection.mutable.Map[String,Object]) => AnyRef なクラスに書き換えられる。

●管理画面からFlavorを作ってみる

トップページ http://localhost:8080/webflavor/ からリンクを辿って管理画面 http://localhost:8080/webflavor/admin/ に入る。
何も設定を変更してなければ、~/work/WebFlavor-samples/conf/tomcat-users.xml をみれば管理者ユーザ webflavor のパスワードが判るのでそれを使ってログインすればOK。

簡単な例として全く芸のない話だがDate.scalaというのを作ってみる。
フォームにDate.scala を入力して create ボタンを押すと、Date.scalaのソースコード入力ページになるので下記を入力して、

// Title
val title = "Date"

// Return output XML elements.
<html>
<head>
<title>{title}</title>
</head>
<body>
<h1>{"Time="+(new java.util.Date()).toString()}</h1>
</body>
</html>

updateボタンでサーブして、実行するにはExecuteのリンクを押せば、http://localhost:8080/webflavor/Date.scala として、現在時刻が表示されるのが見える。

●感想

 手軽にscalaで動的ページを作成出来ることが判った。例えばscalaを教育用言語に使う場合とかには、初心者が簡単にWebアプリを書けたりなど教材として良いのではないかなぁ。