Java / Статьи / Главная страница
31-12-2007

RSS Injection (Часть 2)

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

protected void buildRssDocument(Map model, SyndFeed feed,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
       
        feed.setFeedType( "rss_2.0" );

        feed.setTitle("News Feed");
        feed.setLink("http://localhost:8080/rssinj/newsrss.rss");
        feed.setDescription("All today's news feed");

        List<SyndEntry> entries = new ArrayList<SyndEntry>();
        SyndEntry entry;
        SyndContent description;
       
        Map modelMap = (Map)model.get(Constants.MODEL);
        if (modelMap != null) {
            List<NewsBean> newsList =
                (List<NewsBean>) modelMap.get(Constants.MODEL_NEWS_LIST);

            if (newsList != null) {
                for (NewsBean news : newsList) {
                    if (news != null) {
                        entry = new SyndEntryImpl();
                        entry.setTitle(news.getTitle());
                        entry.setLink(news.getLink());
                        entry.setPublishedDate(
                                DATE_PARSER.parse(news.getPublishedDate()));
                        description = new SyndContentImpl();
                        description.setType("text/html");
                        description.setValue(news.getDescription());
                        entry.setDescription(description);
                        entries.add(entry);
                    } else {
                        logger.info("news is null in the model");
                    }
                }// for
            } else {
                logger.info(Constants.MODEL_NEWS_LIST
                        + " not found in the model");
            }//if/else
        } else {
            logger.info(Constants.MODEL + "is null");
        }//if/else
        feed.setEntries(entries);
    }

Для завершения задачи нам осталось только разработать контроллер, который выполнит обращение к репозиторию и передаст сформированную модель (Model) в представление (View). За основу мы возьмем org.springframework.web.servlet.mvc.AbstractCommandController и создадим наш com.webtair.articles.rssinj.mvc.NewsRssController, метод handle которого необходимо переопределить:

protected ModelAndView handle(HttpServletRequest req,
            HttpServletResponse res, Object command, BindException error)
            throws Exception {
       
        Map<String, Object> model = new HashMap<String, Object>();

        List<NewsBean> newsList = newsDao.getNewsList();
        model.put(Constants.MODEL_NEWS_LIST, newsList);

        NewsRssView view = new NewsRssView();
        return new ModelAndView(view, Constants.MODEL, model);
    }

В нашей реализации метод получает список новостей (newsList), вкладывает его в модель (model) и передает во вновь созданный экземляр NewsRssView.

Теперь осталось только собрать и развернуть проект в servlet-контейнер. Предполагая, что имя проекта будет называться rssinj, запускаем браузер: http://localhost:8080/rssinj/newsrss.rss

Article: rss injection (ROME, Spring)

и наблюдаем корректно сформированный RSS.

На последок:

В качестве дополнительных "изысков" можно добавить в контроллер обработку ожидаемого типа потока (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), передать его через модель в наше представление (NewsRssView) и выставить соответствующий feedType:

feed.setFeedType( feedType );

что позовлит предоставить пользователям выбор между синдикат-каналами.

Ссылки

  1. The Spring Framework - Reference Documentation v2.0.2;
  2. ROME is an set of open source Java tools for parsing, generating and publishing RSS and Atom feeds;
  3. jDom;
  4. Исходные коды проекта: rssinj.zip [~12Kb]

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

  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 (Часть 1)


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

Знаток

05-02-2008 18-03 Интересно! А сколько вы платите Гуглу за размещение вашей статьи в первых рядах?


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




  Введите код