<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Блог о Java технологиях &#187; Flex</title>
	<atom:link href="http://java.in.ua/category/flex/feed/" rel="self" type="application/rss+xml" />
	<link>http://java.in.ua</link>
	<description></description>
	<lastBuildDate>Tue, 19 Jul 2011 12:39:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Java EE и Flex, Часть 1: Совместимая комбинация</title>
		<link>http://java.in.ua/2009/03/15/javaee-with-flex-1/</link>
		<comments>http://java.in.ua/2009/03/15/javaee-with-flex-1/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 23:38:18 +0000</pubDate>
		<dc:creator>Evgenij Nerush</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Java EE]]></category>

		<guid isPermaLink="false">http://java.in.ua/?p=469</guid>
		<description><![CDATA[Оригинал статьи: Java EE and Flex, Part 1: A compelling combination. Перевод: Евгений Неруш Уровень читателя: Начинающий. Разрабатывая приложение на JavaEE, и обдумывая, каким образом должна быть реализована клиентская часть, все чаще взор разработчиков падает на технологию Adobe Flex, которая в свою очередь предоставляет гибкие возможности для построения пользовательских интерфейсов. В этой статье Дастин Маркс [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Оригинал статьи: <a title="Java EE and Flex, Part 1: A compelling combination." href="http://www.javaworld.com/javaworld/jw-01-2009/jw-01-javaee-flex-1.html" target="_blank">Java EE and Flex, Part 1: A compelling combination.</a></p>
<p>Перевод: <a href="http://nerush.com.ua" target="_blank">Евгений Неруш</a></p>
<p><em>Уровень читателя: Начинающий.</em></p></blockquote>
<p><img class="size-medium wp-image-599 alignleft" title="fx" src="http://java.in.ua/wp-content/uploads/2009/03/fx-300x300.png" alt="" width="123" height="123" />Разрабатывая приложение на JavaEE, и обдумывая, каким образом должна быть реализована клиентская часть, все чаще взор разработчиков падает на технологию Adobe Flex, которая в свою очередь предоставляет гибкие возможности для построения пользовательских интерфейсов. В этой статье Дастин Маркс описывает, каким образом Flex взаимодействует с бизнес логикой, реализованной на JavaEE, и какие высоко интерактивные компоненты могут быть использованы для построения гибких пользовательских интерфейсов.</p>
<h3><span style="color: #333333;">Введение</span></h3>
<p>Flex 3 предоставляет вам другой уникальный способ построения UI для ваших JavaEE приложений.  Вы узнаете, какие возможности предоставляет Flex при работе с таблицами, как описывать лэйаут приложения на языке разметки XML, и как заставить Flex и JavaEE работать вместе. Перед инсталляцией Flex и запуском приложения, давайте рассмотрим преимущества  данной технологии:</p>
<ul>
<li style="padding: 4px 0 4px 0px">Код, написанный на Flex, может быть запущен в любом браузере. Всё что для этого нужно &#8211; это предварительно установленный плагин для Flash плеера (на данный момент у 95% браузеров Flash плеер уже установлен, что в свою очередь не может не радовать как разработчиков, так и пользователей)</li>
<li style="padding: 4px 0 4px 0px">Языки сценариев ActionScript и JavaScript основаны на стандарте ECMA-262 – международном стандарте для языка сценариев ECMAScript. По этой причине разработчики, знающие JavaScript, сразу найдут ActionScript хорошо известным языком. Flex так же предоставляет на вооружение разработчикам язык разметки MXML, позволяющий эфективно описывать лэйаут приложения</li>
<li style="padding: 4px 0 4px 0px">Flex имеет простой механизм связывания свойств одного объекта со свойствами другого объекта приложения</li>
<li style="padding: 4px 0 4px 0px">Flex имеет встроенную поддержку коммуникации с бек-энд системами как по HTTP протоколу так и по SOAP ориентированным веб сервисам</li>
<li style="padding: 4px 0 4px 0px">А также Flex предоставляет богатый набор компонентов, использование которых дает разработчикам возможность строить интерактивные пользовательские интерфейсы (включая работу с анимацией, видео и звуком)</li>
</ul>
<p>Одним из главных преимуществ является поразительное сходство синтаксиса между ActionScript 3.0 и Java. Языки используют похожие условные выражения, похожий синтаксис написания циклов, а так же код конвеншин и правила документирования кода. Структура пакетов в ActionScript родственна к структуре директорий, как и в Java. ActionScript 3 предоставляет объектно-ориентированный подход к программированию, что позволяет работать с наследованием и интерфейсами. Возможности Flex в коммуникации с Java EE приложением используя SOAP или HTTP очень развиты, но вы не лимитированны в использовании только таких подходов к коммуникации. Blaze DS &#8211; продукт компании Adobe с открытым исходным кодом, который предоставляет дополнительный гибкий подход к коммуникации с JMS. В качестве альтернативы для реализации коммуникации вы можете использовать GraniteDS, который как и Blaze DS использует бинарный AMF3 формат для общения. GraniteDS легко интегрируется с такими фреймворками, как Spring, Guice, Seam.<span id="more-469"></span></p>
<h3><span><span style="color: #333333;">Инсталляция Flex</span></span></h3>
<p>В примерах данной статьи используется <a href="http://www.adobe.com/products/flex/flexdownloads/" target="_blank">Flex 3.2 SDK</a>. Если вы хотите собрать и запустить примеры, <a href="http://www.adobe.com/products/flex/flexdownloads/" target="_blank">скачайте</a> Flex SDK (включая компилятор коммандной строки и отладчик).  Распакуйте архив в одну из директорий, например, в C:flex_sdk_3_2. Для удобства добвьте в PATH путь к bin директории, создав предварительно переменную окружения FLEX_HOME.</p>
<p>Например:<br />
<strong>set FLEX_HOME=C:flex_sdk_3_2</strong><br />
<strong>set PATH=%PATH%;%FLEX_HOME%bin;</strong></p>
<p>Корректную инсталляцию Flex вы можете проверить выполнив команду <strong>mxmlc -version</strong> в командном интерпритаторе.</p>
<p><a href="http://java.in.ua/wp-content/uploads/2009/03/jeeflx1-figure1.jpg"><img class="alignnone size-medium wp-image-526" title="jeeflx1-figure1" src="http://java.in.ua/wp-content/uploads/2009/03/jeeflx1-figure1-300x167.jpg" alt="" width="300" height="167" /></a></p>
<h4>Рисунок 1. Проверка корректной установки Flex</h4>
<h3><span style="color: #333333;">MXML: Описываем лэйаут на языке разметки XML</span></h3>
<p>Flex использует MXML для описайния лэйаута приложения. Файлы, в которых описываются лэйауты, имеют расширение .mxml. MXML код должен соответствовать хорошо оформленному XML и использовать пространства имён XML. В Листинге 1 описан простой и готовый к выполнению лэйаут Flex приложения, написанный на языке разметки MXML.</p>
<p><strong>Листинг 1. Простой пример MXML</strong></p>
<pre><code>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                width="1100" height="700"&gt;
   &lt;mx:Panel title="Some of Dustin's Favorite JavaWorld Articles"&gt;
      &lt;mx:Label text="A Small Sample of Favorite JavaWorld Articles"
                fontSize="14" fontWeight="bold" /&gt;
      &lt;mx:Grid&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Designing with Exceptions"
                         fontWeight="bold" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Bill Venners" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="http://www.javaworld.com/javaworld/jw-07-1998/jw-07-techniques.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Inheritance Versus Composition"
                         fontWeight="bold" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Bill Venners" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="http://www.javaworld.com/javaworld/jw-11-1998/jw-11-techniques.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="JSP Best Practices"
                         fontWeight="bold" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Dustin Marx" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="http://www.javaworld.com/javaworld/jw-11-2001/jw-1130-jsp.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="More JSP Best Practices"
                         fontWeight="bold" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Dustin Marx" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Why Extends is Evil"
                         fontWeight="bold" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Allen Holub" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Why Getter and Setter Methods Are Evil"
                         fontWeight="bold" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Allen Holub" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="New Features Added to Servlet 2.5"
                         fontWeight="bold" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Jason Hunter" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="http://www.javaworld.com/javaworld/jw-01-2006/jw-0102-servlet.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="REST for Java Developers, Part 1"
                         fontWeight="bold" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Brian Sletten" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="http://www.javaworld.com/javaworld/jw-10-2008/jw-10-rest-series-1.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
      &lt;/mx:Grid&gt;
   &lt;/mx:Panel&gt;
&lt;/mx:Application&gt;</code></pre>
<p>Не смотря на то, что этот пример является довольно простым и не отображает всю мощь использования Flex и Flash, он все же является простым и хорошим введением в MXML. Весь код, приведённый в Листинге 1, является хорошо оформленным XML документом. В этом примере мы наглядно видим, как просто создать даблицу, содержащую статические данные. Обратив внимание на иерархию расположения таких тегов как &lt;Grid&gt;, &lt;GridRow&gt;, &lt;GridItem&gt;, вы найдёте большое сходство в формировании таблицы в HTML используя такие теги как &lt;table&gt;, &lt;tr&gt;, &lt;td&gt;.</p>
<p>Для того, чтобы скомпилировать этот пример, предварительно сохраните файл с именем Examplу1.mxml, после чего используйте компилятор командной строки, выполнив команду:</p>
<pre><code>mxmlc Example1.mxml</code></pre>
<p>Согласно настроек компилятора по умолчанию, наш MXML файл скомпилируется в SWF файл Example1.swf в той же директории, в которой расположен Example1.mxml. Открыв SWF файл в браузере, вы увидите такое же приложение как, на Рисунке 2.</p>
<p><a href="http://java.in.ua/wp-content/uploads/2009/03/jeeflx1-figure2.jpg"><img class="alignnone size-medium wp-image-546" title="jeeflx1-figure2-thumb" src="http://java.in.ua/wp-content/uploads/2009/03/jeeflx1-figure2-thumb-300x104.jpg" alt="" width="300" height="104" /><br />
</a></p>
<p><strong>Рисунок 2. Скомпилированное приложение.</strong></p>
<p>Не смотря на то, что мы уже имеем рабочее приложение, оно все же не содержит интерактивности с пользователем. В следующем примере мы свяжем таблицу с CSS стилями, а ссылки в таблице сделам кликабельными.</p>
<h3><span><span style="color: #333333;">Добавление стилей и ссылок</span></span></h3>
<p>Листинг 2 включает в себя код из Листинга 1, но вдобавок имеет ряд изменений: мы добавляем стили и делаем ссылки кликабельными.</p>
<p><strong>Листинг 2. Приложение со стилями и кликабельными ссылками.</strong></p>
<pre><code>&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                width="1100" height="700"&gt;
   &lt;mx:Style&gt;
      .articleTitle
      {
         font-weight: bold;
      }
      .gridLabel
      {
         font-weight: bold;
         font-size: 14;
      }
   &lt;/mx:Style&gt;
   &lt;mx:Panel title="Some of Dustin's Favorite JavaWorld Articles"&gt;
      &lt;mx:Label text="A Small Sample of Favorite JavaWorld Articles"
                styleName="gridLabel" /&gt;
      &lt;mx:Grid&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Designing with Exceptions"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Bill Venners" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label id="exceptionsUrl"
                         htmlText="&amp;lt;a href='http://www.javaworld.com/javaworld/jw-07-1998/jw-07-techniques.html'&gt;http://www.javaworld.com/javaworld/jw-07-1998/jw-07-techniques.html</code><code>&amp;lt;</code><code>/a&gt;"
                         selectable="true"
                         mouseOut="exceptionsUrl.setStyle('textDecoration', 'none');"
                         mouseOver="exceptionsUrl.setStyle('textDecoration', 'underline');" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Inheritance Versus Composition"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Bill Venners" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label id="inheritanceUrl"
                         htmlText="</code><code>&amp;lt;</code><code>a href='http://www.javaworld.com/javaworld/jw-11-1998/jw-11-techniques.html'&gt;http://www.javaworld.com/javaworld/jw-11-1998/jw-11-techniques.html</code><code>&amp;lt;</code><code>/a&gt;"
                         selectable="true"
                         mouseOut="inheritanceUrl.setStyle('textDecoration', 'none');"
                         mouseOver="inheritanceUrl.setStyle('textDecoration', 'underline');" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="JSP Best Practices"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Dustin Marx" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label id="jspBestPractices1Url"
                         htmlText="</code><code>&amp;lt;</code><code>a href='http://www.javaworld.com/javaworld/jw-11-2001/jw-1130-jsp.html'&gt;http://www.javaworld.com/javaworld/jw-11-2001/jw-1130-jsp.html</code><code>&amp;lt;</code><code>/a&gt;"
                         selectable="true"
                         mouseOut="jspBestPractices1Url.setStyle('textDecoration', 'none');"
                         mouseOver="jspBestPractices1Url.setStyle('textDecoration', 'underline');" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="More JSP Best Practices"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Dustin Marx" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label id="jspBestPractices2Url"
                         htmlText="</code><code>&amp;lt;</code><code>a href='http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html'&gt;http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html</code><code>&amp;lt;</code><code>/a&gt;"
                         selectable="true"
                         mouseOut="jspBestPractices2Url.setStyle('textDecoration', 'none');"
                         mouseOver="jspBestPractices2Url.setStyle('textDecoration', 'underline');" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Why Extends is Evil"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Allen Holub" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label id="evilExtendsUrl"
                         htmlText="</code><code>&amp;lt;</code><code>a href='http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html'&gt;http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html</code><code>&amp;lt;</code><code>/a&gt;"
                         selectable="true"
                         mouseOut="evilExtendsUrl.setStyle('textDecoration', 'none');"
                         mouseOver="evilExtendsUrl.setStyle('textDecoration', 'underline');" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Why Getter and Setter Methods Are Evil"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Allen Holub" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label id="getSetEvilUrl"
                         htmlText="</code><code>&amp;lt;</code><code>a href='http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html'&gt;http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html</code><code>&amp;lt;</code><code>/a&gt;"
                         selectable="true"
                         mouseOut="getSetEvilUrl.setStyle('textDecoration', 'none');"
                         mouseOver="getSetEvilUrl.setStyle('textDecoration', 'underline');" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="New Features Added to Servlet 2.5"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Jason Hunter" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label id="servletUrl"
                         htmlText="</code><code>&amp;lt;</code><code>a href='http://www.javaworld.com/javaworld/jw-01-2006/jw-0102-servlet.html'&gt;http://www.javaworld.com/javaworld/jw-01-2006/jw-0102-servlet.html</code><code>&amp;lt;</code><code>/a&gt;"
                         selectable="true"
                         mouseOut="servletUrl.setStyle('textDecoration', 'none');"
                         mouseOver="servletUrl.setStyle('textDecoration', 'underline');" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="REST for Java Developers, Part 1"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Brian Sletten" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label id="restUrl"
                         htmlText="</code><code>&amp;lt;</code><code>a href='http://www.javaworld.com/javaworld/jw-10-2008/jw-10-rest-series-1.html'&gt;http://www.javaworld.com/javaworld/jw-10-2008/jw-10-rest-series-1.html</code><code>&amp;lt;</code><code>/a&gt;"
                         selectable="true"
                         mouseOut="restUrl.setStyle('textDecoration', 'none');"
                         mouseOver="restUrl.setStyle('textDecoration', 'underline');" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
      &lt;/mx:Grid&gt;
   &lt;/mx:Panel&gt;
&lt;/mx:Application&gt;</code></pre>
<p>Сохраните этот MXML код в файл с именем Example2.mxml. Скомпилируйте его с помощью компилятора mxml, после чего на выходе вы получите Example2.swf, и запустите в браузере. Вы увидите такое же приложение, как на Рисунке 3.</p>
<p><a href="http://java.in.ua/wp-content/uploads/2009/03/jeeflx1-figure3.jpg"><img class="alignnone size-medium wp-image-556" title="jeeflx1-figure3-thumb" src="http://java.in.ua/wp-content/uploads/2009/03/jeeflx1-figure3-thumb-300x107.jpg" alt="" width="300" height="107" /></a></p>
<p><strong>Рисунок 3. Скомпилированное приложение с гипертекстовыми ссылками.</strong></p>
<p>Как мы видим на рисунке/в приложении, к каждой ссылке применён стиль. При наведении курсора мыши на одну из ссылок в таблице, последняя принемает стиль подчеркивания. Такая функциональность реализована с помощью событий mouseOver и mouseOut соответственно. Если мы детально посмотрим на код в нашем втором примере, мы сможем заметить, что он довольно избыточен. Для того, что бы это исправить, давайте напишим собственный компонент, что позволит нам внести гибкость в разработку и избавиться от избыточного кода.</p>
<h3><span><span><span style="color: #333333;">Реализация собственного компонента</span></span></span></h3>
<p>Листинг 3 прекрасно демонстрирует создание специализированного компонента Label, использование которого в конечном итоге позволит нам избавиться от избыточного кода в нашем приложении.</p>
<p><strong>Листинг 3. Реализация компонента UrlLabel.mxml</strong></p>
<pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Label xmlns:mx="http://www.adobe.com/2006/mxml"
          selectable="true"
          mouseOut="this.setStyle('textDecoration', 'none');"
          mouseOver="this.setStyle('textDecoration', 'underline');"
          creationComplete="initializeHtmlText();"&gt;
   &lt;mx:Script&gt;
   &lt;![CDATA[
   public function initializeHtmlText():void
   {
      this.htmlText = "&lt;a href='" + this.text + "'&gt;" + this.text + "&lt;/a&gt;";
   }
   ]]&gt;
   &lt;/mx:Script&gt;
&lt;/mx:Label&gt;</code></pre>
<p>Листинг 3 описывает создание нового компонента UrlLabel(заметьте, имя компонента соответствует с именем файла UrlLabel.mxml).  Этот компонент инкапсулирует процесс создания ссылки, а также задает поведение для таких событий, как mouseOut и mouseOver. Проведя небольшой рефакторинг кода из Листинга 3, мы получаем менее избыточный код в Листинге 4.</p>
<p><strong>Листинг 4. Пример использования собственного компонента UrlLabel.mxml</strong></p>
<pre><code>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                xmlns:jw="components.*"
                width="1100" height="700"&gt;
   &lt;mx:Style&gt;
   .articleTitle
   {
      font-weight: bold;
   }
   .gridLabel
   {
      font-weight: bold;
      font-size: 14;
   }
   &lt;/mx:Style&gt;
   &lt;mx:Panel title="Some of Dustin's Favorite JavaWorld Articles"&gt;
      &lt;mx:Label text="A Small Sample of Favorite JavaWorld Articles"
                styleName="gridLabel" /&gt;
      &lt;mx:Grid&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Designing with Exceptions"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Bill Venners" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;jw:UrlLabel id="exceptionsUrl"
                            text="http://www.javaworld.com/javaworld/jw-07-1998/jw-07-techniques.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Inheritance Versus Composition"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Bill Venners" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;jw:UrlLabel id="inheritanceUrl"
                            text="http://www.javaworld.com/javaworld/jw-11-1998/jw-11-techniques.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="JSP Best Practices"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Dustin Marx" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;jw:UrlLabel id="jspBestPractices1Url"
                            text="http://www.javaworld.com/javaworld/jw-11-2001/jw-1130-jsp.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="More JSP Best Practices"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Dustin Marx" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;jw:UrlLabel id="jspBestPractices2Url"
                            text="http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Why Extends is Evil"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Allen Holub" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;jw:UrlLabel id="evilExtendsUrl"
                            text="http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Why Getter and Setter Methods Are Evil"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Allen Holub" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;jw:UrlLabel id="getSetEvilUrl"
                            text="http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="New Features Added to Servlet 2.5"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Jason Hunter" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;jw:UrlLabel id="servletUrl"
                            text="http://www.javaworld.com/javaworld/jw-01-2006/jw-0102-servlet.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
         &lt;mx:GridRow&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="REST for Java Developers, Part 1"
                         styleName="articleTitle" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;mx:Label text="Brian Sletten" /&gt;
            &lt;/mx:GridItem&gt;
            &lt;mx:GridItem&gt;
               &lt;jw:UrlLabel id="restUrl"
                            text="http://www.javaworld.com/javaworld/jw-10-2008/jw-10-rest-series-1.html" /&gt;
            &lt;/mx:GridItem&gt;
         &lt;/mx:GridRow&gt;
      &lt;/mx:Grid&gt;
   &lt;/mx:Panel&gt;
&lt;/mx:Application&gt;</code></pre>
<h3><span><span><span style="color: #333333;">Дополнительный рефакторинг</span></span></span></h3>
<p>Если мы вынесем создание каждого<span style="color: #333333;"> элемента GridRow в наш собственный компонент, мы существенно упрости код приложения. Листинг 5демонстрирует нам создание собственного ArticleGridRow компонента. </span></p>
<p><strong>Листинг 5. ArticleGridRow.mxml</strong></p>
<pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:GridRow xmlns:mx="http://www.adobe.com/2006/mxml"
            xmlns:jw="components.*"&gt;
   &lt;mx:Script&gt;
   &lt;![CDATA[
   [Bindable] public var articleUrl:String = "N/A";
   [Bindable] public var articleTitle:String = "N/A";
   [Bindable] public var articleAuthor:String = "N/A";
   ]]&gt;
   &lt;/mx:Script&gt;

   &lt;mx:GridItem&gt;
      &lt;mx:Label text="{articleTitle}" styleName="articleTitle" /&gt;
      &lt;/mx:GridItem&gt;
      &lt;mx:GridItem&gt;
         &lt;mx:Label text="{articleAuthor}" /&gt;
      &lt;/mx:GridItem&gt;
      &lt;mx:GridItem&gt;
      &lt;jw:UrlLabel text="{articleUrl}" /&gt;
   &lt;/mx:GridItem&gt;
&lt;/mx:GridRow&gt;</code></pre>
<p>ArticleGridRow.mxml использует уже написаный нами ранее компонент UrlLabel и инкапсулирует процесс создания строки для нашей таблицы. Этот компактный компонент делает код нашего приложения более гибким, в чем вы можете удостовериться просмотрев Листинг 6.</p>
<p><strong>Листинг 6. Example4.mxml</strong></p>
<pre><code>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                xmlns:jw="components.*"
                width="1100" height="700"&gt;
   &lt;mx:Style&gt;
   .articleTitle
   {
      font-weight: bold;
   }
   .gridLabel
   {
      font-weight: bold;
      font-size: 14;
   }
   &lt;/mx:Style&gt;
   &lt;mx:Panel title="Some of Dustin's Favorite JavaWorld Articles"&gt;
      &lt;mx:Label text="A Small Sample of Favorite JavaWorld Articles"
                styleName="gridLabel" /&gt;
      &lt;mx:Grid&gt;
         &lt;jw:ArticleGridRow articleTitle="Designing with Exceptions"
                            articleAuthor="Bill Venners"
                            articleUrl="http://www.javaworld.com/javaworld/jw-07-1998/jw-07-techniques.html" /&gt;
         &lt;jw:ArticleGridRow articleTitle="Inheritance Versus Composition"
                            articleAuthor="Bill Venners"
                            articleUrl="http://www.javaworld.com/javaworld/jw-11-1998/jw-11-techniques.html" /&gt;
         &lt;jw:ArticleGridRow articleTitle="JSP Best Practices"
                            articleAuthor="Dustin Marx"
                            articleUrl="http://www.javaworld.com/javaworld/jw-11-2001/jw-1130-jsp.html" /&gt;
         &lt;jw:ArticleGridRow articleTitle="More JSP Best Practices"
                            articleAuthor="Dustin Marx"
                            articleUrl="http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html" /&gt;
         &lt;jw:ArticleGridRow articleTitle="Why Extends is Evil"
                            articleAuthor="Allen Holub"
                            articleUrl="http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html" /&gt;
         &lt;jw:ArticleGridRow articleTitle="Why Getter and Setter Methods Are Evil"
                            articleAuthor="Allen Holub"
                            articleUrl="http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html" /&gt;
         &lt;jw:ArticleGridRow articleTitle="New Features Added to Servlet 2.5"
                            articleAuthor="Jason Hunter"
                            articleUrl="http://www.javaworld.com/javaworld/jw-01-2006/jw-0102-servlet.html" /&gt;
         &lt;jw:ArticleGridRow articleTitle="REST for Java Developers, Part 1"
                            articleAuthor="Brian Sletten"
                            articleUrl="http://www.javaworld.com/javaworld/jw-10-2008/jw-10-rest-series-1.html" /&gt;
      &lt;/mx:Grid&gt;
   &lt;/mx:Panel&gt;
&lt;/mx:Application&gt;</code></pre>
<p>Итак, наше Flex приложение уже:</p>
<ul>
<li style="padding: 4px 0 4px 0px">Использует CSS стили</li>
<li style="padding: 4px 0 4px 0px">Демонстрирует грамматику и синтаксис языка разметки MXML</li>
<li style="padding: 4px 0 4px 0px">Демонстрирует создание собственных компонентов</li>
</ul>
<p>Не смотря на пункты указанные выше, процесс работы с данными в нашем приложение остается статическим, т.е. таким, которое не работает с динамическими данными.</p>
<h3><span><span style="color: #333333;">Совмещаем Java EE и Flex</span></span></h3>
<p>Flex предоставляет несколько типов таблиц, поддерживающих работу с динамическими данными. Мы сфокусируемся на главном компоненте DataGrid, который поставляется вместе с Flex SDK (в состав стандартных компонентов Flex так же входит AdvancedDataGrid, кроме этого так же доступны компоненты сторонних разработчиков).</p>
<p><a href="http://livedocs.adobe.com/flex/3/langref/" target="_blank">The Flex 3 Language Reference</a> и <a href="http://examples.adobe.com/flex3/componentexplorer/explorer.html">Flex 3 Component Explorer</a> включают примеры исходного кода визуальных компонентов.</p>
<p>Давайте рассмотрим версию кода нашего приложения после рефакторинга, приведённую в Листинге 7, которая использует компонент DataGrid.</p>
<p><strong>Листинг 7. Example5.mxml</strong></p>
<pre><code>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                xmlns:jw="components.*"
                width="1100" height="700"&gt;
   &lt;mx:Style&gt;
   .articleTitle
   {
      font-weight: bold;
   }
   .gridLabel
   {
      font-weight: bold;
      font-size: 14;
   }
   &lt;/mx:Style&gt;
   &lt;mx:XMLList id="articles"&gt;
      &lt;article&gt;
         &lt;title&gt;Designing with Exceptions&lt;/title&gt;
         &lt;author&gt;Bill Venners&lt;/author&gt;
         &lt;url&gt;http://www.javaworld.com/javaworld/jw-07-1998/jw-07-techniques.html&lt;/url&gt;
      &lt;/article&gt;
      &lt;article&gt;
         &lt;title&gt;Inheritance Versus Composition&lt;/title&gt;
         &lt;author&gt;Bill Venners&lt;/author&gt;
         &lt;url&gt;http://www.javaworld.com/javaworld/jw-11-1998/jw-11-techniques.html&lt;/url&gt;
      &lt;/article&gt;
      &lt;article&gt;
         &lt;title&gt;JSP Best Practices&lt;/title&gt;
         &lt;author&gt;Dustin Marx&lt;/author&gt;
         &lt;url&gt;http://www.javaworld.com/javaworld/jw-11-2001/jw-1130-jsp.html&lt;/url&gt;
      &lt;/article&gt;
      &lt;article&gt;
         &lt;title&gt;More JSP Best Practices&lt;/title&gt;
         &lt;author&gt;Dustin Marx&lt;/author&gt;
         &lt;url&gt;http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html&lt;/url&gt;
      &lt;/article&gt;
      &lt;article&gt;
         &lt;title&gt;Why Extends is Evil&lt;/title&gt;
         &lt;author&gt;Allen Holub&lt;/author&gt;
         &lt;url&gt;http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html&lt;/url&gt;
      &lt;/article&gt;
      &lt;article&gt;
         &lt;title&gt;Why Getter and Setter Methods Are Evil&lt;/title&gt;
         &lt;author&gt;Allen Holub&lt;/author&gt;
         &lt;url&gt;http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html&lt;/url&gt;
      &lt;/article&gt;
      &lt;article&gt;
         &lt;title&gt;New Features Added to Servlet 2.5&lt;/title&gt;
         &lt;author&gt;Jason Hunter&lt;/author&gt;
         &lt;url&gt;http://www.javaworld.com/javaworld/jw-01-2006/jw-0102-servlet.html&lt;/url&gt;
      &lt;/article&gt;
      &lt;article&gt;
         &lt;title&gt;REST for Java Developers, Part 1&lt;/title&gt;
         &lt;author&gt;Brian Sletten&lt;/author&gt;
         &lt;url&gt;http://www.javaworld.com/javaworld/jw-10-2008/jw-10-rest-series-1.html&lt;/url&gt;
      &lt;/article&gt;
   &lt;/mx:XMLList&gt;

   &lt;mx:Panel id="mainPanel" title="Some of Dustin's Favorite JavaWorld Articles"
             width="{application.width}"&gt;
      &lt;mx:Label text="A Small Sample of Favorite JavaWorld Articles"
                styleName="gridLabel" /&gt;
      &lt;mx:DataGrid id="dataGrid"
                   width="{mainPanel.width*0.9}"
                   rowCount="5" dataProvider="{articles}"
                   editable="false"&gt;
            &lt;mx:columns&gt;
                &lt;mx:DataGridColumn id="titleColumn"
                                   dataField="title"
                                   headerText="Article Title"
                                   width="{dataGrid.width*0.25}"
                                   editable="false" /&gt;
                &lt;mx:DataGridColumn id="authorColumn"
                                   dataField="author"
                                   headerText="Article Author"
                                   width="{dataGrid.width*0.25}"
                                   editable="false" /&gt;
                &lt;mx:DataGridColumn id="urlColumn"
                                   dataField="url"
                                   headerText="Article URL"
                                   editable="true"&gt;
                  &lt;mx:itemRenderer&gt;
                     &lt;mx:Component&gt;
                        &lt;jw:UrlLabel /&gt;
                     &lt;/mx:Component&gt;
                  &lt;/mx:itemRenderer&gt;
                &lt;/mx:DataGridColumn&gt;
            &lt;/mx:columns&gt;
      &lt;/mx:DataGrid&gt;
   &lt;/mx:Panel&gt;
&lt;/mx:Application&gt;</code></pre>
<p>В Листинге 7 мы заменили компонент Grid на DataGrid. Использование компонента DataGrid даёт нам прекрасную возможность работать с данными через dataProvider аттрибут, этим самым отделяя модель (XMLList) от вида (DataGrid).</p>
<p>Скомпилировав Example5.mxml мы получим приложение, показанное на рисунке 4.</p>
<p><a href="http://java.in.ua/wp-content/uploads/2009/03/jeeflx1-figure4.jpg"><img class="alignnone size-medium wp-image-571" title="jeeflx1-figure4-thumb" src="http://java.in.ua/wp-content/uploads/2009/03/jeeflx1-figure4-thumb-300x78.jpg" alt="" width="300" height="78" /></a></p>
<p><strong>Рисунок 4. Использование DataGrid компонента (кликните на рисунке чтобы увеличить).</strong></p>
<p>Как показано на рисунке 4, количество отображаемых записей соответствует значению аттрибута rowCount. Строки компонента DataGrid могут быть как отсортированы, так и изменены в размере по высоте.</p>
<p>Не смотря на то, что мы вынесли данные в XMLList, мы всё ещё имеем проблему хардкодинга в нашем последнем примере. В следующем примере мы воспользуемся данными, приходящими с сервера. Для этого мы обратимся к входящему в состав Flex HTTPService сервису, использование которого описано в Листинге 8.</p>
<p><strong>Листинг 8. Example6.mxml</strong></p>
<pre><code>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                xmlns:jw="components.*"
                width="1100" height="700"
                applicationComplete="articles.send();"&gt;
   &lt;mx:Style&gt;
   .articleTitle
   {
      font-weight: bold;
   }
   .gridLabel
   {
      font-weight: bold;
      font-size: 14;
   }
   &lt;/mx:Style&gt;

   &lt;mx:Script&gt;
   import mx.controls.Alert;
   import mx.rpc.events.FaultEvent;
   import mx.rpc.events.ResultEvent;
   import mx.rpc.Fault;
   import mx.utils.ObjectUtil;

   public function faultHandler(event:FaultEvent):void
   {
      const fault:Fault = event.fault;
      const faultString:String =
           "FAULT CODE: " + fault.faultCode + "nn"
         + "FAULT DETAIL: " + fault.faultDetail + "nn"
         + "FAULT STRING: " + fault.faultString + "nn";
      Alert.show( "FAULT!nn" + faultString );
   }

   public function resultHandler(event:ResultEvent):void
   {
      trace("Response from service received.");
      // The ResultEvent includes a property "message" that contains
      //   the actual payload/contents of the result.  This is useful
      //   when no fault is occurring, but no data is being displayed
      //   in the component either.
   }
   &lt;/mx:Script&gt;

   &lt;mx:HTTPService id="articles"
                   url="http://localhost:8080/jwFlexJEEArticles/articles"
                   method="GET"
                   resultFormat="e4x"
                   fault="faultHandler(event);"
                   result="resultHandler(event);" /&gt;

   &lt;mx:Panel id="mainPanel"
             title="Some of Dustin's Favorite JavaWorld Articles"
             width="{application.width}"&gt;
      &lt;mx:Label text="A Small Sample of Favorite JavaWorld Articles"
                styleName="gridLabel" /&gt;
      &lt;mx:DataGrid id="dataGrid"
                   width="{mainPanel.width*0.9}"
                   rowCount="5" dataProvider="{articles.lastResult.article}"
                   editable="false"&gt;
            &lt;mx:columns&gt;
                &lt;mx:DataGridColumn id="titleColumn"
                                   dataField="title"
                                   headerText="Article Title"
                                   width="{dataGrid.width*0.25}"
                                   editable="false" /&gt;
                &lt;mx:DataGridColumn id="authorColumn"
                                   dataField="author"
                                   headerText="Article Author"
                                   width="{dataGrid.width*0.25}"
                                   editable="false" /&gt;
                &lt;mx:DataGridColumn id="urlColumn"
                                   dataField="url"
                                   headerText="Article URL"
                                   editable="true"&gt;
                  &lt;mx:itemRenderer&gt;
                     &lt;mx:Component&gt;
                        &lt;jw:UrlLabel /&gt;
                     &lt;/mx:Component&gt;
                  &lt;/mx:itemRenderer&gt;
                &lt;/mx:DataGridColumn&gt;
            &lt;/mx:columns&gt;
      &lt;/mx:DataGrid&gt;
   &lt;/mx:Panel&gt;
&lt;/mx:Application&gt;</code></pre>
<p>Сейчас, когда мы имеем HTTPService связанный с определённым URL, нам необходимо реадизовать ответ на запрос. В этом нам поможет простой сервлет, приведённый в Листинге 9.</p>
<p><strong>Листинг 9. ArticleServer.java</strong></p>
<pre><code>package javaworld.dustin;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Simplistic servlet to serve up basic article information.
 *
 * @author Dustin
 */
public class ArticleServer extends HttpServlet
{
   /**
    * Handles the HTTP &lt;code&gt;GET&lt;/code&gt; method.
    *
    * @param request Servlet request.
    * @param response Servlet response.
    * @throws ServletException
    * @throws IOException
    */
   @Override
   protected void doGet(
      final HttpServletRequest request, final HttpServletResponse response)
      throws ServletException, IOException
   {
      response.setContentType("text/html;charset=UTF-8");
      final PrintWriter out = response.getWriter();
      try
      {
         final ServletContext context = this.getServletContext();
         final InputStream articlesXmlInput =
            context.getResourceAsStream("/Articles.xml");
         final InputStreamReader reader = new InputStreamReader(articlesXmlInput);
         final BufferedReader bufferedReader = new BufferedReader(reader);
         String line = null;
         while ((line = bufferedReader.readLine()) != null)
         {
            out.println(line);
         }
      }
      finally
      {
         out.close();
      }
   } 

   /**
    * Handles the HTTP &lt;code&gt;POST&lt;/code&gt; method.
    * @param request servlet request
    * @param response servlet response
    * @throws ServletException
    * @throws IOException
    * @throws UnsupportedOperationException Thrown if this method is called
    *    because this method is not intended for clients to call.
    */
   @Override
   protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException
   {
      throw new UnsupportedOperationException(
         "Only GET HTTP method applies for this service.");
   }

   /**
    * Returns a short description of the servlet.
    */
   @Override
   public String getServletInfo()
   {
      return "Provides basic information on select JavaWorld articles via GET request.";
   }
}</code></pre>
<p>Этот сервлет возвращает содержимое файла Articles.xml, приведённого в Листинге 10.</p>
<p><strong>Листинг 10. Articles.xml</strong></p>
<pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;Articles&gt;
   &lt;article&gt;
      &lt;title&gt;Designing with Exceptions&lt;/title&gt;
      &lt;author&gt;Bill Venners&lt;/author&gt;
      &lt;url&gt;http://www.javaworld.com/javaworld/jw-07-1998/jw-07-techniques.html&lt;/url&gt;
   &lt;/article&gt;
   &lt;article&gt;
      &lt;title&gt;Inheritance Versus Composition&lt;/title&gt;
      &lt;author&gt;Bill Venners&lt;/author&gt;
      &lt;url&gt;http://www.javaworld.com/javaworld/jw-11-1998/jw-11-techniques.html&lt;/url&gt;
   &lt;/article&gt;
   &lt;article&gt;
      &lt;title&gt;JSP Best Practices&lt;/title&gt;
      &lt;author&gt;Dustin Marx&lt;/author&gt;
      &lt;url&gt;http://www.javaworld.com/javaworld/jw-11-2001/jw-1130-jsp.html&lt;/url&gt;
   &lt;/article&gt;
   &lt;article&gt;
      &lt;title&gt;More JSP Best Practices&lt;/title&gt;
      &lt;author&gt;Dustin Marx&lt;/author&gt;
      &lt;url&gt;http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html&lt;/url&gt;
   &lt;/article&gt;
   &lt;article&gt;
      &lt;title&gt;Why Extends is Evil&lt;/title&gt;
      &lt;author&gt;Allen Holub&lt;/author&gt;
      &lt;url&gt;http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html&lt;/url&gt;
   &lt;/article&gt;
   &lt;article&gt;
      &lt;title&gt;Why Getter and Setter Methods Are Evil&lt;/title&gt;
      &lt;author&gt;Allen Holub&lt;/author&gt;
      &lt;url&gt;http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html&lt;/url&gt;
   &lt;/article&gt;
   &lt;article&gt;
      &lt;title&gt;New Features Added to Servlet 2.5&lt;/title&gt;
      &lt;author&gt;Jason Hunter&lt;/author&gt;
      &lt;url&gt;http://www.javaworld.com/javaworld/jw-01-2006/jw-0102-servlet.html&lt;/url&gt;
   &lt;/article&gt;
   &lt;article&gt;
      &lt;title&gt;REST for Java Developers, Part 1&lt;/title&gt;
      &lt;author&gt;Brian Sletten&lt;/author&gt;
      &lt;url&gt;http://www.javaworld.com/javaworld/jw-10-2008/jw-10-rest-series-1.html&lt;/url&gt;
   &lt;/article&gt;
&lt;/Articles&gt;

</code></pre>
<p>Листинг 11 отображает содержимое web.xml файла.</p>
<p><strong>Листинг 11. web.xml</strong></p>
<pre><code>&lt;?xml version = '1.0' encoding = 'utf-8'?&gt;
&lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee"&gt;
   &lt;display-name&gt;JavaWorld Flex/Java EE Part 1 Article&lt;/display-name&gt;
   &lt;description&gt;Server-side functionality for JavaWorld Flex/Java EE Part 1 Article&lt;/description&gt;
   &lt;servlet&gt;
      &lt;servlet-name&gt;ArticleServer&lt;/servlet-name&gt;
      &lt;servlet-class&gt;javaworld.dustin.ArticleServer&lt;/servlet-class&gt;
   &lt;/servlet&gt;
   &lt;servlet-mapping&gt;
      &lt;servlet-name&gt;ArticleServer&lt;/servlet-name&gt;
      &lt;url-pattern&gt;/articles&lt;/url-pattern&gt;
   &lt;/servlet-mapping&gt;

   &lt;session-config&gt;
      &lt;session-timeout&gt;35&lt;/session-timeout&gt;
   &lt;/session-config&gt;
   &lt;mime-mapping&gt;
      &lt;extension&gt;html&lt;/extension&gt;
      &lt;mime-type&gt;text/html&lt;/mime-type&gt;
   &lt;/mime-mapping&gt;
   &lt;mime-mapping&gt;
      &lt;extension&gt;txt&lt;/extension&gt;
      &lt;mime-type&gt;text/plain&lt;/mime-type&gt;
   &lt;/mime-mapping&gt;
&lt;/web-app&gt;</code></pre>
<p>Теперь наступило время собрать и развернуть приложение  на одном из серверов приложений (в нашем случае использование контейнера сервлетов Tomcat будет достаточным).</p>
<div><script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://java.in.ua/2009/03/15/javaee-with-flex-1/","Java EE и Flex, Часть 1: Совместимая комбинация")</script></div>]]></content:encoded>
			<wfw:commentRss>http://java.in.ua/2009/03/15/javaee-with-flex-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

