Liftを用いたWebアプリケーションの作り方 その1

Liftとは

Scalaで書かれたWebアプリケーションフレームワークです。現存の Seaside, Rails, Django, TurboGears, Wicket などのいいとこ取りのフレームワークとされています。
ここでは、http://wiki.liftweb.net/index.php/HowTo_start_a_new_liftwebapp にあるHowTo start a new liftwebapp を参考に、Liftを用いた簡単なWebアプリケーションを作成してみます。

Liftプロジェクトの作成

新しい Lift プロジェクトを作成します。ここでは Apache Maven 2.2.1 を利用します(既にMavenは導入済みとします)。Lift プロジェクト用に Maven の Archetypes が用意されていますので導入は非常に簡単です。
それでは、Mavenを使用してLiftプロジェクトを作成しましょう。以下のコマンドをコマンドプロンプトより入力します。

mvn archetype:generate \
 -DarchetypeRepository=http://scala-tools.org/repo-releases \
 -DarchetypeGroupId=net.liftweb \
 -DarchetypeArtifactId=lift-archetype-basic \
 -DarchetypeVersion=1.1-M5 \
 -DgroupId=net.liftweb.hello \
 -DartifactId=hello-lift \
 -Dversion=1.0

ちなみに Windows Power Shell ではなく、コマンドプロンプトで実施しましょう。なお、上記は実際には1行で入力します。

または、以下のようにするとインタラクティブに値を設定できます。

mvn archetype:generate -DarchetypeCatalog=http://scala-tools.org/

新しくプロジェクトが作成されたら、以下のコマンドで実行してみます。

$ cd hello-lift
$ mvn jetty:run


初回はいろいろなライブラリをダウンロードするため時間がかかりますが、以下の出力が得られればJettyの起動は完了となります。

・・・
2009-09-28 15:07:19.684::INFO:  Started SelectChannelConnector@0.0.0.0:8080
[INFO] Started Jetty Server
[INFO] Starting scanner at interval of 5 seconds.

ブラウザから動作確認してみましょう。
http://localhost:8080/


ユーザ登録・ユーザ編集・ログイン・ログアウトが既に実装された状態となります。

新しい静的ページの追加

Lift は view-first な Web アプリケーションフレームワークです。ビューの中にsnippetと呼ばれるコード断片を埋め込んでいくことでアプリケーションを構築していきます。ここでは、まず静的なページから開始しましょう。
Lift はリクエストに応じた適切なビューテンプレートを見つけようとします。ビューテンプレートは src/main/webapp/ に配置されます。ここでは、/test でアクセスできる新しいページ、test.htmlを作成します。

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
  Hello Lift
</body>
</html>

次にLiftアプリケーションとしてアクセスできるようにプロジェクトの SiteMap を編集します。プロジェクトの SiteMap はデフォルトでBoot.scalaにて定義されています。src/main/scala/bootstrap/liftweb/Boot.scala にあるBoot.scalaを編集します。以下の記述を、

  // Build SiteMap
  val entries = Menu(Loc("Home", List("index"), "Home")) :: 
  Menu(Loc("Static", Link(List("static"), true, "/static/index"), "Static Content")) ::
  User.sitemap


以下のように編集します。

  val entries = Menu(Loc("Home", List("index"), "Home")) :: 
  Menu(Loc("Static", Link(List("static"), true, "/static/index"), "Static Content")) ::
  Menu(Loc("Test",   Link(List("test"), true, "/test"), "Test Page")) ::
  User.sitemap


編集後、以下のようにJettyを起動して、

$ mvn jetty:run

http://localhost:8080/testにアクセスしてみます。Hello Lift と出力されれば成功です。

ラッパーテンプレート

Liftアプリケーションは、src/main/webapp/templates-hidden/default.html にあるラッパーテンプレートを使用することができます。先ほどのtest.htmlを以下のように修正することで、ラッパーテンプレートが利用されるようになります。

<lift:surround with="default" at="content">
  Hello Friends!
</lift:surround>

再度http://localhost:8080/testにアクセスしてみると、以下のようにラッパーテンプレートが適用された画面が表示されます。

lift:snippetの利用

これまでのサンプルでは静的なページを表示してきましたが、ここでは動的なページを表示してみます。Liftでは、ページに文字を埋め込むためのsnippetという仕組みが提供されています。
lift:snippet を利用するために、先ほどの test.html を以下のように修正します。

<lift:surround with="default" at="content">
  Hello <lift:snippet type="Lift:show" />!
</lift:surround>


続いて、src/main/scala/net/liftweb/hello/snippet/Lift.scala というファイルを用意して、以下のように記述します。

package net.liftweb.hello.snippet

class Lift {
  def show = <span>Lift {(new _root_.java.util.Date).toString}</span>;
}

再度http://localhost:8080/testにアクセスしてみると、現在日時が動的に生成されていることが分かります。