Как стать автором
Обновить

Erlang Web

Время на прочтение 4 мин
Количество просмотров 6.7K
Автор оригинала: Erlang Solutions Ltd
Erlang Web — платформа с открытым исходным кодом для приложений, основанных на протоколе HTTP. В настоящий момент поддерживаются веб-серверы INETS и Yaws. Erlang Web разрабатывался в Erlang Training & Consulting Ltd. в течение прошлых трех лет и используется во многих коммерческих и открытых проектах.

Применение


Проекты, использующие Erlang Web:


Ключевые особенности


Erlang Web представляет другой подход к генерированию динамических страниц. Он позволяет объединять код XHTML со специальным XML-тэгом, названным wpart. Используя концепцию wparts можно реализовать части функциональности, которые могут быть снова использованы в различных страницах, предоставляя основу для разработки динамических веб-сервисов. Ряд часто используемых шаблонов был реализован как стандартная библиотека wparts. Например, wparts включают:
  • получение данных
  • создание форм
  • манипуляция термами Erlang
  • перевод страниц
  • и д.р.

Кроме того механизм wtypes позволяет форматировать дату, время и числа, а также и валидацию данных. Форматирование и валидация могут быть реализованы и для пользовательских составных типов. Такие составные типы могут состоять из стандартных или других составных типов и могут быть определены, используя записи Erlang. Это удобно, когда данные хранятся в базе данных Mnesia, однако данные могут быть сохранены и в других базах данных как MySQL или PostgreSQL.

Чтобы сделать URL легким к запоминанию, сеть Erlang обеспечивает механизм диспатчеров, основанный на регулярных выражениях, который отображает URL на вызовы контроллера. Каждый вызов контроллера может быть проведен вызовами так называемых dataflow функций. С наследованием шаблонов и поддержкой многоязычных сайтов, Erlang 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 people. Во время рендеринга страницы, тег 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>"].


Второй пример иллюстрирует диспетчеризацию запроса, логгирование запроса dataflow функцией, проверку допустимости, автоматическое создание форм и обработку ошибок.
Теги:
Хабы:
+24
Комментарии 19
Комментарии Комментарии 19

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн