Seam - Getting started: Converters!

Java, Java EE, Java Server Faces, Jboss Seam No Comments »

Na série de vídeo-aulas que eu fiz para o portal DevMedia sobre o Seam Framework, eu mostrei como podem ser usadas as anotações para registro de Conversores JSF. A notação é bastante simples. Imagine que você tenha um cadastro de produtos.

Veja o código do conversor:


@Name("productConverter")
@BypassInterceptors
@Converter(forClass=Product.class)
public class ProductConverter implements javax.faces.convert.Converter{

public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
// Insira o código que transforme a string no objeto desejado (Product)
}

public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
// Insira o código que transforme o objeto desejado (Product)    em String
}

}

Para registrar um conversor temos que usar as anotações:
@Name - Registra o conversor como um componente Seam
@BypassInterceptors - Indica que o conversor não deve sofrer ação dos intercetadores SEAM.
@Converter - Registra o conversor no contexto JSF, o atributo forClass indica a classe que iremos converter.

Também poderíamos cria o conversor usando um identificador, porém eu fiz alguns testes e para determinados comportamentos são gerados erros relacionados ao controle de estado. Se você também teve estas experiências, compartilhe-as!

Jboss Seam - Getting started: Navigation Cases!

Java, Java EE, Java Server Faces, Jboss Seam No Comments »

No post Jboss Seam - Getting started: Page Actions, eu havia mostrado um caso simples de listagem e edição de notícias. Mas há casos exigem a criação casos de navegação para que não haja erros na execução.

Voltando ao exemplo de cadastro de notícias, o que aconteceria se o usuário por engano digitar um código que não existe na URL: /news/EditNews.jsf?newsId=9? Bom a página de edição apareceria com o formulário em branco ou geraria uma exceção.

A solução para este caso seria, caso o método gere um OUTCOME de erro, redireciona para a página de edição. Veja o exemplo:


<?xml version="1.0" encoding="UTF-8"?>
<pages xmlns="http://jboss.com/products/seam/pages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.com/products/seam/pages
http://jboss.com/products/seam/pages-2.0.xsd">

<page view-id="/news/EditNews.xhtml">
<param name="newsId" value="#{newsBean.news.newsId}"/>
<action execute="#{newsBean.loadNewsById(newsBean.news.newsId)}"/>

<rule if-outcome="error">
<redirect view-id="/news/list.xhtml"/>
</rule>
</page>
</pages>

Assim, caso o identificador for nulo ou inválido a action loadNewsById retornará o outcome error. Assim, a execução será redirecionada a página lista.xhtml evitando que erros sejam gerados e evitando quebra de dados no formulário. Simples não?

Jboss Seam - Getting started: Page Actions!

Java, Java Server Faces, Jboss Seam 2 Comments »

Um dos grandes problemas que os desenvolvedores JSF tem é lidar basicamente com 2 situações relacionadas com GET: Passar parâmetros e executar ações via GET. Vou dar dois exemplos clássicos:
1° - Você tem um sistema de cadastro de notícias. Dentro deste sistema você tem uma página que faz a listagem das notícias cadastradas. Para listar estas notícias cadastradas assim que carregasse a página você tinha duas saídas: uma seria fazer o controle no método get de seu datatable:
- No Managed Bean


private List<News> newsList;
...
public List<News> getNewList() {
if (newsList == null) {
newsList = myService.listNews();
}
return newsList;
}

Na página seria algo:


<h:dataTable value="#{newBean.newsList}">
<!-- colunas da tabela -->
</h:dataTable>

A outra forma você teria que criar a ação de listagem e para acessar a página você teria que chamar a página de um componente jsf: um menu ou um botão que fizesse uma requisição post invocando a ação.

Usando o recurso de Page Actions do Jboss Seam você não precisa mais usar estas “soluções alternativas” para executar ações e passar parâmetros para um Managed Bean via GET. Dentro de seu projeto o Seam irá reconhecer todos arquivos xml que sigam o padrão: *.page.xml ou o arquivo pages.xml dentro da pasta WEB-INF. Veja um exemplo do arquivo:


<?xml version="1.0" encoding="UTF-8"?>
<pages xmlns="http://jboss.com/products/seam/pages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.com/products/seam/pages
http://jboss.com/products/seam/pages-2.0.xsd">
<page view-id="/news/list.xhtml"
action="#{newsBean.listNews}"
conversation-required="false"/>

<page view-id="/news/EditNews.xhtml">
<param name="newsId" value="#{newsBean.news.newsId}"/>
<action execute="#{newsBean.loadNewsById(newsBean.news.newsId)}"
if="#{newsBean.news.newsId != null}"/>
</page>
</pages>

O código acima chama a ação JSF listNews antes de renderizar a página /news/list.jsf, que pode ser chamada via GET ou POST. O mesmo acontece para a edição de notícias /news/EditNews.jsf?newsId=9. Primeiro será vinculado o valor do parâmetro newsId com propriedade newsBean.news.newsId e após será chamada a ação loadNewsById que carrega a notícia recebendo como parâmetro o identificador da notícia.

Sem dúvida nenhuma o recurso de Page Actions é bem legal para se trabalhar com JSF. Vale a pena usar! Em breve mostrarei mais dicas de Page Actions!

WP Theme & Icons by N.Design Studio
Assine Assine os comentarios