Back-End

2 mar, 2011

Utilizando o atributo Rendered JSF

Publicidade

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!