アーランウェブ

Erlang Webは、HTTPベースのアプリケーション用のオープンソースプラットフォームです。 WebサーバーINETSおよびYawsは現在サポートされています。 Erlang Webは、Erlang Training&Consulting Ltdで開発されました。 過去3年間、多くの商用およびオープンソースプロジェクトで使用されています。



申込み



Erlang Webを使用するプロジェクト:





主な機能



Erlang Webは、動的ページを生成するための異なるアプローチを提示します。 XHTMLコードとwpartと呼ばれる特別なXMLタグを組み合わせることができます。 wpartsの概念を使用すると、さまざまなページで再利用できる機能の一部を実装して、動的なWebサービスを開発するための基盤を提供できます。 多くの一般的に使用されるテンプレートは、標準のwpartsライブラリとして実装されています。 たとえば、wpartsには次が含まれます。



さらに、wtypesメカニズムを使用すると、日付、時刻、数値、およびデータ検証をフォーマットできます。 書式設定と検証は、カスタムの複合型にも実装できます。 このような複合型は、標準または他の複合型で構成でき、Erlangレコードを使用して定義できます。 これは、データがMnesiaデータベースに保存されている場合に便利ですが、MySQLやPostgreSQLなどの他のデータベースに保存できます。



URLを覚えやすくするために、ErlangはURLをコントローラー呼び出しにマップする正規表現ディスパッチャーメカニズムを提供します。 各コントローラー呼び出しは、いわゆるデータフロー関数の呼び出しによって行うことができます。 テンプレートの継承と多言語サイトのサポートにより、Erlang WebはWebアプリケーションを構築するための完全なツールです。



Wparts



wpartsをXMLとして実装すると、Erlang WebはXMLパーサーでページを解析できるため、有効なXHTMLがクライアントに送信されます。 処理されたファイルはErlangバイナリファイルに変換され、ディスクにキャッシュされるか、メモリに保存されます。



Wtypes



Wtypeモジュールは、データの検証とフォーマットを行います。 Erlang Webは、日付、整数、文字列などのような10を超える単純な型を提供します。 新しいものを簡単に追加する機能を提供します。 開発者は、その上に独自の複合型を作成できます。 データ検証とフォーム生成は簡単に自動化できます。



コード例



以下の図は、動的コンテンツをページに追加するために使用されるwpart peopleの例を示しています。



mboga.org



URL "/app/mod/func/people.html"が呼び出されると、コントローラー関数mod:func()が呼び出されます。 この関数は、モデルからデータを読み取り、それをwpartの人々のために準備します。 ページのレンダリング中に、wpartタグは動的データに置き換えられます。



<!-- people.html - renders data from the model --> <html> <head> <title>Erlang Web Sample Page 4</title> </head> <body> <center> <wpart:people rows="2" key="list"> <tr> <td><wpart:lookup key="item:person" /></td> <td><wpart:lookup key="item:age" format="age"/></td> <td><wpart:lookup key="item:sex" format="sex"/></td> </tr> </wpart:people> <img src="/images/powered.gif" /> </center> </body> </html>
      
      







 % install.erl - initialises mnesia database and puts sample data into it -module(install). -export([install/0]). install() -> mnesia:create_schema([node()]), application:start(mnesia), mnesia:create_table(person, [{disc_copies, [node()]}, {attributes, record_info(fields,person)}]), mnesia:dirty_write(#person{name = "Lucy", age = "20", sex="female"}), mnesia:dirty_write(#person{name = "John", age = "22", sex="male"}), mnesia:dirty_write(#person{name = "Anna", age = "22", sex="female"}).
      
      







 % mod.erl - controller function writes data into the request dictionary -module(mod). -export([validate/1,func/0,]). -export([install/0]). -record(person, {name, age, sex}). validate(func) -> {ok, []}; func() -> Keys = mnesia:dirty_all_keys(person), Records = [mnesia:dirty_read(person, Key) || Key <- Keys], Persons = lists:map(fun([#person{name=Name, age=Age, sex=Sex}]) -> [{"person",Name}, {"age",Age}, {"sex",Sex}] end, Records), eptic:fset("list", Persons), template.
      
      







 % wpart_people.erl - wpart module handles formatting and retrieves data from the request dictionary -module(wpart_people). -export([handle_call/1]). -include_lib("xmerl/include/xmerl.hrl"). handle_call(E) -> Start = case catch list_to_integer(eptic:fget("get", "start")) of S when is_integer(S) -> S; _ -> 1 end, Rows = case catch list_to_integer(wpart:has_attribute("attribute::rows", E)) of R when is_integer(R) -> R; _ -> 10 end, Key = wpart:has_attribute("attribute::key", E), List = eptic:fget(Key), Prev = if Start-Rows > 0 -> link_prev(Start-Rows); Start == 1 -> "Prev | "; true -> link_prev(1) end, Next = if Start+Rows > length(List) -> "Next"; true -> link_next(Start + Rows) end, F = fun(Item, {N,Start,End,Acc}) when N>=Start, N<End -> eptic:fset("item", Item), {N+1,Start,End,[wpart:eval(E#xmlElement.content)|Acc]}; (_, {N,Start,End,Acc}) -> {N+1,Start,End,Acc} end, {_,_,_,TableRows} = lists:foldl(F, {1,Start,Start+Rows,[]}, List), [#xmlText{value = "<table>", type=cdata}, lists:reverse(TableRows), #xmlText{value = "</table>", type=cdata}, #xmlText{value = Prev, type=cdata}, #xmlText{value = Next, type=cdata}]. link_prev(Start) -> ["<a href=\"?start=",integer_to_list(Start),"\">Prev</a> | "]. link_next(Start) -> ["<a href=\"?start=",integer_to_list(Start),"\">Next</a>"].
      
      







2番目の例は、リクエストのディスパッチ、データフロー関数を使用したリクエストのログ記録、検証、フォームの自動作成、エラー処理を示しています。



All Articles