Seaside チュートリアル(その1)

Seaside は Squeak上で動作する継続ベースの Webアプリケーションフレームワーク です。

WWW はステートレスな世界なので、Webアプリケーションの作成には情報の永続化に関する悩みがつきものです。しかし継続(Continuation)を使うことでプログラマ側にはステートフルな顔を見せる一方、クライアント側には相変わらずステートレスなアプリケーションの構築が可能です。

Seaside はプログラマにとっては HTTPリクエスト/レスポンス をいくら跨ろうと継続された処理を提供するので、Webアプリケーションの作成がコレまでの常識を覆すほどサクサクできます。

このシリーズは、A Seaside tutorialさんを元に進めた、猫自身のチュートリアル・メモになります。

Seasideのインストール

Seaside の日本語版を梅沢さんが作ってくれてます。

インストール済みイメージも配布されているのでこれを利用するのがお手軽です。

Hello world と表示してみる。

それでは、まず単純に Hello, world と表示する Webアプリケーションを作ってみましょう。Seaside でWebアプリケーションを作るには、WAComponant のサブクラスを作るところから始めます。

WAComponent subclass: #HelloComponent
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: 'MySeasideTutorial'

こうして作った WAComponent のサブクラスは VisualComponent になります。このコンポーネントは Seaside から #renderContentOn: メッセージが送られたときに引数で渡された WAHtmlRenderer を使って 画面を表示する責務を持ちます。

この renderer を使うと、XHTMLでのレンダリングが可能ですが、今回はシンプルにプレーンテキストで 'Hello, world' と表示するだけにしておきましょう。というわけで実装してみましょう。プレーンテキストのレンダリングには text: メッセージを送ります。

renderContentOn: html
        html text: 'Hello, world'

これでHello, world コンポーネントは完成です。しかしまだ、Seasideにアプリケーションとして登録されていません。登録には #registerAsApplication メッセージを使います。Workspace で

HelloComponent registerAsApplication: 'helloweb'

を実行しましょう。これで コンフィグページ http://localhost:9090/seaside/config に helloweb というリンクが出来たハズです。ここをクリックすれば晴れてWebApplicationとしてHelloComponentが公開されたというわけです。

少しHTMLらしくする

プレーンテキストでは何なので、すこしHTMLらしくしてみます。 HelloComponent >> #renderContentOn: メソッドをちょっと書き換えます。

renderContentOn: html
        html heading: 'Hello, World' level:1.
        html paragraph:
                'ようこそ! この Hello, World は
 Squeak上の継続サーバ Seaside で作られています。'

コードから想像されるそのまんまの通り、<h1>要素と <p>要素 がレンダリングされます。HTML要素をネストさせたいときは、ブロックを使います。例えば、

<h1>Hello, World</h1>
<p>ようこそ、Seaside の世界へ! この Hello, World は <em>Squeak</em> 
上の継続サーバ <em>Seaside</em>で作られています。</p>

と言う HTML が欲しい時はこんな感じにします。

renderContentOn: html
    html heading: 'Hello, World' level:1.
    html paragraph:[
        html text: 'ようこそ! この Hello, World は '.
        html emphasis: 'Squeak'.
        html text: ' 上の継続サーバ '.
        html emphasis: 'Seaside'. 
        html text: ' で作られています。']

もっとディープにHTMLレンダリング

もう少しだけ HTMLレンダリングについて。今度はテーブルを

renderContentOn: html
    html heading: 'Hello, World' level:1.
    html paragraph:
        [html text: 'ようこそ! この Hello, World は '.
        html emphasis: 'Squeak'.
        html text: ' 上の継続サーバ '.
        html emphasis: 'Seaside'. 
        html text: ' で作られています。'].

    html heading: '三猫の他のWebサイト' level:2.

    html paragraph: 'あちこちにへんなのを作っています'.

    html table:
        [html tableRow:
            [html tableHeading: 'サイト名'.
            html tableHeading: 'URL'.
            html tableHeading: '概要'].
        html tableRow:
            [html tableData: '三猫OnLine'.
            html tableData: 'http://mineko.fc2web.com/'.
            html tableData: '本家で元祖!サブコンテンツも充実'].
        html tableRow:
            [html tableData: 'mixi'.
            html tableData: 'http://mixi.jp/show_friend.pl?id=1090949'.
            html tableData: 'あたしの引きこもり先です'].
        html tableRow:
            [html tableData: 'みねこあ'.
            html tableData: 'http://d.hatena.ne.jp/minekoa/'.
            html tableData: 'このブログです。']]. 
アトリビュートの付与

TABLE要素の使い方は特に驚くべき所はないと思います。(まんまです)でも、これではボーダーが表示されないので一寸見にくいです。HTMLであれば

<table border=1>

とすべき所ですが、Seaside ではどうすればよいでしょう。この場合は、#attributeAt:put: を使います。

renderContentOn: html
    html heading: 'Hello, World' level:1.

           ・
           ・
           ・
    html paragraph: 'あちこちにへんなのを作っています'.

    html attributeAt: 'border' put: 1.
    html table:
        [html tableRow:
           ・
           ・
           ・

#attributeAt:put: でストアされた HTMLタグ属性は、直後の要素のレンダリングに利用されます。

なお div 要素や span 要素の class 属性のように、頻繁に使う属性は #spanClass:with: の様なメソッドが定義されているのでそちらを使う方がスマートでしょう。

スタイルシート

CSSを書き出すには #style メソッドを定義します。

style
    ^
'h1{
    color:#333;
    font-family:"MS P明朝",serif;
}

h1:first-letter{
    font-size:150%;
}

table{
    border:1px solid #5555FF;
    border-collapse: collapse;
    empty-cels:show;
    margin-left:2em;
}

th{
    text-align:center;
    border:1px solid #1111FF;
    color:#FFF;
    background-color:#5555FF;
}
'



以上、今回は Seaside アプリケーションの基本的な生成法と、静的な HTMLレンダリングについて説明しました。今回の内容は、A Seaside tutorial のRendering basics を参考にしました。(と言うかそのまんまです)。

どのようなHTML要素がレンダリング出来るかは、WAHtmlRendererやそのスーパークラスWAAbstractHtmlBuilderを参考にしてください。



Seaside チュートリアル -目次