Dev (Back & Front)ARTIGO

Utilizando o atributo Rendered JSF

Olá, pessoal! Eu sempre tive dúvidas sobre como ter duas ou mais
opções com base em uma determinada condição, em um único form do JSF, algo como: o botão
alterar/cadastrar só vai aparecer com base na requisição do
usuário/cliente. Há varias formas de fazer isso. Mas, em um belo dia,
estou navegando na documentação do JSF, e do nada vejo algo interessante
sobre o assunto. Resolvi testar e funcionou perfeitamente.

Então, hoje, vou mostrar como não ter dois formulários, cadastrar.jsp e alterar.jsp.
Será 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.

Vamos começar!

Vou limitar este artigo ao JSF, então não falaremos sobre configuração de conexão com banco de dados e outros tópicos
relacionado. Vou levar em consideração que você tem sua
app rodando e quer usar esse recurso. Aqui temos o Hibernate como nosso
frameworks de persistência.

Este é o projeto que criei como teste:

A seguir temos o meu face-config.xml

Development

Vamos colocar mão na massa e fazer as devidas configurações.

Passo 1

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

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, minha. 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 2

Levando em conta que você vai editar o
usuário a partir de uma tabela que exibe todos os usuários, 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 3

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 método é chamado quando clicamos no link editar, daí ele vai para o formulario.jsp. O segundo método, editado(), é quando o botão submit é clicado para fazer a persistência e alterar o valor daquele objeto.

Passo 4

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

No seu formulário, altere os botões submit deixando deste 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, que é o rendered. Caso o teste seja null,é porque será um novo usuário; se for diferente, é porque será
alterado, nessa condição apenas um dos botões serão exibidos. Vejam uns
testes que fiz, ao executar minha aplicação:

Fico por aqui e espero que o artigo tenha sido útil! Até o próximo!

é Bacharel em Sistemas de Informação e Especialista em Gestão e Estratégia de Negócios. Trabalha com TI desde 2003 e possui as certificações SCJP 5 e SCM. Trabalhou na IBM Brasil como Analista Programador Java, passou pelo laboratório da Enterprise Computing Lab (ECL) HP como Software Engineer, Ci&amp;T como Engenheiro de Software em projeto JEE. Tem experiência internacional em Índia, Dubai e Londres. Atualmente é cofundador da ITSLabs (www.itslabs.com.br), uma start-up focada na criação de produtos web e mobile para start-ups. Também é autor dos livros "Guia do Exame SCJP", "Guia Prático JEE com Frameworks" e "TDD na prática".

Ver perfil