ScalaでServletを使ってみる
Scalaを仕事をサボって勉強しています。ScalaはJava VM上で動くオブジェクト指向+関数型言語で、Javaクラスを使ったり、ScalaクラスをJavaで使ったりできるんですね。とても楽しいです。
インタープリタで対話的に実行できるし、スクリプト言語のように実行できるし、コンパイルして実行することもできます。実行環境は、MacPortsで入れることができるので、インストールもお手軽にできます。
んで、Scalaをコンパイルすると、.classファイルができる。つまり、Javaをコンパイルした時と同じモノが出来るわけです。このおかげで、JavaとScalaはシームレスな連携をするので、ScalaでWebアプリを実装できるんじゃねーかと思い、やってみた。
環境は以下の通り。
- Mac OS 10.5.6
- Eclipse 3.4.2 + Scala Eclipse Plugin 2.7.3 final
- JVM 1.6.0
- Tomcat 6.0.18
EclipseはJava EEの開発なので、WTPが入ってるヤツです。Tomcatでなく、GlassFishあたりでも動きますが、スタンダードなのを使っています。Windowsのことは知りませんが、同じようにすれば動くんじゃないですかね?
Tomcatを入れる
Tomcatをダウンロードします。
http://tomcat.apache.com/index.html
解凍して適当なディレクトリに置きます。以下のような感じです。
~/tomcat/apach-tomcat-6.0.18
http://localhost:8080/で動作確認だけできればいいので、落としてコピーして終わりです。コマンド叩いてメンドーなことはしません。
Eclipseにプラグインを入れる
Scala Eclipse Pluginは、以下のアップデートサイトから手に入れることが出来ます。
http://www.scala-lang.org/scala-eclipse-plugin
Scala実行環境もこれで入りますが、PATHは通らないので、対話的に実行したりする場合は別途MacPortsとかしたほうがいいかもしれません。
Scalaのプラグインを入れたので、Scalaプロジェクトが作れるようになっているはずです。
作成
プロジェクトの構成ですが、Scalaプロジェクト+動的ウェブプロジェクトという構成にします。動的ウェブプロジェクトのソースフォルダにScalaのソースが作成できないため、Scalaプロジェクトを別にしています。パスを通せば問題ないので、この構成作っていきます。
新規作成からScala Projectを作ると、見慣れた感じのプロジェクトができるので、ソースフォルダにパッケージを作ります。なんでもいいんですが、「jp.my.webapp.servlet」という名前で話を進めます。
このパッケージにScalaソースファイルを作成します。javax.servlet.httpのクラスを使用するため、ビルドパスにサーバ・ランタイムを設定する必要があります。
package jp.my.webapp.servlet
import javax.servlet.http.{
HttpServlet,
HttpServletRequest => HSReq,
HttpServletResponse => HSResp
}
class TestServlet extends HttpServlet {
override def doGet(req :HSReq, resp :HSResp) {
val message =
<HTML><HEAD><TITLE>Hello, Scala</TITLE></HEAD>
<BODY><P>Hello, Scala with Servlet</P></BODY></HTML>
resp.getWriter().print(message)
}
}
import文は{}で括ることによって、パッケージから複数のクラスをimportできます。「クラス名=>省略名」という書き方も出来ます。ScalaではXMLリテラルを書くことができ、整形文で文法にエラーがなければHTMLもリテラルにできます。XMLリテラルは、scala.xml.Elem型で、printメソッド内でtoStringにより文字列化されます。
これでScalaによるServletは終了です。次は、webプロジェクトです。
こちらはさらに簡単です。パスを通して、web.xmlを書いて終わりです。プロジェクトはwebappという名前で作りました。
パスは、Scalaプロジェクトとscala-library.jarに通します。Java EE Module Dependencies(日本語化してると「Java EE モジュール依存関係」だかです)にプロジェクトとjarを追加します。scala-library.jarはScalaプロジェクトを見ればパスが書いてありますが、あまりに深いところにあったので、MacPortsで入れた実行環境の方に通してしまいました。
web.xmlにservletとservlet-mappingを記述します。
<servlet> <servlet-name>HelloScala</servlet-name> <servlet-class>jp.my.webapp.servlet.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloScala</servlet-name> <url-pattern>/sayHello/</url-pattern> </servlet-mapping>
あとは新規作成でサーバを作り、解凍したTomcatのディレクトリを指定すると、サーバビューにTomcatが登録されるので、webappプロジェクトをドラッグ&ドロップで追加します。そして、サーバを起動し、ブラウザでhttp://localhost:8080/webapp/sayHello/へアクセスしてみます。

アクセスした様子
ウェブフレームワークは使わずにやってみましたが、StrutsやSpring、DWRといったものを使ってもよさそうです。Scalaのウェブフレームワークもあるようですね。最初はDWRでAjaxを目論んでいたんですが、クラスパス周りでハマり、エラーの切り分けがよくわからないので、フレームワークなしとなりました。
ソースに関しては、IBMのdeveloperWorksとほぼ同じです。実装については、このエントリーよりも優しく書いてあるので、そちらを参考にした方がいいと思います。