Scala + Liftフレームワーク

Scala + Liftフレームワーク
Scalaの概要




JVM上で動作するオブジェクト指向+関数型言語
JVMのスケーラビリティを適用できる
Javaとの相互利用が可能
traitを利用した多重継承(Mix-In)が可能
Liftの概要

フルスタックのWebアプリケーションフレームワーク

簡潔な関数型Webフレームワーク

Snippetアプローチ

Viewを中心としたアーキテクチャ
Liftの特徴(抜粋)
Lift の Comet サポートはほかに例のない優れたも
ので、Ajax サポートも非常に簡単である。
LiftでCometを使ったチャットアプリケーション

機能としては最小限のものとする

actorライブラリを利用する
チャットサーバーオブジェクトの定義
object ChatServer extends LiftActor with ListenerManager {
private var messages = List("チャットルームへようこそ")
def createUpdate = messages
override def lowPriority = {
case s: String => messages ::= s ; updateListeners()
}
}
LiftActor を継承し、ListenerManager トレイトを mixin することでリスナーを管理できるオブジェ
クト (シングルトン) として、チャットサーバーを定義。
createUpdateはupdateListeners()時に呼び出され、送信情報を返します(この場合、ポストさ
れたメッセージリスト)
lowPriorityはメッセージが届いた際に呼び出されるメソッド。オーバーライドし、マッチング処理
を行い、updateListenersを呼び出す。
(low、medium、hightの三種類あるが、割愛)
Chat コンポーネントの定義
class Chat extends CometActor with CometListener {
private var msgs: List[String] = Nil
def registerWith = ChatServer
override def lowPriority = {
case m: List[String] => msgs = m; reRender(false)
}
import scala.xml.NodeSeq
def render =
bind("chat", // バインディングのための名前空間
"line" -> lines _, // 関数 lines をバインド
"input" -> SHtml.text("", s => ChatServer ! s))
private def lines(xml: NodeSeq): NodeSeq =
msgs.reverse.flatMap(m => bind("chat", xml, "msg" -> m))
}
解説は次ページ
private var msgs: List[String] = Nil
ローカル状態を格納する変数。
def registerWith = ChatServer
ChatServerからの変更通知を受け取れるように、登録。
override def lowPriority = {
case m: List[String] => msgs = m; reRender(false)
}
ChatServerからの変更通知時の処理。ローカル状態を更新し、
reRender(false)を呼び出す。Cometコンポーネントのレンダリングをやり直
す処理。
def render =
bind("chat",
"line" -> lines _,
"input" -> SHtml.text("", s => ChatServer ! s))
private def lines(xml: NodeSeq): NodeSeq =
msgs.reverse.flatMap(m => bind("chat", xml, "msg" -> m))
名前空間chatのタグにコンテンツをバインド。
linesの戻り値で<chat:line>を置き換え、SHtml.textの戻り値で<chat:input>
を置き換える。
SHtmlオブジェクトのtextメソッドは入力フィールドを返し、第一引数は入力フ
ィールドの初期値、第二引数はサブミット時に呼び出される関数となる。
linesでは、リストを逆順にしてNodeSeqを返却する。
Index.htmlの中身
<lift:surround with="default" at="content">
<lift:comet type="Chat">
<ul>
<chat:line>
<li><chat:msg/></li>
</chat:line>
</ul>
<lift:form>
<chat:input/>
<input type="submit" value="chat"/>
</lift:form>
</lift:comet>
</lift:surround>
総評


traitによるMix-inと、actorライブラリを利用すること
で、JavaScriptを意識することなく、Cometアプリケ
ーションを作成することができる
Scala自体が難解であるため、アプリケーション作
成難度自体が下がるとは言いがたい