Статьи

Как Groovy помогает JavaFX: прощай чистый код Java?

Одним из множества классных примеров приложений, известных тем, кто пробует JavaFX, является приложение JavaFX Weather, которое теперь входит в комплект поставки среды IDE NetBeans 6.5.1 / JavaFX 1.2 . Короче говоря, он подключается к службе погоды и затем отображает результаты для выбранных городов в впечатляющем графическом интерфейсе JavaFX:

В среду на техническом занятии в JavaOne под названием «Язык программирования JavaFX + Groovy = Красота + Производительность» Дирк Кениг продемонстрировал ряд мощных способов взаимодействия Groovy и JavaFX. Один из этих способов описан ниже, со всем кодом и результатами. Это действительно впечатляет, и Дирк получил аплодисменты своей аудитории, когда он продемонстрировал это на своей сессии.

Приложение JavaFX Weather создает вышеуказанный графический интерфейс, используя этот массивный класс Java для подключения к службе погоды Yahoo. Канал RSS, к которому подключается класс Java, полностью показан ниже:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">

    <channel>

        <title>Yahoo! Weather - Prague, EZ</title>
        <link>http://us.rd.yahoo.com/dailynews/rss/weather/Prague__EZ/*http://weather.yahoo.com/forecast/EZXX0012_f.html</link>
        <description>Yahoo! Weather for Prague, EZ</description>
        <language>en-us</language>
        <lastBuildDate>Fri, 05 Jun 2009 8:00 pm CEST</lastBuildDate>
        <ttl>60</ttl>

        <yweather:location city="Prague" region=""   country="EZ"/>
        <yweather:units temperature="F" distance="mi" pressure="in" speed="mph"/>
        <yweather:wind chill="54"   direction="60"   speed="3" />
        <yweather:atmosphere humidity="58"  visibility="6.21"  pressure="29.8"  rising="0" />
        <yweather:astronomy sunrise="4:56 am"   sunset="9:06 pm"/>

        <image>
            <title>Yahoo! Weather</title>
            <width>142</width>
            <height>18</height>
            <link>http://weather.yahoo.com</link>
            <url>http://l.yimg.com/a/i/us/nws/th/main_142b.gif</url>
        </image>

        <item>

            <title>Conditions for Prague, EZ at 8:00 pm CEST</title>
            <geo:lat>50.1</geo:lat>
            <geo:long>14.28</geo:long>
            <link>http://us.rd.yahoo.com/dailynews/rss/weather/Prague__EZ/*http://weather.yahoo.com/forecast/EZXX0012_f.html</link>
            <pubDate>Fri, 05 Jun 2009 8:00 pm CEST</pubDate>
            <yweather:condition  text="Partly Cloudy"  code="30"  temp="54"  date="Fri, 05 Jun 2009 8:00 pm CEST" />
            <description><![CDATA[
<img src="http://l.yimg.com/a/i/us/we/52/30.gif"/>
<b>Current Conditions:</b>
Partly Cloudy, 54 F
<b>Forecast:</b>
Fri - Partly Cloudy. High: 58 Low: 42
Sat - PM Rain. High: 58 Low: 49
<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Prague__EZ/*http://weather.yahoo.com/forecast/EZXX0012_f.html">Full Forecast at Yahoo! Weather</a>(provided by The Weather Channel)<br/>
]]>
            </description>
            <yweather:forecast day="Fri" date="5 Jun 2009" low="42" high="58" text="Partly Cloudy" code="29" />
            <yweather:forecast day="Sat" date="6 Jun 2009" low="49" high="58" text="PM Rain" code="12" />
            <guid isPermaLink="false">EZXX0012_2009_06_05_20_00_CEST</guid>

        </item>

    </channel>

</rss>

Теперь, когда вы слышите «Groovy», вы должны думать « хрюканье ». В этом Groovy особенно хорош. Очень яркий пример — это веб-сервисы. Кроме того, это парсинг HTML и XML. Поэтому, когда вам нужно взаимодействовать с веб-сервисами в вашем Java-приложении, самый очевидный вспомогательный язык, о котором вы должны подумать, это Groovy.

Посмотрите снова на RSS выше, а затем посмотрите на строку 11 в коде Groovy ниже. Вот эта строка:

def channel = new XmlParser().parse(url).channel

Эта строка возвращает вам элемент «канал» в RSS-канале выше! Круто, верно? И с этого момента скрипт Groovy, представленный ниже, анализирует RSS-канал, идентифицируя в точности те фрагменты, которые представляют интерес для графического интерфейса JavaFX, что приводит к ТОЧНО тому же результату, примерно в 20 строках, как в оригинале примерно в 250.

Взгляните на фрагмент Groovy ниже, чтобы увидеть, как он работает, сравнив его с RSS-каналом выше. Обратите внимание, что это даже не фрагмент! Это ВСЕ класс Groovy веб-сервис. Теперь это просто круто, особенно после того, как мы снова сравнили его с первоначальным чудовищем .

package weatherfx.service

class YahooWeatherServiceG {
static YW = new groovy.xml.Namespace("http://xml.weather.yahoo.com/ns/rss/1.0")

def forecasts

YahooWeatherServiceG(String code, boolean celsius) {
def url = "http://weather.yahooapis.com/forecastrss?u=f&p=$code"
println url.toURL().text
def channel = new XmlParser().parse(url).channel
cityName = channel[YW.location].@city
def wind = channel[YW.wind].first()
windSpeed = wind.@speed.toInteger()
windDirection = wind.@direction.toInteger()
def cond = channel.item[YW.condition].first()
temp = cond.@temp.toInteger()
forecasts = channel.item[YW.forecast]
}

String cityName
int temp
int windSpeed
int windDirection

int getConditionCode(int day=0) { forecasts[day].@code.toInteger() }
int getLowsTemp (int day=0) { forecasts[day].@low.toInteger() }
int getHighsTemp (int day=0) { forecasts[day].@high.toInteger() }
}

Теперь уделите немного времени, чтобы представить, насколько проще, эффективнее и менее подвержено ошибкам (а) тестировать и (б) поддерживать приведенный выше код по сравнению с его исходной чистой версией Java.

Однако кросс-компилятора JavaFX / Groovy пока нет. Итак, как заменить код веб-службы Java на приведенный выше в Groovy? Создайте отдельный проект, в котором вы создадите свой веб-сервис Groovy. Затем добавьте этот проект в путь к классу вашего приложения JavaFX. Затем замените две или три ссылки в приложении JavaFX для ссылки на класс Groovy (который после компиляции теперь является классом Java) вместо исходного класса Java.

На одном рисунке вышеупомянутый абзац дает вам следующее:

Затем запустите приложение JavaFX, и вы получите тот же результат, что и раньше, с той разницей, что код веб-службы теперь обрабатывается в Groovy. И … в вашем приложении больше нет чистого Java-кода. О, Боже. JavaFX создает графический интерфейс, а Groovy выполняет всю работу в фоновом режиме. Итак, прощай, чистый Java-код?