O que difere é que invés da navegação de páginas, nós teremos nosso CRUD em uma única página, em p:dialog, e nossos avisos de sucesso ou falha se darão através do p:growl(justamente o mesmo utilizado para informar os campos obrigatórios) não haverá necessidade de em caso de falha, enviar o usuário para uma página de erro, acredito que mostrar um aviso no p:growl seja mais que suficiente e mais agradável!
Então, o projeto é o mesmo que o do link acima, só criei um novo bean(CategoriaDialogBean.java) para não alterar o atual, e uma página (dialog.jsp) para mostrar esse exemplo, lembrando que para esse exemplo não será necessário nenhuma navegação no faces-config.xml.
Explicando o que vai acontecer nesse CRUD:
Inserir Categoria: A partir da imagem acima no canto superior esquerdo existe um p:commandButton chamado "Nova", ao clicar nele, o mesmo abrirá um p:dialog assim como "Alterar Categoria" que aparece no fundo do modal do p:dialog "Remover Categoria".
Alterar Categoria: O p:dialog do "Alterar Categoria" é chamado ao clicar em uma linha da p:dataTable.
Remover Categoria: O p:dialog do "Remover Categoria" é chamado pelo p:commandButton "Remover" presente no p:dialog do "Alterar Categoria"
Quanto o envio de respostas do bean, este é feito através do javax.faces.context.FacesContext e do javax.faces.application.FacesMessage. Como isso funciona? Muito simples, no próprio método eu verifico a reposta do meu DAO, que pode ser sucesso ou falha... caso seja sucesso eu mando para a view uma mensagem de sucesso, ou em caso de falha, uma mensagem de falha...
Acredito que a explicação do funcionamento dos p:dialog tenha ficado clara, então, segue os códigos-fonte do bean e do jsp, apenas lembrando que continua sendo necessário o mapeamento do bean no faces-config.xml.
CategoriaDialogBean.java:
public class CategoriaDialogBean { //Atributos private Categoria categoria = new Categoria(); private List<Categoria> categorias; //Métodos public void nova(){ categoria = new Categoria(); } //esses são os imports necessários para o FacesContext e FacesMessage: //import javax.faces.application.FacesMessage; //import javax.faces.context.FacesContext; //ao inserir uma categoria, é verificado o retorno da mesma //caso tenha retornado "sucesso": é retornado "Inserido com sucesso" para nossa página //e chamo o metodo nova() para limpar os campos! //caso seha "falha": é retornado: "Falha ao inserir" //quem mostrará essas mensagem será o mesmo componente do primefaces que mostra a validação dos campos //<p:growl>, assim funciona tambem para os métodos alterar e remover! //detalhe importante: dessa maneira não há necessidade de estar criando a navegação de //páginas no faces-config.xml, perceba que os métodos não tem retorno! public void inserir(){ Categoria_DAO dao = new Categoria_DAO(); String retorno = dao.inserir(categoria); FacesContext mensagem = FacesContext.getCurrentInstance(); if(retorno.equals("sucesso")){ mensagem.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Inserido com sucesso", null)); this.nova(); } else { mensagem.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao inserir", null)); } } public void selecionar(int codigo){ Categoria_DAO dao = new Categoria_DAO(); categoria = dao.selecionar(codigo); } public void alterar(){ Categoria_DAO dao = new Categoria_DAO(); String retorno = dao.alterar(categoria); FacesContext mensagem = FacesContext.getCurrentInstance(); if(retorno.equals("sucesso")){ mensagem.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Alterado com sucesso", null)); } else { mensagem.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao alterar", null)); } } public void remover(){ Categoria_DAO dao = new Categoria_DAO(); String retorno = dao.remover(categoria.getCodigo()); FacesContext mensagem = FacesContext.getCurrentInstance(); if(retorno.equals("sucesso")){ mensagem.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Removido com sucesso", null)); this.nova(); } else { mensagem.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao remover", null)); } } //Getters e Setters public Categoria getCategoria() { return categoria; } public void setCategoria(Categoria categoria) { this.categoria = categoria; } public List<Categoria> getCategorias() { Categoria_DAO dao = new Categoria_DAO(); categorias = dao.listar(); return categorias; } public void setCategorias(List<Categoria> categorias) { this.categorias = categorias; } }
Mapeamento do bean no faces-config.xml:
<managed-bean> <managed-bean-name>categoriaDialogBean</managed-bean-name> <managed-bean-class>control.CategoriaDialogBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>
dialog.jsp:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ taglib uri="http://primefaces.prime.com.tr/ui" prefix="p"%> <html> <f:view> <head> <title>Categorias</title> <p:resources /> </head> <body> <p:growl id="aviso" /> <h:form id="formCategorias"> <p:commandButton value="Nova" actionListener="#{categoriaDialogBean.nova}" oncomplete="inserir.show()" update="formInserir" /> <p:dataTable value="#{categoriaDialogBean.categorias}" var="c" paginator="true" rows="5" emptyMessage="Categorias não encontradas!" selectionMode="single" selection="#{categoriaDialogBean.categoria}" update="formAlterar" onselectComplete="alterar.show()"> <p:column> <f:facet name="header"> <h:outputText value="Codigo" /> </f:facet> <h:outputText value="#{c.codigo}" /> </p:column> <p:column filterBy="#{c.nome}"> <f:facet name="header"> <h:outputText value="Nome" /> </f:facet> <h:outputText value="#{c.nome}" /> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Valor" /> </f:facet> <h:outputText value="#{c.valor}" /> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Data" /> </f:facet> <h:outputText value="#{c.data}"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:outputText> </p:column> </p:dataTable> </h:form> <p:dialog widgetVar="inserir" header="Inserir Categoria" width="320" modal="true"> <h:form id="formInserir"> <h:panelGrid columns="2"> <h:outputText value="Nome" /> <h:inputText value="#{categoriaDialogBean.categoria.nome}" required="true" requiredMessage="Informe o nome" /> <h:outputText value="Valor" /> <h:inputText value="#{categoriaDialogBean.categoria.valor}" required="true" requiredMessage="Informe o valor" /> <h:outputText value="Data" /> <p:calendar value="#{categoriaDialogBean.categoria.data}" pattern="dd/MM/yyyy" locale="pt_BR" required="true" requiredMessage="Informe a data" /> <p:commandButton value="Salvar" action="#{categoriaDialogBean.inserir}" update="aviso,formInserir,formCategorias" /> <p:commandButton value="Cancelar" immediate="true" onclick="inserir.hide()" /> </h:panelGrid> </h:form> </p:dialog> <p:dialog widgetVar="alterar" header="Alterar Categoria" width="350"> <h:form id="formAlterar"> <h:panelGrid columns="2"> <h:outputText value="Nome" /> <h:inputText value="#{categoriaDialogBean.categoria.nome}" required="true" requiredMessage="Informe o nome" /> <h:outputText value="Valor" /> <h:inputText value="#{categoriaDialogBean.categoria.valor}" required="true" requiredMessage="Informe o valor" /> <h:outputText value="Data" /> <p:calendar value="#{categoriaDialogBean.categoria.data}" pattern="dd/MM/yyyy" locale="pt_BR" required="true" requiredMessage="Informe a data" /> </h:panelGrid> <p:commandButton value="Salvar" action="#{categoriaDialogBean.alterar}" update="aviso,formAlterar,formCategorias" /> <p:commandButton value="Remover" update="formRemover" oncomplete="remover.show()"/> <p:commandButton value="Cancelar" immediate="true" onclick="alterar.hide()" /> </h:form> </p:dialog> <p:dialog widgetVar="remover" header="Remover Categoria" width="400" modal="true"> <h:form id="formRemover"> <h:outputText value="Confirma a remoção: #{categoriaDialogBean.categoria.nome} ?" /> <h:panelGrid columns="2"> <p:commandButton value="Sim" action="#{categoriaDialogBean.remover}" update="aviso,formCategorias" oncomplete="alterar.hide(), remover.hide()" /> <p:commandButton value="Não" onclick="remover.hide()" /> </h:panelGrid> </h:form> </p:dialog> </body> </f:view> </html>Ah... peço desculpas pela demora da postagem, é que ando com problemas com minha internet! rsrs
Mas está aí!
=)
Olá amigo
ResponderExcluirQuando faço a ação alterar, como que ele captura o código?
Pois não estou conseguindo fazer a ação de alterar. ele faz um insert, pois o código chega no bean como 0
Primeiramente é amigA! hahaha
ResponderExcluirEsse exemplo ele não passa o código, a própria p:datatable tem a propriedade selectionMode="single" que diz que é pra selecionar apenas um objeto, e a propriedade
selection="#{categoriaDialogBean.categoria}"
que ao clicar na linha da tabela, já seta no bean qual é a categoria selecionada! Dê uma olhadinha no escopo do seu bean, se tiver como request, pode ser esse o problema..;)
Desculpe pelo AmigO, é difícil ver mulheres blogando sobre tecnologia.
ResponderExcluirSim está como request. Grato!
Olá Andii,
ResponderExcluirNeste teu código, como devo fazer para após selecionar uma linha da tabela, ocorra o direcionamento para outra pm:view ou página jsf, levando os dados da linha selecionada ?
Grato,
Vicente :)
Olá Vicente! Eu geralmente faço isso usando o escopo @SessionScoped... sei que essa não é a melhor opção...Veja se o ui:param dessa postagem pode te ajudar: http://javasemcafe.blogspot.com/2011/03/jsf-20-utilizacao-de-facelets.html
ExcluirOlá senhorita, mas meu componente datable não possui este evento/atributo :onselectComplete="alterar.show()"
ResponderExcluirEstou usando primefaces 3.0 , será que deixei passar algum detalhe ??
Muito Obrigado !!!!
Olá Alex!
ExcluirO problema é que muitaa coisa mudou no primefaces da versão 1.1 (usado nesta postagem) até a versão 3.0.
Na versão 3.0, a forma que eu encontrei de alterar os dados é colocando um commandButton em uma coluna, mas dá uma olhada neste exemplo: http://www.primefaces.org/showcase/ui/datatableRowSelectionInstant.jsf espero que te ajude.