Botão Limpar + JSF2+PrimeFaces

Java

02/05/2011

Bom dia. Estou iniciando com JSF2.0 + Hibernate+ PrimeFaces3. Peguei uns exemplo na internet e fui modificando conforme necessidade. Fazendo na verdade um modelo padrão de CRUD. A única funcionalidade que não está legal é algo que pode ser simples, porém, para leigo, está complicado.   PROBLEMA: A Primeira vez que entra no formulario o Botao limpa funciona normalmente, porém, quando grava um registro e depois eu clico em Limpar não executa nenhuma ação.   Obrigado     LivroControlle.java     package Controller; import Dao.LivroDao;
import Dao.LivroDaoImp;
import Model.Livro;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel; @ManagedBean
@SessionScoped
public class LivroController {     private Livro livro;
    private DataModel listaLivros;     public DataModel getListarLivros() {
        List<Livro> lista = new LivroDaoImp().list();
        listaLivros = new ListDataModel(lista);
        return listaLivros;
    }     public Livro getLivro() {
        return livro;
    }     public void setLivro(Livro livro) {
        this.livro = livro;
    }     public String prepararAdicionarLivro(){
        livro = new Livro();
        return "gerenciarLivro";
    }     public String prepararAlterarLivro(){
        livro = (Livro)(listaLivros.getRowData());
        return "gerenciarLivro";
    }     public String excluirLivro(){         Livro livroTemp = (Livro)(listaLivros.getRowData());
        LivroDao dao = new LivroDaoImp();
        dao.remove(livroTemp);
        return "gerenciarLivro";     }     public String adicionarLivro(){         LivroDao dao = new LivroDaoImp();
        dao.save(livro);
        return "gerenciarLivro";
       
    }     public String alterarLivro(){         LivroDao dao = new LivroDaoImp();
        dao.update(livro);
        return "gerenciarLivro";     }   
}     gerenciarLivro.xhtml   <?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <link href="css/theme.css" rel="stylesheet" type="text/css" />     </h:head>
    <h:body>       
        <h:form id="form">
            <p:panel header="Cadastro de Livros">
                <h:messages errorClass="error"/>
                <h:panelGrid columns="2" id="painel">                     <h:outputText value="Titulo: *" />
                    <p:inputText required="true" requiredMessage="Campo [Título] Obrigatório" value="#{livroController.livro.titulo}"/>                     <h:outputText value="Autor: " />
                    <p:inputText  value="#{livroController.livro.autor}"/>                     <h:outputText value="Páginas: " />
                    <p:inputText  value="#{livroController.livro.paginas}"/>                     <h:outputText value="Editora: " />
                    <p:inputText  value="#{livroController.livro.editora}"/>                     <h:outputText value="ISBN: " />
                    <p:inputText  value="#{livroController.livro.isbn}"/>                     <h:outputText value="Avaliação: " />
                    <h:selectOneMenu value="#{livroController.livro.avaliacao}">
                        <f:selectItem itemLabel="1" itemValue="1"/>
                        <f:selectItem itemLabel="2" itemValue="2"/>
                        <f:selectItem itemLabel="3" itemValue="3"/>
                        <f:selectItem itemLabel="4" itemValue="4"/>
                        <f:selectItem itemLabel="5" itemValue="5"/>
                    </h:selectOneMenu>
                </h:panelGrid>
                <p:commandButton value="Gravar"  actionListener="#{livroController.adicionarLivro}" ajax="false" />
                <p:commandButton value="Alterar" actionListener="#{livroController.alterarLivro}"   ajax="false" />
                <p:commandButton value="Limpar" type="reset" />
            </p:panel>
            <br/>
            <br/>
        </h:form>
        <h:form>
            <p:outputPanel id="livro">
                <p:dataTable value="#{livroController.listarLivros}" var="livro">                     <p:column>
                        <f:facet name="header">
                            <h:outputText value="Título" />
                        </f:facet>
                        <h:outputText value="#{livro.titulo}" />
                    </p:column>                     <p:column>
                        <f:facet name="header">
                            <h:outputText value="Autor" />
                        </f:facet>
                        <h:outputText value="#{livro.autor}" />
                    </p:column>                     <p:column>
                        <f:facet name="header">
                            <h:outputText value="Operações" />
                        </f:facet>               
                        <h:commandButton action="#{livroController.prepararAlterarLivro}" value="Selecionar"/>
                        <h:commandButton action="#{livroController.excluirLivro}"         value="Excluir"/>
                    </p:column>
                </p:dataTable>
            </p:outputPanel>
        </h:form>     </h:body>
</html>
Renato Vieira

Renato Vieira

Curtidas 0

Respostas

Anthony Accioly

Anthony Accioly

02/05/2011

Um forma que eu posso pensar (para os campos virem preenchidos inicialmente na tela de alterar, porém o reset funcionar) é fazer o botão reset chamar um método do controller que reseta todos os campos menos o Id. Algo mais ou menos assim:
public String limpar() {    // cria um livro novo sem nada preenchido    Livro livroParaUpdate = new Livro();    // se havia um id na sessão, copia para o novo livro    // assim deve funcionar tanto para adicao quanto update    if (getLivro() != null) {       livroParaUpdate.setId(getLivro().getId());    }   // substitui o livro antigo na sessão com tudo preenchido pelo livro novo em branco    setLivro(livroParaUpdate);
    return "gerenciarLivro";}

Eis um post jurássico (2006) com alguém tendo que lidar com o mesmo problema: http://www.coderanch.com/t/212303/JSF/java/Reset-button
E outro em português de (2007): http://www.guj.com.br/java/67798-limpar-dados-do-formulario-com-o-jsf
O problema aqui é que o botão de reset (HTML) não limpa a form de fato, ele apenas reseta o formulário para o status inicial, antes do usuário digitar alguma coisa. Como seus dados já vem preenchidos, ele está retornando ao status anterior preenchido. Pode fazer um teste: troque um campo qualquer e clique em reset que o botão voltará para o status de preenchimento anterior.
Abraços,

GOSTEI 0
Renato Vieira

Renato Vieira

02/05/2011

Boa Tarde Anthony Accioly. Obrigado pelo Retorno. Funcionou certinho.

Tens algum link com material complementar de CRUD em JSF2.0+Hibernate e PrimeFaces?
Atualmente utilizo JavaBeans+JSP+JavaSCript etcc mais ou menos assim:

Página JSP:



.....


Ou Seja, um monte de código JAVA dentro do JSP. Funciona perfeitamente todas as telas, porém, é muito lixo. Queria aos poucos convertendo as telas. Estou com algumas dificuldades pois nao estou acostumado com Framework. Podes auxiliar ? Depois que funcionar a primeira tela e eu entender certinho, o restante é baba.

Abraços

Renato
GOSTEI 0
Anthony Accioly

Anthony Accioly

02/05/2011

Olá Renato,
Eu não tenho experiência com o PrimeFaces, mas acredito que a maioria das suas dificuldades tenham a ver com JSF puro e o Pattern MVC.O padrão "correto" para o que você está procurando fazer é realmente sumir com todos os Scriptlets.
Esse código todo deveria estar contido nos Controllers / camada de negócios. 
A view deve ser algo meio burro, no máximo com alguma lógica basicona do tipo "rendered=expressão EL".

Bom, eu estudei um JSF jurássico sem Facelets. Na época, gostei muito do livro JSF In Action: http://www.manning.com/mann/. Mas muita coisa mudou com o Facelets + JSF 2 + Java EE 6.
Fora isso, gosto bastante do tutorial oficial da Sun (erm.. Oracle): http://download.oracle.com/javaee/6/tutorial/doc/bnadp.htmlNa parte mais aplicada, gosto muito dos tutoriais do Netbeans: http://netbeans.org/kb/trails/java-ee.html (mesmo que você use outro IDE, vale a pena).
Abraços,
GOSTEI 0
POSTAR