Erro ao renderizar página no JSF

19 respostas
rodrigo.fai

Olá pessoal, bom dia!

Na minha página index.xhtml eu criei um <p:menu> com um item para uma página de listagem de equipamentos.

O código da página index.xhtml é o seguinte:

<!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">

   <h:head>
      <title>CE - Controle de Equipamentos</title>
   </h:head>
   <h:body>
		
		<h:form>
		
			<p:menu type="tiered" style="width:180px">  
	                     <p:submenu label="Equipamento" icon="ui-icon ui-icon-extlink">  
	                          <p:menuitem value="Novo" icon="ui-icon ui-icon-disk" url="/novoEquipamento.jsf"/>  
	                          <p:menuitem value="Lista" icon="ui-icon ui-icon-arrowrefresh-1-w" actionListener="#{equipamentoMBean.listar}" />  
	                     </p:submenu>  
	     		</p:menu> 
		
		</h:form>
   
   </h:body>

</html>

A regra de navegação no arquivo faces-config.xml defini da seguinte maneira:

<navigation-rule>
  <from-view-id>/index.xhtml</from-view-id>
  <navigation-case>
   <from-outcome>listaEquipamento</from-outcome>
   <to-view-id>/listaEquipamento.xhtml</to-view-id>
  </navigation-case>
 </navigation-rule>

O método “listar()” na minha MBean está assim:

public String listar()
	{
		this.equipamentoFacade = new EquipamentoFacade();
		this.equipamentos = this.equipamentoFacade.listar();

		return "listaEquipamento";
	}

Quando eu clico no item(Lista) do <p:Menu> o código é executado normalmente, trazendo a lista de equipamentos sem problemas algum! O problema é que a página “listaEquipamento.xhtml” não é exibida e não dá erro algum!!! É como se não houvesse evento algum ao clicar no item de menu!

Alguém poderia me dizer o que estou fazendo de errado?? Obrigado.

19 Respostas

B

tenta adicionando o …

<navigation-rule>
  <from-view-id>/index.xhtml</from-view-id>
  <navigation-case>
   <from-outcome>listaEquipamento</from-outcome>
   <to-view-id>/listaEquipamento.xhtml</to-view-id>
   <redirect/>
  </navigation-case>
 </navigation-rule>
rodrigo.fai

build_successful:
tenta adicionando o …

<navigation-rule> <from-view-id>/index.xhtml</from-view-id> <navigation-case> <from-outcome>listaEquipamento</from-outcome> <to-view-id>/listaEquipamento.xhtml</to-view-id> <redirect/> </navigation-case> </navigation-rule>

Não surtiu efeito build_successful…

B

hmm… tenta isso…
no lugar de “actionListener” poe “action”

<p:menuitem value="Lista" icon="ui-icon ui-icon-arrowrefresh-1-w" action="#{equipamentoMBean.listar}" />

deixa o lah .

:slight_smile:

humberto.lima

Cara, não sou expert em jsf, mas acho q actionlistener não controla navegação. Tenta trocar por action.

[]'s

Humberto Lima

rodrigo.fai

build_successful:
hmm… tenta isso…
no lugar de “actionListener” poe “action”

<p:menuitem value="Lista" icon="ui-icon ui-icon-arrowrefresh-1-w" action="#{equipamentoMBean.listar}" />

deixa o lah .

:)

Agora sim cara… fui redirecionado para a página “listaEquipamento.xhtml”!!! Porém não foram listados os dados… sendo que quando faço um debug, a consulta me retorna uma lista populada normalmente, porém não são exibidas na página!!!

humberto.lima

Cara, tens que observar o escopo do teu MB, se for request, acho q não funfa com redirect. Ou voce tira o redirect, ou coloca pra escopo de sessão. Ou ainda, podes utilizar uma tag saveState ou keepAlive, não lembro de quem é, pra persistir o MB entre as paginas (acho essa a melhor opção).

[]'s

Humberto Lima

B

o seu MB onde vc faz a consulta esta como ‘session’ ou ‘request’ ?

public String listar()  
{  
    this.equipamentoFacade = new EquipamentoFacade();  
    this.equipamentos = this.equipamentoFacade.listar();  
  
    return "listaEquipamento";  
}

como esta sua listaEquipamento.xhtml… poe ela ae pra gente da uma olhada.
flws

rodrigo.fai

humberto.lima:
Cara, tens que observar o escopo do teu MB, se for request, acho q não funfa com redirect, ou tira o redirect, ou coloca pra escopo de sessão. Ou ainda, podes utilizar uma tag saveState, não lembro de quem é, pra persistir o MB entre as paginas (acho essa a melhor opção).

[]'s

Humberto Lima

Bom… mudei o escopo do MBean pra @SessionScoped e não surtiu efeito!!! Vou pesquisar sobre essa tag saveState, pode ser que resolva meu problema… Valeu

rodrigo.fai

build_successful:
o seu MB onde vc faz a consulta esta como ‘session’ ou ‘request’ ?

public String listar()  
{  
    this.equipamentoFacade = new EquipamentoFacade();  
    this.equipamentos = this.equipamentoFacade.listar();  
  
    return "listaEquipamento";  
}

como esta sua listaEquipamento.xhtml… poe ela ae pra gente da uma olhada.
flws

Já testei as 2 opções e nada feito!!!

rodrigo.fai

build_successful:
o seu MB onde vc faz a consulta esta como ‘session’ ou ‘request’ ?

public String listar()  
{  
    this.equipamentoFacade = new EquipamentoFacade();  
    this.equipamentos = this.equipamentoFacade.listar();  
  
    return "listaEquipamento";  
}

como esta sua listaEquipamento.xhtml… poe ela ae pra gente da uma olhada.
flws

Código da listaEquipamento.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: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>
   	<title>Lista de Equipamentos</title>
   </h:head>
   <h:body>
   	
   	<h:form prependId="false">  
	   
	     <p:dataTable var="equipamento" value="#{equipamentoMBean.equipamentos}" paginator="true"  rows="10" style="font-size:12px; font-family:Verdana">  
	        <p:column>  
	             <f:facet name="header">  
	                 <h:outputText value="Departamento" />  
	             </f:facet>  
	             <h:outputText value="#{equipamento.departamento}" />  
	        </p:column>  
	        <p:column>  
	             <f:facet name="header">  
	                 <h:outputText value="Entidade" />  
	             </f:facet>  
	             <h:outputText value="#{equipamento.entidade}" />  
	        </p:column>  
	        <p:column>  
	             <f:facet name="header">  
	                 <h:outputText value="Funcionário" />  
	             </f:facet>  
	             <h:outputText value="#{equipamento.funcionario}" />  
	        </p:column>  
	        <p:column>  
	             <f:facet name="header">  
	                 <h:outputText value="Número de série" />  
	             </f:facet>  
	             <h:outputText value="#{equipamento.numeroDeSerie}" />  
	        </p:column>  
	        <p:column>  
	             <f:facet name="header">  
	                 <h:outputText value="Número de patrimônio" />  
	             </f:facet>  
	             <h:outputText value="#{equipamento.numeroDoPatrimonio}" />  
	        </p:column>
	        <p:column>  
	             <f:facet name="header">  
	                 <h:outputText value="Tipo" />  
	             </f:facet>  
	             <h:outputText value="#{equipamento.tipo}" />  
	        </p:column>
	        <p:column>  
	             <f:facet name="header">  
	                 <h:outputText value="Marca" />  
	             </f:facet>  
	             <h:outputText value="#{equipamento.marca}" />  
	        </p:column>
	        <p:column>  
	             <f:facet name="header">  
	                 <h:outputText value="Modelo" />  
	             </f:facet>  
	             <h:outputText value="#{equipamento.modelo}" />  
	        </p:column>
	        <p:column>  
	             <f:facet name="header">  
	                 <h:outputText value="Status" />  
	             </f:facet>  
	             <h:outputText value="#{equipamento.status}" />  
	        </p:column>
	        <p:column>  
	             <f:facet name="header">  
	                 <h:outputText value="Sistema Operacional" />  
	             </f:facet>  
	             <h:outputText value="#{equipamento.sistemaOperacional}" />  
	        </p:column>
	        <p:column>  
	             <f:facet name="header">  
	                 <h:outputText value="Pacote Office" />  
	             </f:facet>  
	             <h:outputText value="#{equipamento.pacoteOffice}" />  
	        </p:column>
	        <p:column>  
	             <f:facet name="header">  
	                 <h:outputText value="Observação" />  
	             </f:facet>  
	             <h:outputText value="#{equipamento.observacao}" />  
	        </p:column>
	   
	        <p:column style="width:32px">  
	             <p:commandButton update="display" oncomplete="equipamentoDialog.show()" image="ui-icon ui-icon-search">  
	                 <f:setPropertyActionListener value="#{equipamento}" target="#{dataTableMBean.selectedEquipamento}" />  
	             </p:commandButton>  
	        </p:column>  
	     </p:dataTable>  
	   
	     <p:dialog header="Car Detail" widgetVar="equipamentoDialog" resizable="false" width="200" showEffect="explode" hideEffect="explode">  
	         <h:panelGrid id="display" columns="2" cellpadding="4">  
	             <h:outputText value="Departamento:" />  
	             <h:outputText value="#{dataTableMBean.selectedEquipamento.departamento}" />  
	             <h:outputText value="Entidade:" />  
	             <h:outputText value="#{dataTableMBean.selectedEquipamento.entidade}" />  
	             <h:outputText value="Funcionário:" />  
	             <h:outputText value="#{dataTableMBean.selectedEquipamento.funcionario}" />  
	             <h:outputText value="Número de série:" />  
	             <h:outputText value="#{dataTableMBean.selectedEquipamento.numeroDeSerie}" />  
  	             <h:outputText value="Número do patrimônio:" />  
	             <h:outputText value="#{dataTableMBean.selectedEquipamento.numeroDoPatrimonio}" />  
	             <h:outputText value="Tipo:" />  
	             <h:outputText value="#{dataTableMBean.selectedEquipamento.tipo}" />  
	             <h:outputText value="Marca:" />  
	             <h:outputText value="#{dataTableMBean.selectedEquipamento.marca}" />  
	             <h:outputText value="Modelo:" />  
	             <h:outputText value="#{dataTableMBean.selectedEquipamento.modelo}" /> 
 	             <h:outputText value="Status:" />  
	             <h:outputText value="#{dataTableMBean.selectedEquipamento.status}" />  
	             <h:outputText value="Sistema Operacional:" />  
	             <h:outputText value="#{dataTableMBean.selectedEquipamento.sistemaOperacional}" />  
	             <h:outputText value="Pacote Office:" />  
	             <h:outputText value="#{dataTableMBean.selectedEquipamento.pacoteOffice}" />  
	             <h:outputText value="Observação:" />  
	             <h:outputText value="#{dataTableMBean.selectedEquipamento.observacao}" /> 
	         </h:panelGrid>  
	     </p:dialog>  
	   
	  </h:form>  
   	
   </h:body>
</html>
rodrigo.fai

Na página listaEquipamento.xhtml eu utilizo o DataTableMBean, cujo código é o seguinte:

package br.com.ce.bean;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.ce.model.Equipamento;

@ManagedBean
@ViewScoped
public class DataTableMBean {

	private Equipamento selectedEquipamento = new Equipamento();

	public Equipamento getSelectedEquipamento() {  
		return this.selectedEquipamento;  
	}  

	public void setSelectedEquipamento(Equipamento selectedEquipamento) {  
		this.selectedEquipamento = selectedEquipamento;  
	}  
}
B

hm …que treta em…

posta o codigo da classe EquipamentoMBean agora

rodrigo.fai

build_successful:
hm …que treta em…

posta o codigo da classe EquipamentoMBean agora

Código da classe EquipamentoMBean:

package br.com.ce.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import br.com.ce.controller.EquipamentoFacade;
import br.com.ce.model.Equipamento;

@ManagedBean
@SessionScoped
public class EquipamentoMBean {

	private Equipamento equipamento = new Equipamento();
	private List<Equipamento> equipamentos = new ArrayList<Equipamento>();
	private EquipamentoFacade equipamentoFacade;

	public void salvar()
	{
		this.equipamentoFacade = new EquipamentoFacade();
		this.equipamentoFacade.salvar(this.equipamento);
	}

	public void alterar()
	{}

	public void remover()
	{}

	public String listar()
	{
		this.equipamentoFacade = new EquipamentoFacade();
		this.equipamentos = this.equipamentoFacade.listar();

		return "listaEquipamento";
	}

	public Equipamento getEquipamento() {
		return this.equipamento;
	}

	public void setEquipamento(Equipamento equipamento) {
		this.equipamento = equipamento;
	}

	public EquipamentoFacade getEquipamentoFacade() {
		return this.equipamentoFacade;
	}

	public void setEquipamentoFacade(EquipamentoFacade equipamentoFacade) {
		this.equipamentoFacade = equipamentoFacade;
	}

	public List<Equipamento> getEquipamentos() {
		return this.equipamentos;
	}

	public void setEquipamentos(List<Equipamento> equipamentos) {
		this.equipamentos = equipamentos;
	}
}
B

cara…estranho.
não vi nada de errado.
poe o debug getEquipamentos() e ve se na hora que ele renderizar a pagina listaEquipamento.xhtml
ele esta sendo chamado e se esta populado ainda.

rodrigo.fai

build_successful:
cara…estranho.
não vi nada de errado.
poe o debug getEquipamentos() e ve se na hora que ele renderizar a pagina listaEquipamento.xhtml
ele esta sendo chamado e se esta populado ainda.

cara… fiz oq pediu, e quando é chamado o método getEquipamentos() a lista não é mais populada!!
Será que pode ser o escopo do MBean, ou o fato de eu estar utilizando 2 MBeans pra esta página???

B

acho que não tem problema o fato de usar dois MB na mesma pagina.

o estranho eh que seu Mbean EquipamentoMBean esta como @SessionScoped
então ele não deveria zerar a lista novamente…
verifica seu metodo listar() , ve se ele esta sendo executado mais de uma vez apos ele ter populado a lista.

rodrigo.fai

build_successful:
acho que não tem problema o fato de usar dois MB na mesma pagina.

o estranho eh que seu Mbean EquipamentoMBean esta como @SessionScoped
então ele não deveria zerar a lista novamente…
verifica seu metodo listar() , ve se ele esta sendo executado mais de uma vez apos ele ter populado a lista.

O método listar() é executado uma vez somente!!!

rodrigo.fai

build_successful:
acho que não tem problema o fato de usar dois MB na mesma pagina.

o estranho eh que seu Mbean EquipamentoMBean esta como @SessionScoped
então ele não deveria zerar a lista novamente…
verifica seu metodo listar() , ve se ele esta sendo executado mais de uma vez apos ele ter populado a lista.

RESOLVIDO!!!

A classe EquipamentoMBean estava anotada como @SessionScoped porém, no arquivo faces-config.xml esta classe estava como “request”!!! Muito vacilo meu mesmo…

B

nohh…que bosta emm
pior que isso ja aconteceu comigo tabem!
haushiuauha
faz parte!
flws

Criado 5 de abril de 2012
Ultima resposta 9 de abr. de 2012
Respostas 19
Participantes 3