Unfilteredを使ってみよう

UnfilteredScalaでHTTPリクエストを処理するためのツールキットです。
主にリクエストと実行する処理とのマッピングをパターンマッチで行う機能と、処理結果として返却するレスポンスの内容を生成する機能から成ります。RESTfulなWebAPIの実装などに向いており、Scalatraに似た役回りの比較的シンプルなフレームワークですが、より強力なリクエストのルーティング機能など、Scalatraよりも強力かつ高度なフレームワークといえるでしょう。
数回に分けてUnfilteredの基本的な利用方法について書いてみようと思います。

Unfilteredのセットアップ

sbtでのUnfilteredのセットアップ方法を紹介します。xsbt-web-pluginが予め利用できるよう設定されているものとします。
Unfilteredは機能毎にモジュールが分割されており、サーブレットコンテナではなくNettyで動作するアプリケーションを開発するためのモジュールやJSON、ファイルアップロードなどの機能を実装するためのライブラリに加え、テストを支援するための機能や、サーバにデプロイせずに動作させるための組み込みサーバなどもモジュールとして用意されています。ここではUnfilteredでServletコンテナ上で動作するWebアプリケーションを作成する場合のセットアップ方法を紹介します。
Unfilteredを使用するには以下の記述をbuild.sbtに追加します。

libraryDependencies += "net.databinder" %% "unfiltered-filter" % "0.5.3"

Unfilteredを使用したWebアプリケーションの作成

Unfilteredを使用したWebアプリケーションの例として、文字列を返すだけの簡単なアプリケーションを作成してみます。Unfilteredではプランと呼ばれるクラスでリクエストのマッピングを行います。Servletコンテナ上で動作するアプリケーションを作成する場合はunfiltered.filter.Planを継承し、フィルタとして作成します。

package jp.sf.amateras.unfiltered

import unfiltered.request._
import unfiltered.response._

class HelloWorld extends unfiltered.filter.Plan {
  def intent = {
    case GET(Path("/")) => Ok ~> Html(<p>Hello Unfiltered!</p>)
  }
}

src/main/webapp/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>
  <filter>
    <filter-name>HelloWorld</filter-name>
    <filter-class>jp.sf.amateras.unfiltered.HelloWorld</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>HelloWorld</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

以上で準備は完了です。「sbt ~container:start」でJettyを起動し、ブラウザからhttp://localhost:8080/にアクセスすると作成したアプリケーションによって「Hello Unfiltered!」と表示されるはずです。