Pessoal,
alguem passou por instabilidade com o componente datatable com pagination do primefaces, pq no meu projeto estou utilizando o mesmo e está ocorrendo que quando vou navegar nos registros, os registros some, depois aparece, o botão que tem na tabela para editar tem hora q funciona e tem hora q não.
obrigado.
posta o teu código do datatable com o primefaces, tem alguma coisa que tu ta colocando demais ou de menos. O datatable do primefaces é um dos componentes mais estáveis que tem no projeto, mas ele não suporta algumas coisas, pode ser que você esteja fazendo algumas delas.
andre,
segue ai cara, e esse erro q eu to relatando, ta acontecendo em todas os datatable do meu sistema.
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.prime.com.tr/ui"
template="/paginas/layout.xhtml">
<ui:define name="conteudo">
<div class="div-consulta">
<h:outputText id="outNome" value="Nome: " />
<p:inputText id="txtNome" value="#{ClienteFacade.cliente.nome}" maxlength="100"/>
</div>
<div style="margin-left: 25%; padding: 4px;">
<p:commandButton id="btnPesquisar" value="PESQUISAR" actionListener="#{ClienteFacade.pesquisarClientes}" update="tblCliente"/>
<p:spacer height="10" width="20"/>
<p:commandButton id="btnNovo" value="NOVO" action="#{ClienteFacade.iniciarCadastro}" ajax="false" immediate="true"/>
</div>
<p:dataTable id="tblCliente" var="cliente" value="#{ClienteFacade.listaClientes}"
emptyMessage="" rows="10" paginator="true" paginatorPosition="bottom"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {NextPageLink} {LastPageLink}">
<p:column style="width: 400px">
<f:facet name="header">
<h:outputText value="Nome" />
</f:facet>
<h:outputText value="#{cliente.nome}" />
</p:column>
<p:column style="width: 100px">
<f:facet name="header">
<h:outputText value="Telefone" />
</f:facet>
<h:outputText value="#{cliente.telefone}" />
</p:column>
<p:column style="width:32px">
<p:commandButton action="#{ClienteFacade.editarCliente}" image="ui-icon ui-icon-search" ajax="false" immediate="true" alt="Editar Cliente" style="width:30px; height: 25px;">
<f:setPropertyActionListener value="#{cliente}" target="#{ClienteFacade.cliente}"/>
</p:commandButton>
</p:column>
</p:dataTable>
</ui:define>
</ui:composition>
@Stateless
@Named("ClienteFacade")
@SessionScoped
public class ClienteFacade {
@Inject
private ClienteDAO clienteDAO;
@Inject
private UsuarioDAO usuarioDAO;
@Inject
private Cliente cliente;
private List<Cliente> listaClientes;
public ClienteFacade(){
cliente = new Cliente();
}
public String iniciarConsulta(){
cliente = new Cliente();
listaClientes = new ArrayList<Cliente>();
return TelaEnum.CLIENTE_CONSULTA.getTela();
}
public String iniciarCadastro(){
cliente = new Cliente();
return TelaEnum.CLIENTE_CADASTRO.getTela();
}
public void novoCliente(){
cliente = new Cliente();
}
public void salvar(){
boolean salvou = false;
FacesMessage msg = null;
RequestContext context = RequestContext.getCurrentInstance();
if(cliente.getIdCliente() == null && clienteDAO.pesquisarClientePorNome(cliente.getNome()) != null){
msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Nome existente.", null);
}else{
try {
if(cliente.getIdCliente() == null){
cliente.setUsuario(usuarioDAO.pesquisar(Usuario.class, 1));
clienteDAO.inserir(cliente);
}else{
clienteDAO.alterar(cliente);
}
cliente = new Cliente();
salvou = true;
msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Cliente salvo com sucesso.", null);
} catch (Exception e) {
e.printStackTrace();
msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Ocorreu um erro no sistema.", null);
}
}
FacesContext.getCurrentInstance().addMessage(null, msg);
context.addCallbackParam("salvou", salvou);
context.addPartialUpdateTarget("msgs");
}
public void pesquisarClientes(){
listaClientes = clienteDAO.pesquisarClientes(cliente);
}
public String voltarConsulta(){
cliente = new Cliente();
return TelaEnum.CLIENTE_CONSULTA.getTela();
}
public List<Cliente> getListaClientes() {
return listaClientes;
}
public void setListaClientes(List<Cliente> listaClientes) {
this.listaClientes = listaClientes;
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
public String editarCliente() {
return TelaEnum.CLIENTE_CADASTRO.getTela();
}
te serei sincero cara, como é que diacho tu ta conseguindo executar esse código sem ele estar dentro de um <h:form></h:form>???
kkkkkkkkkk
a ferramenta do datatable, commandbutton, commandlink… etc de commands, são todas renderizadas e pesadas por um form, sem ter elas dentro de um form você, supostamente, não conseguiria nem executá-la.
coloque dentro de um form e veja de está acontecendo a mesma coisa.
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.prime.com.tr/ui"
template="/paginas/layout.xhtml">
<ui:define name="conteudo">
<h:form>
<div class="div-consulta">
<h:outputText id="outNome" value="Nome: " />
<p:inputText id="txtNome" value="#{ClienteFacade.cliente.nome}" maxlength="100"/>
</div>
<div style="margin-left: 25%; padding: 4px;">
<p:commandButton id="btnPesquisar" value="PESQUISAR" actionListener="#{ClienteFacade.pesquisarClientes}" update="tblCliente"/>
<p:spacer height="10" width="20"/>
<p:commandButton id="btnNovo" value="NOVO" action="#{ClienteFacade.iniciarCadastro}" ajax="false" immediate="true"/>
</div>
<p:dataTable id="tblCliente" var="cliente" value="#{ClienteFacade.listaClientes}"
emptyMessage="" rows="10" paginator="true" paginatorPosition="bottom"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {NextPageLink} {LastPageLink}">
<p:column style="width: 400px">
<f:facet name="header">
<h:outputText value="Nome" />
</f:facet>
<h:outputText value="#{cliente.nome}" />
</p:column>
<p:column style="width: 100px">
<f:facet name="header">
<h:outputText value="Telefone" />
</f:facet>
<h:outputText value="#{cliente.telefone}" />
</p:column>
<p:column style="width:32px">
<p:commandButton action="#{ClienteFacade.editarCliente}" image="ui-icon ui-icon-search" ajax="false" immediate="true" alt="Editar Cliente" style="width:30px; height: 25px;">
<f:setPropertyActionListener value="#{cliente}" target="#{ClienteFacade.cliente}"/>
</p:commandButton>
</p:column>
</p:dataTable>
</h:form>
</ui:define>
</ui:composition>
uma outra dica para que seu código fique mais elegante e menos mesclado. Ao invés de
utilize <h:panelGroup>, assim você poderá trabalhar com mais opções do jsf em uma div. O panelGroup tem a propriedade layout que pode ser definida como block (<h:panelGroup layout=“block”/>) que te viabiliza a mobilidade dele inteiro na página, igual a uma div, só que com atributos JSF, que te deixa mais bem na fita kkkk
andre,
eu não to usando esse codigo sem form, como vc pode ver, esse é uma pagina de composition, que tem um template. segue o codigo do template
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.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:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.prime.com.tr/ui">
<f:view contentType="text/html">
<h:head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="../css/sistema.css" media="screen" />
<script type="text/javascript" src="../js/sistema.js"></script>
</h:head>
<h:body>
<div id="cabecalho" class="cabecalho">
CABEÇALHO
</div>
<h:form id="formulario">
<p:dialog widgetVar="modalMsg" modal="true" header="INFORMAÇÕES" resizable="false" draggable="false" width="600" position="350,50">
<p:messages id="msgs" />
</p:dialog>
<div id="menu" class="menu">
<ul>
<li>
<p:commandLink id="lnkUsuario" action="#{UsuarioFacade.iniciarConsulta}" immediate="true" value="USUÁRIO" styleClass="#{facesContext.viewRoot.viewId.contains('usuario') ? 'ativo' : ''}" ajax="false" rendered="#{request.isUserInRole('ADMINISTRADOR')}"/>
</li>
</ul>
<p:commandButton id="btnSair" value="SAIR" action="#{LoginFacade.deslogar}" ajax="false" immediate="true"/>
</div>
<div id="conteudo" class="conteudo">
<ui:insert name="conteudo"/>
</div>
</h:form>
<ui:insert name="modal"/>
</h:body>
</f:view>
</html>
mas valeu pela dica do panelgroup.
a resposta está aí então alisson, a resposta mora na herança do form do template. O primefaces tem problema com aninhamento e reutilização de alguns componentes cross-templates assim como cross-component (form dentro de form, etc).
deixe a importação fora de um form e no datatable chame-o em um form dentro da mesma view, assim você conseguirá até mesmo fazer a atualização (update) via ajax no componente de formulário
andre,
tirei o form de dentro do template e passei para pagina de composition, é continua instavel do msm jeito… :?
vlw