Bom dia galera.
Estou com um probleminha na minha aplicação. Vou tentar resumir meu problema em um contexto bem simples.
Tenho uma view matricula.xhtml. Nesta view possuo um data table com minhas matriculas. A idéia inicial é que ao clicar em uma linha desta tabela o jsp renderize um dialog com os dados do objeto da linha que foi clicada. Consegui fazer funcionar isso, porém, não com dois clicks. Ele funcionou apenas com 1 click, o que não é interessante.
Meu outro problema é o seguinte. O usuário poderá clicar em uma linha e ver os dados daquele objeto, editando, ou simplesmente, visualizando. Como também pode cadastrar uma nova matricula apenas clicando no botao novo. O problema é que o selection do meu data table e a instancia que armazena uma nova matricula são a mesma variavel. Tentei fazer o seguinte, caso o usuário click em “novo” eu chamo um função que instanciará uma novo objeto matricula para assim poder persisti-lo no banco, porem não consigo fazer essa chamada no meu codigo. Sempre que tento cadastrar uma nova matricula retorna o erro de que o objeto não foi instanciado (nulo) e se caso antes eu tiver clicado em uma linha do datatable e depois clicado em “novo”, ele carrega os dados da linha e não instancia um novo objeto.
Já tentei resolver isso de varias formas, com remoteCommand, ajax, no proprio commandButton, mas todos sem sucesso. Gostaria da ajuda de vocês!
Obrigado.
Abaixo segue meus codigos:
Matricula.xhtml
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<ui:composition template="/_template.xhtml">
<ui:define name="corpo">
<h:form id="formulario">
<h:messages styleClass="erros" />
<h2>Matrículas</h2>
<fieldset>
<legend>Listagem</legend>
<h:form id="matricula" >
<p:remoteCommand id="novaMatricula" name="novaMatricula" action="#{matriculaBean.novo}" oncomplete="matriculaDialogo.show();" >
<f:ajax execute=":novaMatricula" />
</p:remoteCommand>
<p:dataTable id="matriculas" var="matriculas"
value="#{matriculaBean.matriculas}"
emptyMessage="Nenhuma matrícula encontrada."
selectionMode="single"
selection="#{matriculaBean.matricula}"
rowKey="#{matriculas.id}" >
<p:ajax event="rowSelect" update=":formulario"
oncomplete="matriculaDialogo.show();" />
<p:column id="nome" filterBy="#{matriculas.nome}"
headerText="Nome">
<h:outputText value="#{matriculas.nome}" />
</p:column>
<p:column id="apelido" filterBy="#{matriculas.apelido}"
headerText="Apelido">
<h:outputText value="#{matriculas.apelido}" />
</p:column>
<p:column id="cpf" filterBy="#{matriculas.cpf}" headerText="CPF">
<h:outputText value="#{matriculas.cpf}" />
</p:column>
<f:facet name="footer">
<p:commandButton id="novo" value="Novo" type="button"
onclick="novaMatricula();"
ajax="false" >
<f:ajax execute=":formulario"/>
</p:commandButton>
</f:facet>
</p:dataTable>
<p:dialog id="formularioMatricula" header="Detalhes da Matrícula"
widgetVar="matriculaDialogo" modal="true" dynamic="true" >
<fieldset>
<legend>Nova Matricula</legend>
<h:panelGrid columns="2" >
<h:outputLabel value="Nome:" />
<p:inputText value="#{matriculaBean.matricula.nome}" size="50" />
<h:outputLabel value="Apelido:" />
<p:inputText value="#{matriculaBean.matricula.apelido}" />
<h:outputLabel value="Email:" />
<p:inputText value="#{matriculaBean.matricula.email}" />
</h:panelGrid>
<h:panelGrid columns="4">
<h:outputLabel value="Telefone 1:" />
<p:inputMask mask="([telefone removido]"
value="#{matriculaBean.matricula.telefone1}" />
<h:outputLabel value="Telefone 2:" />
<p:inputMask mask="([telefone removido]"
value="#{matriculaBean.matricula.telefone2}" />
<h:outputLabel value="Celular 1:" />
<p:inputMask mask="([telefone removido]"
value="#{matriculaBean.matricula.celular1}" />
<h:outputLabel value="Celular 2:" />
<p:inputMask mask="([telefone removido]"
value="#{matriculaBean.matricula.celular2}" />
<h:outputLabel value="C.P.F:" />
<p:inputMask mask="[CPF removido]"
value="#{matriculaBean.matricula.cpf}" />
</h:panelGrid>
<h:panelGrid columns="5">
<h:outputLabel value="Identidade:" />
<p:inputText value="#{matriculaBean.matricula.identidade}" />
<h:outputLabel value="Orgão Expeditor:" />
<p:inputText value="#{matriculaBean.matricula.orgaoExpeditor}" />
</h:panelGrid>
<h:panelGrid columns="2">
<h:outputLabel value="Data Expedição:" />
<p:calendar value="#{matriculaBean.matricula.dataExpedicao}"
pattern="dd/MM/yyyy" />
<h:outputLabel value="Estado Civil:" />
<p:selectOneMenu value="#{matriculaBean.idEstadoCivil}">
<f:selectItems value="#{estadoCivilBean.estadosCivis}"
var="estadocivil" itemValue="#{estadocivil.id}"
itemLabel="#{estadocivil.descricao}" />
</p:selectOneMenu>
<h:outputLabel value="Nome da Mãe: " />
<p:inputText value="#{matriculaBean.matricula.nomeMae}" size="50" />
<h:outputLabel value="Nome do Pai: " />
<p:inputText value="#{matriculaBean.matricula.nomePai}" size="50" />
<p:commandButton value="Salvar"
action="#{matriculaBean.salvar}" ajax="false" />
<p:commandButton value="Cancelar"
action="#{matriculaBean.cancelar}" ajax="false" />
</h:panelGrid>
</fieldset>
</p:dialog>
</h:form>
</fieldset>
</h:form>
</ui:define>
</ui:composition>
</html>
MatriculaBean.java
package br.com.enterprisestoq.bean;
import java.io.Serializable;
import java.util.GregorianCalendar;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import br.com.enterprisestoq.dao.DAO;
import br.com.enterprisestoq.dao.MatriculaDAO;
import br.com.enterprisestoq.modelos.EstadoCivil;
import br.com.enterprisestoq.modelos.Matricula;
@ManagedBean
@ViewScoped
public class MatriculaBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private List<Matricula> matriculas;
private Matricula matricula;
private Matricula novaMatricula = new Matricula();
private Long idEstadoCivil;
private DAO<Matricula> dao = new MatriculaDAO();
public void novo(){
System.out.println("instanciando novo objeto matricula....");
this.matricula = new Matricula();
}
public String salvar() {
EstadoCivil estadoCivil = new DAO<EstadoCivil>(EstadoCivil.class)
.buscaPorId(idEstadoCivil);
this.matricula.setEstadoCivil(estadoCivil);
if(this.matricula.getId() == null){
this.matricula.setDataInclusao(new GregorianCalendar().getTime());
dao.adiciona(this.matricula);
} else {
dao.atualiza(this.matricula);
}
this.matricula = new Matricula();
return "matricula";
}
public String cancelar() {
this.matricula = new Matricula();
return "matricula";
}
public String cancelarNovo() {
this.matricula = new Matricula();
return "matricula";
}
public String cancelarSelecao() {
this.novaMatricula = new Matricula();
return "matricula";
}
public String editar() {
dao.atualiza(this.novaMatricula);
this.novaMatricula = new Matricula();
return "matricula";
}
public List<Matricula> getMatriculas() {
this.matriculas = dao.listaTodos();
return matriculas;
}
public void setMatriculas(List<Matricula> matriculas) {
this.matriculas = matriculas;
}
public Matricula getMatricula() {
return this.matricula;
}
public void setMatricula(Matricula matricula) {
this.matricula = matricula;
}
public Long getIdEstadoCivil() {
return idEstadoCivil;
}
public void setIdEstadoCivil(Long idEstadoCivil) {
this.idEstadoCivil = idEstadoCivil;
}
public Matricula getNovaMatricula() {
return novaMatricula;
}
public void setNovaMatricula(Matricula matriculaSelecionada) {
this.novaMatricula = matriculaSelecionada;
}
}