Erlang Web HTTP- рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдордВрдЪ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡реЗрдм рд╕рд░реНрд╡рд░ INETS рдФрд░ Yaws рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред Erlang Web рдХрд╛ рд╡рд┐рдХрд╛рд╕ Erlang Training & Consulting Ltd. рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд┐рдЫрд▓реЗ рддреАрди рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдФрд░ рдХрдИ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдФрд░ рдореБрдХреНрдд рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрд╡реЗрджрди
рдПрд░рд▓рд╛рдВрдЧ рд╡реЗрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ:
рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ
Erlang Web рдбрд╛рдпрдиреЗрдорд┐рдХ рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ XHTML рдХреЛрдб рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ XML рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ wpart рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред Wparts рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЖрдзрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдорд╛рдирдХ wparts рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, wparts рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
- рдлреЙрд░реНрдо рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ
- рдПрд░реНрд▓рд╛рдВрдЧ рд╢рдмреНрдж рд╣реЗрд░рдлреЗрд░
- рдкреЗрдЬ рдЕрдиреБрд╡рд╛рдж
- рдФрд░ рдкреА рдЧрдпрд╛
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, wtypes рддрдВрддреНрд░ рдЖрдкрдХреЛ рджрд┐рдирд╛рдВрдХ, рд╕рдордп рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХрд╕реНрдЯрдо рд╕рдордЧреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░реВрдкрдг рдФрд░ рд╕рддреНрдпрд╛рдкрди рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд┐рд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдорд╛рдирдХ рдпрд╛ рдЕрдиреНрдп рдорд┐рд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрд░реНрд▓рд╛рдВрдЧ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рдбреЗрдЯрд╛ рдХреЛ рдорд╛рдиреЗрд╕рд┐рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдХреЛ рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдЬреИрд╕реЗ MySQL рдпрд╛ PostgreSQL рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
URL рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, Erlang рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдбрд┐рд╕реНрдкреИрдЪрд░ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ URLs рдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХреЙрд▓ рдореЗрдВ рдореИрдк рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдВрддреНрд░рдХ рдХреЙрд▓ рддрдерд╛рдХрдерд┐рдд рдбреЗрдЯрд╛рдлреНрд▓реЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдФрд░ рдмрд╣реБрднрд╛рд╖реА рд╕рд╛рдЗрдЯ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рдПрд░рд▓рд╛рдВрдЧ рд╡реЗрдм рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдЙрдкрдХрд░рдг рд╣реИред
Wparts
XML рдХреЗ рд░реВрдк рдореЗрдВ wparts рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ Erlang Web рдХреЛ XML рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдорд╛рдиреНрдп XHTML рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрд╕рд╛рдзрд┐рдд рдлрд╝рд╛рдЗрд▓ рдПрдХ Erlang рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдбрд┐рд╕реНрдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдпрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИред
Wtypes
Wtype рдореЙрдбреНрдпреВрд▓ рдбреЗрдЯрд╛ рдХреЛ рдорд╛рдиреНрдп рдФрд░ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИред Erlang Web 10 рд╕реЗ рдЕрдзрд┐рдХ рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рджрд┐рдирд╛рдВрдХ, рдкреВрд░реНрдгрд╛рдВрдХ, рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдЗрддреНрдпрд╛рджрд┐ред рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд┐рд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдЙрдирдХреЗ рдКрдкрд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдФрд░ рдкреНрд░рдкрддреНрд░ рдкреАрдврд╝реА рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреЛрдб рдЙрджрд╛рд╣рд░рдг
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЪрд┐рддреНрд░ рдореЗрдВ wpart
рд▓реЛрдЧреЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛
рд╣реИ , рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдкреГрд╖реНрда рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдм URL
"/app/mod/func/people.html" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдХ рдлрд╝рдВрдХреНрд╢рди
mod: func () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдореЙрдбрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ wpart
рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдкреЗрдЬ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди, wpart рдЯреИрдЧ рдХреЛ рдбрд╛рдпрдирд╛рдорд┐рдХ рдбреЗрдЯрд╛ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
<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>"].
рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ, рдПрдХ рдбреЗрдЯрд╛рдлрд╝реНрд▓реЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рд▓реЙрдЧ рдХрд░рдиреЗ, рдорд╛рдиреНрдп рдХрд░рдиреЗ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝реЙрд░реНрдо рдмрдирд╛рдиреЗ, рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдЪрд┐рддреНрд░рдг рдХрд░рддрд╛ рд╣реИред