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自体が難解であるため、アプリケーション作 成難度自体が下がるとは言いがたい
© Copyright 2024 ExpyDoc