Utilizando AJAX com Java Server Faces (JSF)

Veja neste artigo o funcionamento e benefícios do framework JavaServer Faces (JSF) com AJAX. Será tratada a ideia desta tecnologia, e também exemplos de código.

Vamos utilizar Ajax com JSF?

Inicialmente, as páginas WEBs eram desenvolvidas de maneira estática, ou seja, para uma atualização refletir ao cliente, toda a página tinha que ser carregada. Com isso, para atualizar algum pequeno conteúdo, obrigatoriamente o cliente precisava realizar uma requisição, de maneira completa, a aplicação WEB. Esse problema consiste quando se precisa atualizar repetidamente a aplicação, podendo afetar o desempenho da mesma. O Ajax veio para solucionar este tipo de problema.

Ajax é um conjunto de tecnologias para desenvolvimento WEB que permite que possam ser desenvolvidas páginas dinâmicas, que respondam a algumas situações de maneira assíncrona, sem que toda a aplicação seja atualizada. Com Ajax, as aplicações webs podem recuperar informações do servidor de maneira altamente responsiva com o cliente.

Na plataforma JAVA EE 6, o JavaServer Faces fornece acesso embutido ao Ajax, sendo preciso apenas os jars: jsf-api.jar, jsf-impl.jar, encontrados no site.

>

Visão geral do Ajax

Ajax é baseado em JavaScript e XML, tecnologias utilizadas para desenvolvimentos de aplicações WEBs dinâmicas e assíncronas.

O funcionamento da tecnologia Ajax se baseia no seguinte processo, é enviada uma solicitação assíncrona para o servidor, e este envia de volta uma resposta no modelo DOM para atualizar a página, a Figura 1 retrata a diferença da comunicação interna de aplicações WEBs utilizando Ajax com as aplicações comuns. Uma observação importante é que a comunicação cliente e servidor não se limitam apenas ao modelo DOM, ela também pode utilizar o formato JSON.


Figura 1: O modelo tradicional para aplicações web (esquerda) comparado ao modelo Ajax (direita). (www.apostilando.com, 2007)

Como visto anteriormente, aplicações web baseadas em Ajax podem acessar as informações do servidor, sem interferir com a renderização da página atual do cliente. Abaixo, algumas vantagens da utilização de Ajax:

  • Validação de formulário em tempo real, sem a necessidade de submeter ao servidor para fazer a validação.
  • Funcionalidades avançadas para páginas Web.
  • Atualização parcial da página, sem a necessidade de recarregar a página inteira.

Utilizando Ajax com JSF

A funcionalidade Ajax pode ser adicionada em uma aplicação JSF por meio da importação de suas bibliotecas, conforme a Listagem 1. Toda aplicação que fizer o seu uso estará representada pela tag <f:Ajax>, conforme a Listagem 2.

Listagem 1: Exemplo de importação das funcionalidades Ajax

<h:form id="form1"> <h:outputScript name="jsf.js" library="javax.faces" target="head"> </br>

Listagem 2: Exemplo da utilização das funcionalidades Ajax com JSF

<h:inputText id="texto" value="#{textBean.texto}"> <f:ajax> </h:inputText>

Na Listagem 2, nem um recurso Ajax foi aplicado, é apenas um exemplo de como aplicar suas funcionalidades junto com JSF, na tag <f:Ajax> quando nenhum evento é aplicado, por padrão é selecionado o evento ValueChange. O desenvolvedor pode colocar o atributo que desejar para a entrada de dados <h:inputText>. A Tabela 1, informa todos os atributos disponíveis para serem aplicados na tag <f:Ajax>.

Nome Tipo Descrição
disable javax.el.ValueExpression (resulta em boolean) Quando atribuído true a funcionalidade Ajax não é processada. Por padrão esse atributo é false.
event javax.el.ValueExpression (resulta em string) É atribuido o evento desejado para o objeto. Por padrão é valueChange.
execute javax.el.ValueExpression (resulta em object) Este atributo representa qual componente deve ser executado, sendo informado seu nome. Por padrão seu valor é @this.
immediate javax.el.ValueExpression (resulta em boolean) Um valor booleano que indica se as entradas devem ser processadas logo no início do ciclo de vida.
listener javax.el.MethodExpressin Método a ser invocado no servidor quando a ação AjaxBehaviorEvent for acionada no cliente
onevent javax.el.ValueExpression (resulta em string) O nome da função JavaScript que trata os eventos
onerror javax.el.ValueExpression (resulta em string) O nome da função JavaScript que avalia os erros
render javax.el.ValueExpression (resulta em object) Identifica qual campo deve receber o valor de algum evento executado.

Tabela 1: Exemplo de atributos para a tag f:Ajax

Alguns dos atributos apontados na Tabela 1 serão utilizados no exemplo que será criado para demonstrar a utilidade da tecnologia Ajax. O exemplo consiste em uma classe Livro com três atributos: titulo, autor e ano, conforme a Listagem 3.

Listagem 3: Classe Livro

import javax.pesrsistence.Entity; @Entity public class Livro{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer codigo; private String titulo; private String autor; private Integer ano; public Livro(){...} public Integer getCodigo(){...} public void setCodigo(Integer codigo){...} public String getTitulo(){...} public void setTitulo(String titulo){...} public String getAutor(){...} public void setAutor(String autor){...} public Integer getAno(){...} public void setAno(Integer ano){...} }

Serão criadas duas páginas, uma para cadastros dos livros, e outra para efetuar busca pelo seu código, a Listagem 4 ilustra a classe livroHandler utilizada para realizar validação de retorno, e também chamar os métodos selectlivro e insert na classe DaoLivro, conforme a Listagem 5. Para cadastrar um livro, foi criada uma página com campos <h:inputText> com seus respectivos atributos: titulo, autor e ano. Se inserido com sucesso retornará uma mensagem na tela “Livro cadastrado com sucesso”, se houver algum erro de validação será informada na tela sua descrição.

Listagem 4: Classe LivroHandler

public void inserir(AjaxBehaviorEvent event){ livro = dao.insert(livro); if(livro.getCodigo() != null){ FacesContext .getCurrentInstance .addMessage( null, new FacesMessage( "Livro cadastrado com sucesso!")); } livro = new Livro(); } public void selectLivro(AjaxBehaviorEvent event){ livro = dao.selectlivro(livro); if(livro == null){ FacesContext .getCurrentInstance .addMessage( null, new FacesMessage( "Nenhum livro com esse codigo" )); } }

Listagem 5: Classe DaoLivro

public static EntityManagerFactory criarEMF(){ if(emf == null){ emf = Persistence.createEntityManagerFactory("jpa01"); } return emf; } public Livro insert(Livro livro){ System.out.println("entrou"); em = criarEMF().createEntityManager(); em.getTransaction().begin(); em.persist(livro); em.getTransaction().commit(); em.close(); return livro; } public Livro selectlivro(Livro livro){ em = criarEMF().createEntityManager(); Livro l = em.find(Livro.class, livro.getCodigo()); em.close(); return l; }

A busca de um determinado livro será feita pelo seu código, o usuário informa seu Id e retorna na tela seus atributos no <h:outputText>. Se não houver nenhum livro com aquele Id, será mostrada uma mensagem para o usuário informando que aquele livro não existe.

Para o cadastro de um livro, foram utilizadas as seguintes funcionalidades Ajax no <h:commandButton> cadastrar livro:

  • listener="#{DAO.insert}" para chamar o método no servidor quando a ação AjaxBehaviorEvent for invocada(Listagem 4 descreve o método insert a ser invocado).
  • execute="@all" para que seja executado todos os campos <h:inputText> do form;
  • render="@all" será preciso limpar os campos e informar uma mensagem ao usuário quando o livro for cadastrado, por isso a renderização tem que ser para todos os objetos.
  • E por ultimo o atributo event=”click”, quando o botão for clicado todo o processo será invocado.

A Listagem 6 é o exemplo de código da tela de cadastro de livros:

Listagem 6: Código da tela Cadastrar Livro

<h:body> <h2><h:outputText value="Cadastro de Livro"/></h2> <h:form id="cadMovimForm"> <h:outputScript name="jsf.js" library="javax.faces" target="head"/> <br/> <h:outputText value="Titulo"/> <h:inputText id="titulo" value="#{LivroHandler.Livro.titulo}" required="true" requiredMessage="Campo título obrigatório"> <f:validateLength maximum="40"/> </h:inputText> <br/> <h:outputText value="Autor"/> <h:inputText id="valor" value="#{LivroHandler.Livro.autor}" required="true" requiredMessage="Campo autor obrigatório"/> <br/> <h:outputText value="Ano"/> <h:inputText id="data" value="#{LivroHandler.Livro.ano}" required="true" requiredMessage="Campo ano obrigatório"/> <h:commandButton id="criarLivro" value="Cadastrar"> <f:ajax listener="#{LivroHandler.inserir}" execute="@all" render="@all" event="click"/> </h:commandButton> <h:messages id="msg"/> <br/> <br/> <h:link outcome="pesquisar.xhtml" value="pesquisar"></h:link> </h:form> </h:body>

Para efetuar a busca de um livro foi usado os mesmos atributos no commandButton que o exemplo anterior, a diferença entre eles está no listener que invoca outro método (chama o método selectlivro, conforme Listagem 6), e no execute="form1:codigo",executando somente o campo <h:inputText> com o id="codigo", pois ele detém o código do livro a ser buscado. A Listagem 7 é o exemplo de código usado na tela de pesquisa.

Listagem 7: Código da Tela Buscar Livro

<h:body> <h:form id="form1"> <h:outputScript name="jsf.js" library="javax.faces" target="head"/> Código do livro <h:inputText id="codigo" value="@{LivroHandler.livro.codigo}" maxlength="10" required="true" requiredMessage="Informe o código do livro"/> <br/> <h:commandButton id="submit1" value="Clique"> <f:ajax listener="#{LivroHandler.selectLivro}" execute="form1:codigo" render="@all" event="click"/> </h:commandButton> <br/> Título: <b> <h:outputText id="titulo" value="#{LivroHandler.livro.titulo}"/> </b> Autor: <b> <h:outputText id="autor" value="#{LivroHandler.livro.autor}"/> </b> Ano <b> <h:outputText id="ano" value="#{LivroHandler.livro.ano}"/> </b> <br/> <h:messages/> <br/> <br/> <h:link outcome="cadastro.xhtml" value="voltar"></h:link> </h:form> </h:body>

O exemplo da aplicação deste artigo pode ser visto na Figura 2:


Figura 2: À esquerda a página para efetuar a busca de um livro, e a direita a página de cadastro.

Entendendo a utlização do Ajax

Como pode ser visto, utilizar Ajax é de enorme vantagem em aplicações WEB, o usuário não precisa atualizar toda a página para efetuar alguma modificação, apenas é alterado o que foi executado. Pensando em uma aplicação WEB que precisa efetuar atualização repetidamente, utilizar Ajax melhora muito o desempenho da mesma, pois é modificado o que é preciso, e permanece sem alteração o que não foi utilizado.

Links Úteis

  • Java 7:
    Site com informações sobre o lançamento do Java 7
  • JavaFX:
    Site para fazer download de aplicações JavaFX
  • JFXtras:
    Site do projeto JFXtras

Saiba mais sobre Java ;)

  • O Que é JPA?:
    Dominar a persistência de dados é uma necessidade indispensável aos programadores. Sem esse conhecimento nossas aplicações não terão a capacidade de armazenar e recuperar os dados por ela manipulados.
  • Preparando o ambiente para programar em Java:
    Neste curso você aprenderá a preparar seu ambiente para programar em Java. Veremos aqui o que é necessário instalar e como proceder para desenvolver aplicações com essa linguagem.
  • Criando meu primeiro projeto no Java:
    Neste curso você aprenderá a criar o seu primeiro programa com Java, e não, ele não será um simples “Hello, World!”. :) Para isso, vamos começar ensinando como instalar o Java e preparar o ambiente de desenvolvimento.

Artigos relacionados