2014年8月18日

Using Scala in Eclipse Dynamic Web Project

既然 Scala 跟 Java 是遠房親戚,接下來我們想的是,如何在 Eclipse 開發網頁專案時,可以直接套用 Scala Library,並直接撰寫 Scala Code。

Step 1: Create a Dynamic Web Project

按照既有的步驟,建立一個 Dynamic Web Project。

Step 2: Add Scala Nature

在 project 上點右鍵,會出現一個選單,選擇 Configure,然後再點選 Add Scala Nature。

我們會看到 project 自動增加了 Scala Library [2.11.2],然後我們就可以寫 Scala 測試程式了

Step 3: ScalaFilter.scala

以 Scala 撰寫一個 filter: ScalaFilter.scala class。

package test

import javax.servlet.FilterConfig
import javax.servlet.ServletResponse
import javax.servlet.FilterChain
import javax.servlet.ServletRequest
import javax.servlet.ServletException
import javax.servlet.Filter
import java.util.Date

class ScalaFilter extends Object with Filter {

  @throws(classOf[ServletException])
  def init(filterConfig: FilterConfig): Unit = {
    println("ScalaFilter: init()");
  }

  @throws(classOf[_root_.java.io.IOException])
  @throws(classOf[ServletException])
  def doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain): Unit = {
    println("ScalaFilter: doFilter()");

    response.getWriter().write("> The time now is " + new Date);
  }

  def destroy(): Unit = {
    println("ScalaFilter: destroy()");
  }

}

Step 4: web.xml

在 web.xml 裡面把 Filter 設定好

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      version="3.0">
    <display-name>test</display-name>

    <filter>
        <filter-name>ScalaFilter</filter-name>
        <filter-class>test.ScalaFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>ScalaFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

Step 5: Testing

直接將 project Run on Server 測試看看,結果發生了ClassNotFound 的錯誤,很明顯就是 Deploy 的時候,沒有把 Scala Library 放到 lib 目錄裡面。

解決方式很簡單,到 scala SDK 的 lib 目錄,把以下四個 jar 複製到 project 的 WebContent/WEB-INF/lib 目錄中。

scala-actors-2.11.0.jar
scala-library.jar
scala-reflect.jar
scala-swing_2.11-1.0.1.jar

再一次將 project Run on Server 測試看看,就成功了。