Ocsigen/EliomでWebアプリを作る (とにかく何か表示する編)

まえがき:ここのサンプルはgithubのplus7/ocsigen_tutのtut1/に置いてありますので適宜cloneしてください.

Webアプリはとにもかくにも何かを表示しないといけないことになっているらしいので.とりあえずHello worldしましょう.

ocsigenserverを動かすには設定ファイルが必要なのは前のエントリで環境構築していればわかると思いますが,いったい何が書いてあるんでしょうか.下記のXMLが私が簡略化してみたものです.

<!-- -*- Mode: Xml -*- -->
<ocsigen>
 
  <server>
 
    <port>8080</port>
 
    <logdir>./log</logdir>
    <datadir>./data</datadir>
    <user>ahya</user><!--www-data-->
    <group>ahya</group><!--www-data-->
 
    <commandpipe>/tmp/ocsigen_command</commandpipe>
 
    <charset>utf-8</charset>
 
    <findlib path="/usr/local/lib/ocaml/3.12.1"/>
 
    <extension findlib-package="ocsigenserver.ext.staticmod"/>
    <extension findlib-package="ocsigenserver.ext.ocsipersist-sqlite">
      <database file="./db/file"/>
    </extension>
    <extension findlib-package="eliom.server"/>
 
    <!-- Inclusion of all external configuration files matching *.conf
         from the directory 'dir' (in alphabetical order): -->
    <extconf dir="/usr/local/etc/ocsigenserver/conf.d" />
 
    <host charset="utf-8" hostfilter="*">
      <site path="">
<eliom module="./byoki.cmo" />
      </site>
    </host>
 
  </server>
</ocsigen>

<user>と<group>には自分のユーザー名入れてください.本格運用するときにはApacheのようにwww-dataとか.<logdir><datadir>はその名の通りのものです.mkdirしておいてください.

<commandpipe>はocsigenserverを制御するときに使う名前付きパイプのpathみたいです.再起動無しにモジュールをアップデートしたい時等に使うとか(Updating sites without shutting down the serverのところを参照).

<findlib>にはOCamlのライブラリへのPathが書かれています.普通にインストールしていれば変更の必要はないでしょう.

<extension>の列はocsigenserver内で有効にする拡張機能の一覧です.eliom.serverは古い資料だとocsigen.ext.eliomになってたりするので気をつけましょう.あとeliomはocsipersist-sqliteに依存してるっぽいです.これ書かないとエラーでて死にます.dbディレクトリもmkdirしておいてください.

<extconf>は私もよくわかってないのでそのままにしました.

<host>以下の<site>が核心部分です.<eliom>のmodule属性でどのモジュールに基づいてWebアプリを動かすかを指定します.<site>のpath属性ではどこのディレクトリ以下にこのWebアプリを配置するかを記述します.ここでは何も書いていないのでhttp://localhost:8080/直下でアクセスできます.例えば”exampleapp”と書けばhttp://localhost:8080/exampleapp/となります.

次にWebアプリ本体です.

open Lwt
open Eliom_pervasives
open HTML5.M
open Eliom_services
open Eliom_parameters
open Eliom_output.Html5
 
let main_service =
  register_service ~path:["index"] ~get_params:unit
    (fun () () -> return (html (head (title (pcdata "")) [])
                               (body [h1 [pcdata "Hello work!"]])))

register_serviceはEliom_output.Html5.register_serviceのことです.~pathにはこのサービスがどのpathを受け持つかを書きます.この例だとhttp:/localhost:8080/indexにアクセスするとこのサービスが表示されることになります.~get_paramsにはどのようなGETリクエストのパラメータを取るかを書きます.今回は何も取らないのでEliom_parameters.unitが指定されています.なにかパラメータを取りたい時には~get_params:(Eliom_parameters.int “i”)と書きます.こいつらにチルダがついてるのはOCamlのラベルを使っているからですね.使ってるの初めて見た….最後の関数はどんな内容を返すかの関数です.第一引数にGETのパラメータ,第二引数にPOSTのパラメータが渡されるらしい.今回は何もとらないので()になっています.htmlとかheadとかはHTML5.Mの型で,文字通りhtmlの要素を表しています.
このソースをocamlfind ocamlc -thread -package eliom.server -c byoki.mlでコンパイルした後,ocsigenserver -c kowai.confでサーバを起動すれば,http://localhost:8080/indexにアクセスすると味気のな~いページが表示されるはずです.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です