RSS Injection (Часть 1) « Java  «  Статьи  «  Главная страница
Главная страница  |  Статьи  |  Персонал  |  Поток сознания  |  Интересно  |  Киев  |  Карта сайта
 
 
 
Java  |  Project Management  |  Web-development  

RSS Injection (Часть 1)



Яндекс.Погода

26-12-2007 Ни для кого не секрет, что в последнее время RSS каналы стали не только популярным средством продвижения новостных лент, но и эффективным способом обмена информационными потоками между сайтами. В данной статье речь пойдет о том, как реализовать потребность в RSS, используя один из самых популярных фреймворков – Spring.


Введение

Ни для кого не секрет, что в последнее время RSS каналы стали не только популярным средством продвижения новостных лент, но и эффективным способом обмена информационными потоками между сайтами. В данной статье речь пойдет о том, как реализовать потребность в RSS, используя один из самых популярных фреймворков – Spring.

Подготовка

По умолчанию в API Spring Web MVC framework входит целый набор представлений (View), реализующих рендеринг модели в различные форматы, включая PDF и Excel. Классы, предоставляющие такую возможность, находятся в пакетах org.springframework.web.servlet.view.*. Однако готового класса, позволяющего выполнять рендеринг модели в RSS или Atom, Spring пока не предоставляет.

Одной из очень удачных библиотек, позволяющих работать с синдикат-каналами, является ROME [2], разработанная инженерами из Sun. Основным ее достоинством является то, что она предоставляет API, полностью абстрогированный от конкретных реализаций RSS и Atom форматов (RSS 0.90, RSS 0.91 Netscape, RSS 0.91 Userland, RSS 0.92, RSS 0.93, RSS 0.94, RSS 1.0, RSS 2.0, Atom 0.3, and Atom 1.0).

Как уже было сказано выше, интеграция ROME и Spring по умолчанию в данный момент отсутствует - именно решением этой задачи мы и займемся в следующих строках.

В качестве примера мы разработаем небольшое приложение (rssinj), которое по запросу к url: /rssinj/newsrss.rss будет генерировать RSS feed для виртуальной новостной системы.

Мы начнем подготовку к разработке с объявления entry-point нашего приложения в web.xml:

<servlet>
        <servlet-name>rssinj</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>rssinj</servlet-name>
        <url-pattern>*.rss</url-pattern>
    </servlet-mapping>

Далее, следуя "Convention over configuration" [1], создадим rssinj-servlet.xml в котором произведем внедрение бина, позволяющего автоматически ассоциировать адрес /newsrss.rss с соответствующим контроллером:

<bean
        class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
    </bean>

также внедряем сам контроллер:

<bean id="newsController"
        class="com.webtair.articles.rssinj.mvc.NewsRssController" >
        <property name="commandClass" value="java.lang.Object" />
        <property name="newsDao">
            <ref bean="newsDao" />
        </property>
    </bean>

Как видно из кода приведенного выше, наш контроллер предполагает наличие в контексте приложения DAO-сущности, позволяющей обращаться к репозиторию и извлекать из него список новостей, к которому мы предполагаем предоставить доступ через rss-канал. Мы не будем подробно останавливаться на разработке этого слоя, и для простоты изложения, объявим список новостей непосредственно в rssinj-servlet.xml ( подробнее см. [4] ):

<bean id="newsDao" class="com.webtair.articles.rssinj.dao.NewsDao">
        <property name="newsList">
            <list>
                <ref bean="news1"/>
                <ref bean="news2"/>
                <ref bean="news3"/>
            </list>
        </property>
    </bean>
    <bean id="news1" class="com.webtair.articles.rssinj.domain.NewsBean">
        <property name="title" value="Adobe unveils Flash video control" />
        <property name="link" value="http://news.bbc.co.uk/2/hi/business/6558979.stm" />
        <property name="publishedDate" value="2007-04-16" />
        <property name="description" value="Adobe unveils a..." />
    </bean>
    <bean id="news2" class="com.webtair.articles.rssinj.domain.NewsBean">
        ...
    </bean>
    <bean id="news3" class="com.webtair.articles.rssinj.domain.NewsBean">
       ...
    </bean>

Таким образом, после выполненных действий в контексте приложения появится три экземпляра класса NewsBean, содержащие title, link, publishedDate и description. Непосредственно в контроллере доступ к списку новостей осуществляется с помощью следующего вызова:

List<NewsBean> newsList = newsDao.getNewsList();

Так же следует обратить внимание читателя на то, что именно строка

<bean id="newsController" class="com.webtair.articles.rssinj.mvc.NewsRssController" >

приводит к тому, что при обработке адреса /newsrss.rss управление передается непосредственно на newsController (подробнее см. [1], 13.11.1 ). На этом подготовка среды закончена и мы можем смело приступить к разработке представления (View), позволяющего нам сформировать rss канал.

Разработка

В качестве библиотеки, позволяющей формировать RSS и Atom в соответсвии со стандартами, мы остановлись на ROME ([2]), соответствующий rome-*.jar которой необходимо расположить в /lib нашего проекта. ROME использует также jDom ([3]), jar которого также понадобится в /lib (подробнее см. [4] /lib/readme.txt).

В Spring определен базовый абстрактный класс (org.springframework.web.servlet.view.AbstractView) для разработки представлений, от которого мы унаследуемся и создадим свою абстракцию (com.webtair.articles.rssinj.view.RssAbstractView) для дальнейшей работы с rss:

Ключевым, в нашем абстрактном классе является метод:

protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {
       
        SyndFeed feed = new SyndFeedImpl();
        buildRssDocument(model, feed, request, response);

        response.setContentType("application/xml; charset=UTF-8");

        SyndFeedOutput out = new SyndFeedOutput();
        out.output(feed, response.getWriter());
    }

Данный метод создает экземляр SyndFeed - базовый класс в ROME, используемый для создания нового канала и затем передает управление в метод buildRssDocument(), который выполнит наполнение объекта feed, конкретными данными. Естественно, что эту функцию будет выполнять уже конкретная реализация - в нашим примере - это com.webtair.articles.rssinj.view.NewsRssView, к рассмотрению которого мы и переходим. Переопределенный метод buildRssDocument как раз и предназанчен для того, чтобы сформировать из полученной модели полноценный feed

Необходимые библиотеки:

  1. spring.jar ( v.2.0.2 from $SPRING_HOME/dist/ )
  2. rome.jar ( v.0.9 from https://rome.dev.java.net/ )
  3. jdom.jar ( v.1.0 from http://www.jdom.org/dist/binary/ )
  4. commons-logging.jar ( $SPRING_HOME/dist/jakarta-commons/ )

Vyacheslav Yakovenko, Dmitry Rudenko

RSS Injection (Часть 2)





Комментарии к статье "RSS Injection (Часть 1)" (0)



Вам есть, что сказать?




  Введите код

1
Веб Приложение на ОСГИ 04-08-2008
Технология OSGi позволяет создавать модульные приложения, которое легко может конфигурироваться путем добавления,удаления или обновления модулей. В данном примеры мы рассмотрим создания простейшего веб-приложения как часть (модуль) другого приложения, основанного на OSGi
2
Spring Framework - первые шаги (Конспект десятый) 05-03-2008
Напомню задачу, с которой может столкнуться любой Java Developer: "В качестве контроллера в нашей подсистеме будет выступать ShoppingCartShowController, поднятый в контексте приложения как singleton. А в качестве модели, будет выступать компонента ShoppingCart, поднятая в контексте сессии".
3
Spring Framework 2.5.2 Released 04-03-2008
Вышел второй апдейт для Spring 2.5, он содержит исправление ошибок найденных в версии 2.5.1 и представляет целый ряд улучшений во фреймворке.
4
Spring Framework - первые шаги (Конспект девятый) 26-02-2008
Теперь давайте усложним ситуацию и представим себе, что первая компонента описана как singleton, а вторая, как prototype. Кроме этого принимаем во внимание, что «singleton» агрегирует в себе «prototype». Что будет происходить в этом случае?
5
Spring Framework - первые шаги (Конспект восьмой : Beans scope) 19-02-2008
Как я и обещал в одной из предыдущих лекций, пришло время поговорить про диапазоны видимости компонент (beans scope).
6
Spring Framework - первые шаги (Конспект седьмой) 12-02-2008
Сегодня мы постараемся разобраться в преимуществах и недостатках, как Constructor Injection (CI), так и Setter Injection (SI).
7
Spring Framework - первые шаги (Конспект шестой) 05-02-2008
Использование Constructor и Setter Injection в Spring Framework
8
Spring Framework - первые шаги (Конспект пятый) 29-01-2008
Существует несколько способов „поднятия“ application context. Для иллюстрации я остановлюсь на простейшем способе, который с успехом можно использовать при разработке юнит тестов.
9
Спрос на Spring разработчиков неуклонно растет 25-01-2008
Спрос на Spring разработчиков неуклонно растет, отмечает в своем блоге Род Джонсон.
10
Spring Framework - первые шаги (Конспект четвертый) 22-01-2008
Теперь, прежде чем перейти к экспериментам с фреймворком, нам осталось разобраться, собственно, каким образом Spring связывает компоненты между собой.
11
Январская конференция JUG Украина :: Кластеры на основе Terracotta 19-01-2008
Последнее собрание украинского JUG прошло в достаточно шикарной обстановке отеля Hyatt Regency. Лично меня презентация, привезенная Джонасом Бонером, посвященная построению кластеров на основе Open Source продукта, разрабатываемого его компанией, Terracotta, очень порадовала.
12
Spring Framework - первые шаги (Конспект третий) 14-01-2008
Прежде чем двигаться дальше и рассматривать следующие немаловажные аспекты Spring Framework, я позволю себе остановиться на мнениях относительно DI (IoC) различных авторитетных разработчиков.
13
Spring Framework – первые шаги (Конспект второй) 08-01-2008
Во время этой лекции нам предстоит разобраться с фундаментальным принципом, положенным в основу работы Spring Framework – Inversion of Control (Ioc). И надо признаться, что это не простая задача, т.к. единства мнения в целесообразности использования этого принципа нет. В начале нам предстоит понять, кто кого инвертирует и кто кого контроллирует.
14
Spring Framework – первые шаги (Конспект первый) 04-01-2008
Spring Framework – явление на Олимпе индустрии разработки программного обеспечения, достойное внимания, хотя бы потому, что Spring смог выйти за рамки Java сообщества и сделать шаг в „святая святых“ - в .Net. Используя опыт, приобретенный мною во время преподавания на тренингах по подготовке Java разработчиков, я постарюсь в цикле статей донести до читателей нашего сайта основные концепции, заложенные в Spring. Создать „конспект лекций“, который поможет Вам сделать свои первые шаги в мир J2EE с использованием Spring Framework.
15
RSS Injection (Часть 2) 31-12-2007
Ни для кого не секрет, что в последнее время RSS каналы стали не только популярным средством продвижения новостных лент, но и эффективным способом обмена информационными потоками между сайтами. В данной статье речь пойдет о том, как реализовать потребность в RSS, используя один из самых популярных фреймворков – Spring.
1
2
»


 
 
 
©2007 Lifein
Использовать материалы www.lifein.com.ua можно, лишь для Интернет-изданий установив гиперссылку на www.lifein.com.ua. Иначе, нарушители будут привлечены к ответственности, согласно Закона Украины "Про авторське право і суміжні права" от 23 декабря 1993 года № 3792-ХІІ статьи 50-53.