ScalaでServlet

突然ですがScalaでなんかwebサービスでも作ってみたい衝動に駆られました。
Scalaは以前触ってたんですけど、あんまり実用的なコードを書いた事が無いのでとりあえず練習がてらになんか作ってみます。

というわけでまずScalaでServletしてみる準備から。
※長々と書いていますが、動的Webプロジェクトのデプロイができていれば".project"ファイルを書き換えるだけなので一瞬で終わります。以下の説明は全体の手順なので長くなっています。

Scalaってなによ?

JVM上で動くオブジェクト指向+関数型な言語です。
Javaよりも柔軟で生産性が高く、さらにJavaの豊富な資産が使えます。
個人的にはJavaが結構嫌いなのに、Web上である程度の処理を捌くとなるとJava一択なこのご時世、まさに救世主たる言語です(私にとって)。

Scalaとかマイナー過ぎるwww

まぁ否定はしませんけど、Twitterとかfoursquareとか、あのへんの有名サービスもScala使ってるのであながちマイナーとも言えない言語になってきたような気もします。

Liftってのがあるらしいよ

Scalaのwebフレームワークらしいです。foursquareもScala+Liftの組み合わせを使ってるとか。
今回はそういうのは使わず、純粋にTomcatだけを使ってやってみます。

準備するもの

  • Scala 2.9.1
  • Eclipse 3.7.2
  • Scala IDE for Eclipse 2.0.0
  • Tomcat 7.0.26
ちなみに当方の環境はMac OS X 10.7.2です。

Tomcatのインストール

http://tomcat.apache.org/から各々の環境にあったものをダウンロードしてください。
適当なディレクトリに解凍したら、Tomcatのbinフォルダに移動し、
hoge:piyo user$ ./startup.sh
上記のコマンドを入力して、"startup.sh"を実行してください。
hoge:piyo user$ /usr/local/tomcat/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
みたいな感じの表示が出てきたら起動完了です(上記は例なので、パスは適当です)。

http://localhost:8080/

にアクセスして、可愛くない猫が表示されたら正常に稼動しています。

Eclipseのインストール

http://www.eclipse.org/ からEclipseをダウンロードしてください。
解凍したあと出来上がったディレクトリを適当な場所にコピーしてください。しなくてもいいです。私はApplicationsディレクトリに入れました。

Scala IDE for Eclipseのインストール

ScalaのEclipseプラグインです。コード補完とかが使えるようになります。

http://scala-ide.org/

上記URLからダウンロードできます。ダウンロードというか、ダウンロードURLをコピーできます。
"For Scala 2.9.x"って書いてあるところの下の、URLが書いてある緑色の部分をクリックするとURLがコピーされるので、Eclipseの"Help"メニューにある"Install New Software"からプラグインをインストールします。

Tomcatプラグインのインストール

EclipseでTomcatアプリケーションを作成できるようにします。
http://www.eclipsetotale.com/tomcatPlugin.html よりプラグインをダウンロードし、プラグインディレクトリに入れてください。
Eclipse 3.7(Indigo)の場合は、Eclipseのディレクトリの"dropins"ディレクトリがプラグインのディレクトリになります。

ディレクトリの移動が終わったらEclipseを再起動し、設定を変更します。

設定項目に"Tomcat"があるはずなのでそれをクリックし、"Tomcatホーム"を設定します。TomcatをインストールしたディレクトリがTomcatホームです。
また、Tomcatバージョンを7.xにし、コンテキスト宣言モードを"server.xml"にします。


さらに、項目"Tomcat"の"JVMの設定"でJREのバージョンを設定します(デフォルトの値で問題ないはずですが)。

で、設定は終わり。

Scalaプロジェクトの作成

"Scala Project"が作成できるようになっているので、新しくScalaプロジェクトを生成します。
このプロジェクトは使わないので、プロジェクト名はなんでもいいです。


動的Webプロジェクトの作成

こっちがメインになります。
新規作成からDynamic Web Projectを選択して動的Webプロジェクトを生成します。
プロジェクトを作ったら、とりあえずEclipseを落とします。

次に、先ほど作成したScaslaプロジェクトのディレクトリを開き、".project"ファイルを開きます。隠しファイルになっている場合もあるので、その辺は設定を変えて表示するようにしてください。
".project"ファイルに記述されている、"<buildCommand>"で囲われた部分をコピーして、動的webプロジェクトの".project"ファイルにコピーします。
<buildCommand>
    <name>org.scala-ide.sdt.core.scalabuilder</name>
    <arguments>
    </arguments>
</buildCommand>
この部分です。この部分を動的Webプロジェクトの"<buildSpec>"の部分に追加してください。
ここで私はハマったのですが、動的Webプロジェクトの".project"ファイルにあるJavaBuilderの設定を削除しないとうまくいかないようです。
ScalaBuilderはJavaのソースコードを読むとjavacを呼んでくれるようなので、削除しても問題ないようです。

というわけで、以下の部分を削除するかコメントアウトしましょう。
<buildCommand>
    <name>org.eclipse.jdt.core.javabuilder</name>
    <arguments>
    </arguments>
</buildCommand>
最後に、動的Webプロジェクトのnature要素に、同じくScalaプロジェクト内のnature要素にある1行を追加します。
私の環境では以下のようになっていました。
<nature>org.scala-ide.sdt.core.scalanature</nature>
これを動的Webプロジェクトのnature要素に追加します。
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <name>WebApp</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
        <buildCommand>
            <name>org.scala-ide.sdt.core.scalabuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
            <arguments>
            </arguments>
        </buildCommand>
        <!--
        <buildCommand>
            <name>org.eclipse.jdt.core.javabuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        -->
        <buildCommand>
            <name>org.eclipse.wst.common.project.facet.core.builder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.wst.validation.validationbuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
    </buildSpec>
    <natures>
        <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
        <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
        <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
        <nature>org.eclipse.jdt.core.javanature</nature>
        <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
        <nature>org.scala-ide.sdt.core.scalanature</nature>
    </natures>
</projectDescription>
準備はこんな感じです。Eclipseを起動しましょう。

Eclipse起動後、プロジェクトエクスプローラのプロジェクトアイコンがJからSになっているはずです。



もしこの時点で、「Classpath entry org.scala-ide.sdt.launching.SCALA_CONTAINER will not be exported or published. Runtime ClassNotFoundExceptions may result.」みたいな警告が出ていた場合は、Cmd+1(WindowsならCtrl+1)でQuick Fixを行なってください。この警告が消えないとうまく動作しません。

サーバーの追加

Eclipse画面下にある"Server"タブの何もない部分を右クリックし、"new"→"Server"を選びます。すると、以下のような画面が出てきますので、Apacheを選び、その中にあるTomcatを選択します。インストールしたTomcatのバージョンに合うものを選びましょう。


"Server"タブがない人は、メインメニューの"Window"→"Show View"から"Server"をクリックしてください。画面下に"Server"タブが表示されるはずです。



Tomcatを選んだら他にすることは無いので、Finishをクリックします。

コードを書く

まずは以下のScalaコードを書きます。
新規作成から"Scala Class"を選びましょう。
パッケージ名は"my.test.webapp"、クラス名は"WebApp"としました。
package my.test.webapp
import javax.servlet.http._

class WebApp extends HttpServlet {
 override def doGet(req: HttpServletRequest, res: HttpServletResponse) = {
  res.setCharacterEncoding("UTF-8")
  res.setContentType("text/html")
  res.getWriter.println(<html><body>Hello, World!</body></html>)
 }
}
次に、"WebContent/WEB-INF"に"web.xml"を作り、以下のように入力します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <servlet>
        <servlet-name>WebApp</servlet-name>
        <servlet-class>my.test.webapp.WebApp</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>WebApp</servlet-name>
        <url-pattern>/test/</url-pattern>
    </servlet-mapping>
</web-app>
普通の動的Webプロジェクトならこのweb.xmlは自動で更新されますが、Scalaだとどうやら自動更新はされないようです。注意しましょう。

さて、web.xmlを編集したら、プロジェクトを右クリックして"Refresh"をクリックします。これでweb.xmlがWebConrtent/WEB-INFに読み込まれているはずです。

実行!

ひと通りの手順は踏みましたので、あとはサーバーを起動してブラウザからアクセスするだけです。
画面下の"Server"タブの実行ボタン(緑の三角のボタン)をクリックしてサーバーを起動します。

サーバーの起動が終わったら、ブラウザから

http://localhost:8080/WebApp/test/

にアクセスします。

ブラウザ上に「Hello, World!」が表示されたら無事実行できています。おめでとう!

動かなかった人へ

ここの手順はあくまで私が実行するに至るまでに辿った手順です。環境によっては設定が変わると思いますし、というかEclipseなんて古い手順はすぐ使えなくなっちゃうので必ずしもこの方法でうまくいくとは限りません。
実際私もこの記事を2日間ほどかけて書いてます。いろんなとこで躓きました。

Scalaは2003年に生まれたばかりの言語なので、日本語資料も少なく色々苦労する点もあるかと思いますが、めげずにがんばってください。必ず出来ます。

0 件のコメント :

コメントを投稿