Em um artigo anterior sobre o Mashups4JSF (consulte Recursos), aprendemos o que é o Mashups4JSF, como configurá-lo e como usá-lo para criar um aplicativo de mashup útil. Aprendemos também a usar a biblioteca com o Apache MyFaces 2.0 e o IBM JWL (JavaServer Faces Widget Library) no WebSphere Application Server V7.0.
Um dos casos de uso mais comuns dos aplicativos de mashup é a capacidade de exportar os dados internos do aplicativo como feeds (RSS ou Atom). Antes do Mashups4JSF, os desenvolvedores tinham que produzir manualmente os feeds a partir dos DTOs (data transfer objects) do aplicativo. Agora, graças ao Mashups4JSF, a exportação de dados do aplicativo na forma de feeds ficou muito mais fácil.
Neste artigo, explicarei como exportar os dados de aplicativos da Web na forma de feeds RSS usando o serviço de produtor de feeds do Mashups4JSF e como consumi-los usando o componente leitor de feeds.
Explore o aplicativo de notícias
O aplicativo de notícias é um aplicativo JavaServer Faces (JSF) 2.0 que exibe uma amostra de conjunto de notícias em uma tabela de dados, como mostra a Figura 1, e nós queremos exportar essa amostra de conjunto de notícias na forma de feeds RSS.
Figura 1. A amostra de notícias
O código por trás da página de notícias é muito simples. A Listagem 1 mostra o código XHTML da dataTable de notícias na página.
Listagem 1. A dataTable de notícias na página news.xhtml
<h:dataTable id="newsTable" value="#{newsList.news}" var="varnews"
styleClass="standardTable" headerClass="standardTable_Header"
footerClass="standardTable_Footer"
rowClasses="standardTable_Row1, standardTable_Row2"
columnClasses="standardTable_Column">
<h:column id="titleColumn">
<f:facet name="header">
<h:outputText value="#{messages.application_label_title}"
id="titleText">
</h:outputText>
</f:facet>
<h:outputLink value="#{varnews.link}">
<h:outputText id="title" value="#{varnews.title}">
</h:outputText>
</h:outputLink>
</h:column>
<h:column id="authorColumn">
<f:facet name="header">
<h:outputText value="#{messages.application_label_author}"
id="authorText">
</h:outputText>
</f:facet>
<h:outputText id="author" value="#{varnews.author}">
</h:outputText>
</h:column>
<h:column id="categoryColumn">
<f:facet name="header">
<h:outputText value="#{messages.application_label_category}"
id="categoryText">
</h:outputText>
</f:facet>
<h:outputText id="category" value="#{varnews.category}">
</h:outputText>
</h:column>
<h:column id="descColumn">
<f:facet name="header">
<h:outputText value="#{messages.application_label_description}"
id="descText">
</h:outputText>
</f:facet>
<h:outputText id="desc" value="#{varnews.desc}">
</h:outputText>
</h:column>
</h:dataTable>
|
O newsTable está ligado ao DTO NewsList por meio da expressão #{newsList.news}. A listagem 2 mostra o código do DTO NewsList .
Tem uma lista estática de objetos de notícias. Pode conter dados reais de um banco de dados, mas por uma questão de simplicidade, usa-se uma lista estática.
Listagem 2. O DTO NewsList
@ManagedBean
public class NewsList {
static List <News> news = new ArrayList<News>();
// Sample news list
static {
for (int i = 0; i < 10; ++i) {
news.add(new News(
"Title" + i,
"Description" + i,
"http://www.google.com/search?q=" + i,
"Category" + i,
"Author" + i));
}
}
public List<News> getNews() {
return news;
}
}
|
A classe News é um bean muito simples. Contém apenas os seguintes atributos:
- Title
- Description
- Link
- Category
- Author
Consulte a Listagem 3.
Listagem 3. O DTO News
public class News {
private String title;
private String desc;
private String link;
private String category;
private String author;
...
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
|
Agora, vamos observar como exportar os dados de NewsList como um feed RSS.
Exporte os dados do aplicativo como um feed RSS
Antes de especificar os detalhes da exportação da lista de notícias como um feed RSS, talvez seja necessário lembrar como configurar a biblioteca Mashups4JSF com os aplicativos JSF 2.0, conforme descrito no artigo anterior sobre o Mashups4JSF (consulte Recursos). Ao usar o servlet de feeds do Mashups4JSF, certifique-se de fazer o download da captura instantânea estável mais recente do Mashups4JSF 0.0.3 (consulte Recursos).
Para exportar os dados da NewsList como um feed RSS usando o Mashups4JSF, realizaremos as seguintes etapas em nosso aplicativo JSF.
Registrar o servlet de feeds do Mashups4JSF
Registrar o MashupFeedServlet do Mashups4JSF no web.xml do seu aplicativo, como mostra a listagem 4.
Listagem 4. Registrando o servlet de feeds do Mashups4JSF
<servlet> <servlet-name>mashupFeedServlet</servlet-name> <servlet-class>com.googlecode.mashups.servlets.MashupFeedServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>mashupFeedServlet</servlet-name> <url-pattern>/mashupFeedServlet</url-pattern> </servlet-mapping> |
Anote a classe de feed (classe NewsList ) com @Feed e especifique o título, a descrição, o link e os itens do feed usando @FeedTitle,
@FeedDescription,
@FeedLink e @FeedItems. A Listagem 5
mostra a classe NewsList depois que as anotações foram aplicadas.
Listagem 5. A classe NewsList depois da aplicação das anotações
@ManagedBean
@Feed
public class NewsList {
static List <News> news = new ArrayList<News>();
// Sample news list
static {
for (int i = 0; i < 10; ++i) {
news.add(new News(
"Title" + i,
"Description" + i,
"http://www.google.com/search?q=" + i,
"Category" + i,
"Author" + i));
}
}
@FeedItems
public List<News> getNews() {
return news;
}
@FeedTitle
public String getTitle() {
return TITLE;
}
@FeedDescription
public String getDescription() {
return DESCRIPTION;
}
@FeedLink
public String getLink() {
return LINK;
}
private final String TITLE = "News List";
private final String DESCRIPTION = "News List Description";
private final String LINK = "http://somenewschannel.com";
}
|
Anote a classe de item de feed (classe News ) com @ItemFeed e especifique o título, a descrição, o link, a categoria e o autor do item de feed usando @ItemTitle,
@ItemDescription,
@ItemLink,
@ItemCategorye @ItemAuthor. A Listagem 6
mostra a classe News depois que as anotações foram aplicadas.
Listagem 6. A classe News depois da aplicação das anotações
@FeedItem
public class News {
private String title;
private String desc;
private String link;
private String category;
private String author;
...
@ItemTitle
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@ItemDescription
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@ItemLink
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
@ItemCategory
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
@ItemAuthor
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
|
Depois de anotar o feed e as classes de item de feed, o processo está quase concluído. Só falta renderizar o feed passando a classe como um parâmetro para o servlet de feeds e especificar rss como saída, como mostra a Listagem 7.
Listagem 7. Renderizando o feed RSS ao passar a classe como um parâmetro para o servlet de feeds
#{request.contextPath}/mashupFeedServlet?feedClass=dto.NewsList&output=rss
|
A Figura 2 mostra o feed NewsList depois da exportação como um feed RSS.
Figura 2. O feed RSS NewsList
Se deseja exportar NewsList como um feed Atom, é possível fazer isso especificando history como uma saída para o servlet de feeds.
Utilize o feed RSS usando o leitor de feed
Quando acrescentado às exportações de feeds RSS e ATOM, o Mashups4JSF também permite utilizar qualquer tipo de feed RSS, ATOM ou JSON dentro do aplicativo JSF. Portanto, vamos ver como consumir o feed RSS que acabamos de produzir para os dados de NewsList usando o componente rssFeedReader .
A Listagem 8 mostra como utilizar o feed RSS usando o componente rssFeedReader na página consumer.xhtml.
Listagem 8. O componente rssFeedReader na página consumer.xhtml
<mashup:rssFeedReader
feedURL="http://#{facesContext.externalContext.request.remoteHost}:
#{facesContext.externalContext.request.localPort}
#{facesContext.externalContext.request.contextPath}
/mashupFeedServlet?feedClass=dto.NewsList&output=rss"
maximumCount="5"
channelVar="channel"
itemVar="item"
itemIndex="itemIndex">
<f:facet name="channel">
<h4>#{messages.application_channel_desc}#{channel.description}</h4>
</f:facet>
<f:facet name="item">
<b>#{messages.application_item_index} </b>#{itemIndex}<br />
<b>#{messages.application_item_title} </b>#{item.title}<br />
<b>#{messages.application_item_link} </b>
<h:outputLink value="#{item.link}">
#{item.link}
</h:outputLink><br />
<b>#{messages.application_item_author} </b>#{item.author}<br />
<b>#{messages.application_item_category} </b>
#{item.categories[0].name}<br /><br />
</f:facet>
</mashup:rssFeedReader>
|
Como mostra a Listagem 8, foi especificado:
- a URL do feed RSS,
- a variável de canal usada para acessar as informações do canal de RSS (
description, por exemplo), - a variável de item que acessará todos os itens de feed RSS (
title,linkeauthor, por exemplo) e - o índice do item.
Em relação ao canal, é possível especificar os atributos que desejamos exibir no canal de RSS e, quanto ao item, os atributos que desejamos exibir em cada item de feed.
A Figura 3 mostra a saída do rssFeedReader para o feed RSS NewsList.
Figura 3. A saída do rssFeedReader para o feed RSS NewsList
Como complemento para os diversos componentes e serviços de mashup, o Mashups4JSF abstraiu as formas de exportar e importar feeds de mashup para aplicativos JSF. Antes do Mashups4JSF, os desenvolvedores tinham que criar feeds a partir dos DTOs (data transfer objects) de um aplicativo. Agora, graças ao Mashups4JSF, a exportação de dados de aplicativo na forma de feeds ficou mais fácil. Neste artigo, aprendemos a representar os dados do aplicativo JSF como feeds RSS usando o servlet de feeds Mashups4JSF. Também aprendemos a utilizar o feed produzido usando o componente rssFeedReader.
Aprender
- Uma introdução a Mashups4JSF: Mashups de maneira fácil (Hazem Saleh,
developerWorks, julho de 2010): aprenda sobre a arquitetura do Mashups4JSF e a configuração da biblioteca. Crie um aplicativo de mashup com poucas linhas de código usando o Mashups4JSF e a IBM JWL (JSF Widget Library) no WebSphere Application Server 7.0.
-
Página inicial do projeto Apache MyFaces: saiba mais sobre esse projeto da Apache Software Foundation.
-
Página inicial do Mashups4JSF: acesse a biblioteca que permite criar mashups na área de Java™
e aplicativos JSF com facilidade.
-
Mashups and JavaServer™
Faces Integration Library: confira as demos do Mashups4JSF.
- Eventos interessantes: confira futuras conferências, exposições e webcasts interessantes para desenvolvedores de software livre IBM.
- Zona de software livre do developerWorks: você encontra muitas informações sobre instruções, ferramentas e atualizações de projetos para ajudá-lo a desenvolver com tecnologias de software livre e usá-las com produtos da IBM.
- DeveloperWorks no Twitter: siga-nos.
Obter produtos e tecnologias
- Captura instantânea estável mais recente do Mashups4JSF 0.0.3
- Versão de teste do software IBM: inove o seu próximo projeto de desenvolvimento de software livre usando software para teste, disponível para download ou em DVD.
Discutir
- comunidade do developerWorks: Conecte-se a outros usuários do developerWorks enquanto explora os blogs, fóruns, grupos e wikis voltados para desenvolvedores. Ajude a desenvolver o grupo Software livre
do mundo real na comunidade do developerWorks.

Hazem Saleh tem seis anos de experiência em tecnologias JEE e de código aberto. Ele é comprometido com o Apache MyFaces e o iniciador de muitos componentes nos projetos do MyFaces, como o Tomahawk CAPTCHA, Commons ExportActionListener, Media, PasswordStrength e outros. Ele é o fundador do GMaps4JSF (um projeto de integração do Google Maps com o JavaServer Faces) e Mashups4JSF (um projeto de integração de serviços de mashup com o JavaServer Faces). Ele é o autor do livro "The Definitive Guide to Apache MyFaces and Facelets (Apress)" e muitos artigos sobre JSF, um autor contribuidor do developerworks e um palestrante público sobre JSF. Ele agora trabalha para a IBM Egito como engenheiro contratado. Hazem é reconhecido como Especialista no assunto em tecnologias web 2.0.