Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shablony_korporativnykh_prilozheniy_Fauler_M.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
3.82 Mб
Скачать

Представление с преобразованием (Transform View)

Представление, которое поочередно обрабатывает элементы данных домена и преобразует их в код HTML

Выполняя запросы к слоям домена и источника данных, вы получаете от них нуж­ные данные, однако без форматирования, необходимого для создания Web-страницы. Визуализацией полученных данных в элементы Web-страницы занимается объект, вы­полняющий роль представления в системе модель-представление-контроллер (Model View Controller). В типовом решении представление с преобразованием процесс ви­зуализации данных рассматривается как преобразование, на вход которого подаются данные из модели, а на выходе принимается код HTML.

Принцип действия

В основе типового решения представление с преобразованием лежит идея написания программы, которая бы просматривала данные домена и преобразовывала их в код HTML. В процессе выполнения такая программа последовательно проходит по структуре данных домена и, обнаруживая новый фрагмент данных, создает их описание в терминах HTML Для большей наглядности попробуйте представить себе метод renderCustomer, который преобразует объект Customer ("покупатель") в формат HTML Если объект со­держит множество заказов, метод renderCustomer последовательно просматривает спи­сок заказов, вызывая для каждого из них метод renderOrder.

Основное отличие представления с преобразованием от представления по шаблону (Template View) заключается в способе организации представления. Представление по шаблону организовано с учетом размещения на экране выходных данных. Представление с преобразованием ориентировано на использование отдельных преобразований для каж­дого вида входных данных. Преобразованиями управляет нечто наподобие простого цик­ла, который поочередно просматривает каждый входной элемент, подбирает для него подходящее преобразование и применяет это преобразование. Таким образом, правила представления с преобразованием могут быть организованы в любом порядке — на резуль­тат это не повлияет.

Представление с преобразованием может быть написано на любом языке. Тем не менее на данный момент наиболее популярным языком для написания представлений с пре­образованием является XSLT. Интересно отметить, что XSLT является языком функ­ционального программирования, как LISP, Haskell и другие языки, которые так и не смогли оказаться в первом эшелоне средств, применяемых для написания информаци­онных систем. Подобно этим языкам, XSLT имеет довольно своеобразную структуру. Например, вместо того чтобы вызывать методы явно, XSLT выделяет XML-элементы в данных домена и запускает соответствующие преобразования, необходимые для визуали­зации этих элементов.

Для применения преобразований XSLT данные домена должны находиться в формате XML Этого проще достичь, когда логика домена сразу же возвращает данные в формате XML или любом другом, который может быть легко преобразован в XML, например объ­екты .NET. В противном случае придется самостоятельно генерировать код XML— воз­можно, с использованием объекта переноса данных (Data Transfer Object), который способен сериализовать свое содержимое в формат XML. В этом случае сбор данных для помещения в объект переноса данных может осуществляться посредством подходящего интерфейса API. В более простых случаях можно воспользоваться сценарием транзакции (Transaction Script), который будет напрямую возвращать код XML.

Код XML, поступающий на вход преобразования, не обязательно должен быть стро­кой (если только этого не требует канал передачи данных). Как правило, гораздо быстрее и легче организовать входные данные в модель DOM.

Данные домена в формате XML передаются процессору XSLT. В последнее время на рынке программного обеспечения доступно все больше и больше коммерческих процес­соров XSLT. Логика преобразования содержится в таблице стилей XSLT, которая также передается процессору. Последний применяет таблицу стилей к входным данным XML и преобразует их в код HTML, который сразу же может быть помещен в HTTP-запрос.

Назначение

Выбор между представлением с преобразованием и представлением по шаблону зависит от того, какую среду разработки предпочитает команда, занимающаяся проектированием представлений. Ключевым фактором здесь является наличие необходимых средств. Для написания представлений по шаблону можно использовать практически любой HTML-редактор, в то время как средства для работы с XSLT не так распространены, да и воз­можностей у них значительно меньше. Кроме того, язык XSLT представляет собой доста­точно сложную смесь функционального программирования и синтаксиса XML, а потому овладеть им сможет далеко не каждый.

Одним из преимуществ XSLT является хорошая переносимость практически на все Web-платформы. Одну и ту же таблицу стилей XSLT можно применять для преобразова­ния данных XML, созданных на основе объектов J2EE или .NET, что позволяет приме­нять общие HTML-представления для данных, полученных из различных источников.

Применение XSLT значительно упрощает процесс отображения, если представление создается на основе документа XML Другие среды разработки могут потребовать преоб­разования такого документа в объект или модель XML DOM, что не так просто сделать. В этом плане XSLT прекрасно вписывается в концепцию работы с XML.

Помимо всего прочего, представление с преобразованием лишено двух недостатков, присущих представлению по шаблону. Во-первых, преобразования изначально направле­ны на визуализацию данных в формат HTML, что позволяет избежать внедрения в пред­ставление слишком большого количества логики. Кроме того, представление с преобразо­ванием легче тестировать, поскольку применение таблицы стилей не требует наличия функционирующего Web-сервера.

Представление с преобразованием преобразует данные домена в формате XML в код HTML Чтобы кардинально изменить внешний вид Web-сайта, может понадобиться вне­сти изменения в целый ряд программ преобразования. Этот процесс можно значительно облегчить, если использовать общие программы преобразования, в частности включения XSLT. Следует отметить, что применять общие преобразования гораздо проще с исполь­зованием представления с преобразованием, чем представления по шаблону. Если же вам необходим быстрый способ внесения глобальных изменений или поддержка разных спо­собов отображения одних и тех же данных, подумайте об использовании двухэтапного представления (Two Step View).

Пример: простое преобразование (Java)

Для выполнения простого преобразования необходимо определить метод, который будет применять к результатам выполнения запроса нужную таблицу стилей. Кроме того, понадобится подготовить саму таблицу стилей. Большая часть логики по обработке за­просов универсальна, поэтому в качестве контроллера можно использовать контроллер запросов (Front Controller). Здесь описан только необходимый объект команды, а применение объекта команды в выполнении запроса рассматривается в разделе, посвя­щенном контроллеру запросов.

Все, что делает объект команды, — это вызывает методы модели для получения доку­мента XML и передает его процессору XSLT.

class AlbumCommand...

public void process() {

try {

Album album = Album.findNamed(request.getParameter("name"));

Assert.notNull(album);

PrintWriter out = response.getWriter();

XsltProcessor processor = new SingleStepXsltProcessor("album.xsl");

out.print(processor.getTransformation(album.toXmlDocument()));

} catch (Exception e) {

throw new ApplicationException(e);

}

}

Полученный документ XML может выглядеть примерно так, как показано ниже.

<album>

<title>Stormcock</title>

<artist>Roy Harper</artist>

<trackList>

<track><title>Hors d'Oeuvres</title><time>8:37</time></track>

<track><title>The Same Old Rock</title><time>12:24</time></track>

<track><title>One Man Rock and Roll Band</title><time>7:23</time></track>

<track><title>Me and My Woman</title><time>13:01</time></track>

</trackList>

</album>

Преобразование документа XML выполняется с помощью шаблона XSLT. Каждая инструкция template соответствует определенному элементу XML и преобразует его в соответствующий элемент HTML-страницы. В данном примере я применил очень про­стое форматирование, только чтобы продемонстрировать, как это делается. Перечислен­ные ниже инструкции соответствуют основным элементам файла XML

<xsl:template match="album">

<HTML><BODY bgcolor="white">

<xsl:apply-templates/>

</BODY></HTML>

</xsl:template>

<xsl:template match="album/title">

<h1><xsl:apply-templates/></h1>

</xsl:template>

<xsl:template match="artist">

<P><B>Artist: </B><xsl:apply-templates/></P>

</xsl:template>

Остальные инструкции применяются для обработки таблицы, чередующиеся строки которой могут быть выделены разными цветами. Это хороший пример действия, которое невозможно выполнить путем наложения таблиц стилей, однако можно осуществить с использованием XML

<xsl:template match="trackList">

<table><xsl:apply-templates/></table>

</xsl:template>

<xsl:template match="track">

<xsl:variable name="bgcolor">

<xsl:choose>

<xsl:when test="(position() mod 2) = 1">linen</xsl:when>

<xsl:otherwise>white</xsl:otherwise>

</xsl:choose>

</xsl:variable>

<tr bgcolor="{$bgcolor}"><xsl:apply-templates/></tr>

</xsl:template>

<xsl:template match="track/title">

<td><xsl:apply-templates/></td>

</xsl:template>

<xsl:template match="track/time">

<td><xsl:apply-templates/></td>

</xsl:template>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]