Formulário Primefaces não apresenta dados

Boa tarde a todos!

Estou aprendendo JSF com Primefaces e, mesmo copiando um exemplo do curso, o meu código não funciona. Não traz os dados.

Se alguém puder ajudar, será de grande valia!

Seguem os códigos:

Funcionarios.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:p="http://primefaces.org/ui"
	xmlns:f="http://java.sun.com/jsf/core">
<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</h:head>
<h:body>
	<h:form id="frm">
		<p:dataTable value="#{funcionarioBean.funcionarios}" var="funcionario">
			<p:column headerText="Matrícula">
				<h:outputText value="#{funcionario.matricula}"/>
			</p:column>
			<p:column headerText="Nome">
				<h:outputText value="#{funcionario.nome}"/>
			</p:column>
			<p:column headerText="Data de Admissão">
				<h:outputText value="#{funcionario.dataAdmissao}">
					<f:convertDateTime pattern= "dd/MM/yyyy"/>
				</h:outputText>
			</p:column>
			<p:column headerText="Salário">
				<h:outputText value="#{funcionario.salario}">
					<f:convertNumber type="currency" locale="pt_BR"/>
				</h:outputText>
			</p:column>
		</p:dataTable>
	</h:form>
</h:body>
</html>

Classe FuncionarioBean.java:

package br.eti.esj.principal;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

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

@ManagedBean
@ViewScoped
public class FuncionarioBean implements Serializable{
	private static final long serialVersionUID = 1L;
	
	private static final String[] nomes = { "João", "Maria", "José", "Sebastião", "Eduardo", "Mariana", 
				"Francisco", "Manoel", "Fernanda", "Gabriela", "Mário", "Marcos" };
	
	private static final String[] sobrenomes = { "Souza", "Silva", "Andrade", "Machado", "Júnior",
			"Albuquerque", "Alencar", "Assis", "Batista", "Camargo", "Coelho", "Costa", "Dias",
			"Leal", "Lima", "Leite" };
	
	private List<Funcionario> funcionarios;
	
	public FuncionarioBean() throws ParseException {
		System.out.println("Passei aqui 01");

		funcionarios = new ArrayList<>();

		System.out.println("Passei aqui 02");

		for(int i=0; i < 50; i++) {
			adicionarFuncionario();
		}
	}
	
	private void adicionarFuncionario() {
		String nomeCompleto = getNomeAleatorio() + " " + getSobrenomeAleatorio() + " " + getSobrenomeAleatorio();

		System.out.println(nomeCompleto + "\n");

		funcionarios.add(new Funcionario(getMatriculaAleatoria(), nomeCompleto, getDataAleatoria(),
				getSalarioAleatorio()));
	}

	private BigDecimal getSalarioAleatorio() {
		return (new BigDecimal(1000 + Math.random() * 29000));
	}
	
	private Long getMatriculaAleatoria() {
		return (long) (Math.random() * 10000);
	}
	
	private Date getDataAleatoria() {
		long dezAnosEmMilis = 24 * 60 * 60 * 1000;
		long periodoSorteadoEmMilissegundos = ((long) (Math.random() * 10 * 365)) * dezAnosEmMilis;
		return new Date(System.currentTimeMillis() - periodoSorteadoEmMilissegundos);
	}
	
	private String getSobrenomeAleatorio() {
		int posicao = (int) Math.round(Math.random() * (sobrenomes.length - 1));
		return sobrenomes[posicao];
	}
	
	private String getNomeAleatorio() {
		int posicao = (int) Math.round(Math.random() * (nomes.length - 1));
		return nomes[posicao];
	}
	
	public List<Funcionario> getFuncionarios() {
		return funcionarios;
	}
}

Classe Funcionario.java:

package br.eti.esj.principal;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

public class Funcionario implements Serializable{
	private static final long serialVersionUID = 1L;
	
	private Long matricula;
	private String nome;
	private Date dataAdmissao;
	private BigDecimal salario;
	
	public Funcionario(Long matricula, String nome, Date dataAdmissao, BigDecimal salario) {
		this.matricula = matricula;
		this.nome = nome;
		this.dataAdmissao = dataAdmissao;
		this.salario = salario;
	}

	public Long getMatricula() {
		return matricula;
	}

	public void setMatricula(Long matricula) {
		this.matricula = matricula;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Date getDataAdmissao() {
		return dataAdmissao;
	}

	public void setDataAdmissao(Date dataAdmissao) {
		this.dataAdmissao = dataAdmissao;
	}

	public BigDecimal getSalario() {
		return salario;
	}

	public void setSalario(BigDecimal salario) {
		this.salario = salario;
	}
}

POM.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>br.eti.esj</groupId>
	<artifactId>C_04_03_DataTable</artifactId>
	<version>0.0.1</version>
	<packaging>war</packaging>
	
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.glassfish</groupId>
			<artifactId>javax.faces</artifactId>
			<version>2.1.22</version>
			<scope>compile</scope>
		</dependency>

		<dependency>
			<groupId>org.primefaces</groupId>
			<artifactId>primefaces</artifactId>
			<version>6.0</version>
			<scope>compile</scope>
		</dependency>
	</dependencies>

	<build>
		<finalName>C_04_03_DataTable</finalName>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

Uma observação: eu coloquei algumas mensagens “Passei aqui XY” no construtor do Bean, porém, nenhuma delas está sendo executada. Ou seja, o Bean não está sendo criado.

Outra coisa: já me disseram para colocar @ManagedBean(name="funcionarioBean") mas isto também não adiantou, então voltei pro código normal (copiado do curso).

De antemão, muito obrigado!

Eu copiei seu código para testar e aqui esta funcionando normal…
A tabela vem em branco ou não aparece nada na tela?

Boa noite Mike!

A tabela está vindo em branco. Não aparece nada na tela. Só sei que a tabela está vindo em branco porque verifiquei o html da tela em branco que foi gerada.

Pude notar que o construtor do Bean não está sendo executado. Percebi isto porque coloquei alguns “System.out.println(“Passei aqui XY”);” dentro do método construtor e nenhum deles apareceu no “Console”.

Como você esta acessando a página?
posta o seu web.xml

quando você escreve <p: o autoComplete funciona?

Ou é problema de dependência ou esta acessando a url por uma extensão errada

Segue o arquivo web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">
	<display-name>C_04_03_DataTable</display-name>
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>/faces/*</url-pattern>
	</servlet-mapping>
</web-app>

E este é o arquivo faces-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
	version="2.2">

</faces-config>

Eu acesso a página pela URL a seguir:

http://localhost:8080/C_04_03_DataTable/Funcionarios.xhtml

Não sei como usar este <p: o autoComplete que você perguntou.

muda o seu url-pattern do web.xml pra *.xhtml e testa pra ver se foi

<url-pattern>*.xhtml</url-pattern>

Code Complete*
Code Complete é quando você aperta ctrl + espaco e automaticamente te da uma lista de opção para você escolher

Mike, legal!

Fiz a mudança que você sugeriu, e agora já aparece o cabeçalho da tabela. Porém, ainda não está vindo os dados.

Esqueci de lhe dizer, o autocomplete funciona para o Primefaces.

Apaga seu construtor e faz o seguinte:

@PostConstruct
public void init()
{
        System.out.println("Passei aqui 01");

		funcionarios = new ArrayList<>();

		System.out.println("Passei aqui 02");

		for(int i=0; i < 50; i++) {
			adicionarFuncionario();
		}
}
1 curtida

Mike, agora funcionou!

Muito obrigado pela ajuda e pela paciência!

Se puder e souber, me tire uma dúvida: saberia me dizer o porquê do construtor não ter sido executado?

Bom… não sei kk
Aqui tinha dado certo com o seu código, não sei se é a versão…
Estou usando a 2.2

Ok!

Também estou usando a JSF 2.2. Talvez tenha a ver com o sistema operacional, eu uso Debian 9.

Mais uma vez, muito obrigado!

Abraços…