2007/08/03

[Common Lisp][UCW] 継続によるページ遷移

前回のハローワールドアプリケーションにもう1ページ追加し、ページ遷移をしてみます。
defentry-point で loop を使い2つのページを call します。
各ページでは <ucw:a でリンクを作成し、その action で ok を呼びます。
ok は call の戻りになります。
hello-world-window からの ok は次の next-page を呼び出し、next-page からの ok は loop により再度 hello-world-window を呼び出し、それがぐるぐるまわります。
継続を使ったページ制御です。


;; ucw がロードされていなければロードする。
(eval-when (:load-toplevel :compile-toplevel :execute)
(unless (find-package :ucw)
;; UCW の start.lisp をロードする。
(load "/home/ancient/letter/lisp/ucw/ucw-boxset/start.lisp")))

;; ucw のユーザ用パッケージ。
;; 簡単なアプリケーションならこのパッケージを使うのが簡便。
(in-package :it.bese.ucw-user)

;; アプリケーションの作成。
(defvar *hello-world-application*
(make-instance 'cookie-session-application
;; http://localhost:8080/hello/ でこのアプリケーションの
;; アクセスできるようにする。
:url-prefix "/hello/" ; / で終ること
))

;; アプリケーションをサーバに登録する。
(register-application *default-server* *hello-world-application*)

;; エントリポイントの作成。
;; http://localhost:8080/hello/index.ucw で
;; hello-world-window の render メソッドが呼ばれる。
(defentry-point "index.ucw" (:application *hello-world-application*)
()
;; 1ページ目と2ページ目をループする。
(loop
;; ハローワールドのページ
(call 'hello-world-window)
;; 次のページ
(call 'next-page)))

;; hello-world-window の定義。
;; simple-window-component を継承する。
(defcomponent hello-world-window (simple-window-component)
()
(:default-initargs :title "ハローワールド")) ; title の設定。

;; 表示用のメソッドの定義
(defmethod render ((hello hello-world-window))
(<:p "ハローワールド")
(<ucw:a :action (ok hello) "次のページへ"))

;; 次のページを定義する。
(defcomponent next-page (simple-window-component)
()
(:default-initargs :title "次のページです"))

;; 次のページの表示
(defmethod render ((self next-page))
(<:p "次のページに遷移しました。")
(<ucw:a :action (ok self) "最初のページに戻る"))

0 件のコメント: