Back-End

29 mar, 2012

Usando Rendered JSF

Publicidade

Sempre tive dúvidas sobre como ter em um único form do JSF, com duas ou mais opções com base em uma condicao XYZ, algo como: o botão de alterar e/ou de cadastrar só vão aparecer com base na requisição  do usuário/ cliente. Há varias formas de fazer isso. Mas, em um belo dia, eu estava navegando na documentação do JSF e de repente vejo algo interessante sobre o assunto e resolvi testar. Bem, deu certo.

Então, hoje vou mostrar como não ter dois formulários cadastrar.jsp e alterar.jsp. Será tudo em um único formulário (formulario.jsp) e com base no que for solicitado, ele terá um botão cadastrar ou alterar visível para o usuário.

Primeiro, gostaria de deixar claro que vou tratar apenas de JSF neste artigo, então, configuração de conexão com banco de dados e outros tópicos relacionados não farão parte. Vou levar em consideração que você tem sua app rodando e quer usar este recurso. Aqui temos o Hibernate como nosso frameworks de persistência.

A seguir tem o projeto que criei para usar como teste:

A seguir temos o meu face-config.xml:

Desenvolvimento

Passo 01

Alterar as classes de persistência é o primeiro ponto. Então, adicione o método responsável por alterar:

public void atualizar(TUsuario tusuario){

begin();

getSession().merge(tusuario);

try{

commit();

}catch (HibernateException e) {

rollback();

}}

O método begin() vem de uma classe generica DAO. Veja:



import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.AnnotationConfiguration;

public class DAO {

private static final ThreadLocal<Session> threadlocal = new ThreadLocal<Session>();

private static final SessionFactory sessionfactory = new AnnotationConfiguration()

.configure().buildSessionFactory();

public static Session getSession() {

Session session = (Session) threadlocal.get();

if (session == null) {

session = sessionfactory.openSession();

threadlocal.set(session);

}

return session;

}

public void begin() {

getSession().beginTransaction();

}

public void commit() {

getSession().getTransaction().commit();

}

public void rollback() {

getSession().getTransaction().rollback();

}

public void close() {

getSession().clear();

threadlocal.set(null);

}

Passo 02

Levando em conta que você vai editar o usuário a partir de uma tabela onde estão todos os usuarios, então você vai precisar inserir na classe de persistência o seguinte método:

public List listaUsuarios(){

Query query = getSession().createQuery(“from TUsuario tu order by tu.nome asc”);

List<TUsuario> lista = query.list();

return lista;

}

Passo 03

Feito isso, vá para a classe controladora, aquela de comunicação com o JSF, e insira o seguinte método:

public TUsuario getEditorDelete(){

TUsuario tus = (TUsuario) model.getRowData();

return tus;

}

Agora já sabemos qual linha será editada. Observe o que os métodos a seguir fazem:

public String editar(){

TUsuario tu = getEditorDelete();

setTusuario(tu);

return “editarus”;

}

public String editado(){

TUsuarioDAO tusdao = new TUsuarioDAO();

tusdao.atualizar(tusuario);

return “editadous”;

}

O primeiro deles é chamado quando clicamos no link editar, só então ele vai para o formulario.jsp; o segundo método editado() é chamado quando clica no botão submit para fazer a persistencia e alterar o valor daquele objeto.

Passo 04

Agora vamos alterar.jsp nossa página formulario.jsp para exibir o botão correto com base na requisição do usuário.

No seu formulário os botões submit ficam desse modo:

<input jsfc=“h:commandButton”

rendered=“#{tUsuarioControler.tusuario.nome==null}” id=“bsalvar”

type=“submit” value=“Salvar” action=“#{tUsuarioControler.salvarUS}” />

<input jsfc=“h:commandButton”

rendered=“#{tUsuarioControler.tusuario.nome!=null}” id=“balterar”

type=“submit” value=“Alterar” action=“#{tUsuarioControler.editado}” />

Conclusão

Observe que apenas adicionamos um atributo, o rendered, onde tem o teste. Caso seja null, é porque será um novo usuário, porem se for diferente é porque será alterado. Nessa condição apenas um dos botões será exibido. Vejam uns testes que fiz ao executar minha aplicação:

Vou ficando por aqui, espero que o post tenha sido útil.Preparei este post tem um tempinho já porém, só agora conseguir publicar, pois a lista é grande.