[Resolvido]ManagedBean com JSF2.0

14 respostas
gRoOve

Olá pessoal, estou aprendendo JSF e não estou conseguindo fazer um exercício simples de uma apostila do K19, parece que não estou conseguindo setar atributos no meu managedBean, seguem os códigos:

GeradorDeApostasBean
package managedbeans;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.faces.bean.ManagedBean;

@ManagedBean //(name = "GeradorDeApostasBean")
public class GeradorDeApostasBean {
	private int quantidadeNumeros;
	private int tamanhoDaAposta;
	private int quantidadeDeApostas;
	private List<List<Integer>> apostas;
	
	public void setQuantidadeNumeros(int quantidadeNumeros){
		this.quantidadeNumeros = quantidadeNumeros;
	}

	public String geraApostas() {
		// prepara uma lista com todos os numeros
		ArrayList<Integer> numeros = new ArrayList<Integer>();
		for (int j=1; j <= this.quantidadeNumeros; j++) {
			numeros.add(j);
		}
		
		// cria uma sublista da lista de numeros
		List<Integer> subList = numeros.subList(0, this.tamanhoDaAposta);
		
		// lista de apostas vazias
		this.apostas = new ArrayList<List<Integer>>();
		
		// gera as apostas
		for (int i = 0; i < this.quantidadeDeApostas; i++) {
			Collections.shuffle(numeros);
			List<Integer> aposta = new ArrayList<Integer>(subList);
			this.apostas.add(aposta);
		}
		return "lista-de-apostas";
	}
}
formulario.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">
    <h:head>
        <title>Gerador de Apostas</title>
    </h:head>
    <h:body>
		<h:form>
			<h:panelGrid>
				<h:outputLabel value="Quantidade total de números:"/>
				<h:inputText value="#{GeradorDeApostasBean.quantidadeNumeros}"/>
				
				<h:outputLabel value="Quantidade de números por aposta:"/>
				<h:inputText value="#{GeradorDeApostasBean.tamanhoDaAposta}"/>
				
				<h:outputLabel value="Quantidade de apostas:"/>
				<h:inputText value="#{GeradorDeApostasBean.quantidadeDeApostas}"/>
				
				<h:commandButton action="#{GeradorDeApostasBean.geraApostas}" value="Gerar"/>
			</h:panelGrid>
		</h:form>
    </h:body>
</html>
lista-de-apostas.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:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title>Gerador de Apostas</title>
    </h:head>
    <h:body>
		<ui:repeat var="aposta" value="#{GeradorDeApostasBean.apostas}" varStatus="status">
			<h:outputText value="Aposta #{status.index + 1}: "/>
			<h:outputText value="#{aposta}" />
			<br/>
		</ui:repeat>
    </h:body>
</html>
E agora o erro que ocorre quando tento submeter o form:
/formulario.xhtml @12,69 value="#{GeradorDeApostasBean.quantidadeNumeros}": Target Unreachable, identifier 'GeradorDeApostasBean' resolved to null

Eu não entendi bem a utilização, tipo eu estou tentando setar o atributo direto: GeradorDeApostasBean.quantidadeNumeros, mas o atributo é private, ele chama o setter e instância um objeto automaticamente?

14 Respostas

Hebert_Coelho

Crie um get para quantidadeDeApostas.

OBS.: Caso você queira um exemplo de JSF talvez esse aqui possa te ajudar: JSF: Converter e Bean Auto Complete

fabiozanardi

eu acredito que criando o setters and getters no bean irá resolver,

se estiver utilizando o eclipse clica em cima do atributo e aperta ctrl + 1, ele vai dar o autocomplete para os setters e getters

gRoOve

Gerei todos os getters/setters conforme postaddo e mesmo assim persiste o mesmo erro.

GeradorDeApostasBean
package managedbeans;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.faces.bean.ManagedBean;

@ManagedBean //(name = "GeradorDeApostasBean")
public class GeradorDeApostasBean {
	private int quantidadeNumeros;
	private int tamanhoDaAposta;
	private int quantidadeDeApostas;
	private List<List<Integer>> apostas;

	// getters
	public List<List<Integer>> getApostas() {
		return apostas;
	}

	public int getQuantidadeDeApostas() {
		return quantidadeDeApostas;
	}

	public int getQuantidadeNumeros() {
		return quantidadeNumeros;
	}

	public int getTamanhoDaAposta() {
		return tamanhoDaAposta;
	}

	// setters
	public void setApostas(List<List<Integer>> apostas) {
		this.apostas = apostas;
	}

	public void setQuantidadeDeApostas(int quantidadeDeApostas) {
		this.quantidadeDeApostas = quantidadeDeApostas;
	}

	public void setQuantidadeNumeros(int quantidadeNumeros) {
		this.quantidadeNumeros = quantidadeNumeros;
	}

	public void setTamanhoDaAposta(int tamanhoDaAposta) {
		this.tamanhoDaAposta = tamanhoDaAposta;
	}


	public String geraApostas() {
		// prepara uma lista com todos os numeros
		ArrayList<Integer> numeros = new ArrayList<Integer>();
		for (int j=1; j <= this.quantidadeNumeros; j++) {
			numeros.add(j);
		}
		
		// cria uma sublista da lista de numeros
		List<Integer> subList = numeros.subList(0, this.tamanhoDaAposta);
		
		// lista de apostas vazias
		this.apostas = new ArrayList<List<Integer>>();
		
		// gera as apostas
		for (int i = 0; i < this.quantidadeDeApostas; i++) {
			Collections.shuffle(numeros);
			List<Integer> aposta = new ArrayList<Integer>(subList);
			this.apostas.add(aposta);
		}
		return "lista-de-apostas";
	}
	
}
Hebert_Coelho

Na sua página troca de GeradorDeApostasBean por geradorDeApostasBean

gRoOve

Opa, agora funcionou blz. No caso o nome ali com g minusculo está instanciando a classe GeradorDeApostasBean, é isso mesmo?

Hebert_Coelho

Na verdade, quem instancia é o próprio JSF.

Quando você não determina um nome dentro da anotação @ManagedBean o nome padrão fica sendo o nome da classe sendo que a primeira letra minúscula.

Só isso. [=

gRoOve

Entendi jakefrog, obrigado pelas explicações. Estou lendo novamente o livro use a cabeça servlets e jsp, pois sei que tem conteúdo falando sobre essa instanciação, quero entender como funciona mesmo.

Hebert_Coelho

IIIIIIp! Calma ae, esse livro vai te ajudar muito com JSF não.

Vai te dar uma idéia e tals, mas para entender o funcionamento do JSF é melhor vc ler um para JSF.

Eu li esse aqui, e foi muito bom:
http://www.amazon.com/Core-JavaServer-Faces-David-Geary/dp/[telefone removido]/ref=sr_1_1?ie=UTF8&qid=[telefone removido]&sr=8-1

gRoOve

Eu me referi ao livro na questão da instanciação direta ali, quando chama os get/set automatico tb, não sei o nome disso, preciso ler devolta. Por enquanto eu vou ler o que encontrar na net sobre jsf, ano que vou ver um livro. Já ouvi falar desse que você indicou =D

gRoOve

Por acaso este livro que você citou não tem a terceira edição em português, tem? E a terceira edição só tem na amazon mesmo? Procurei em vários lugares e não achei "/

satangoss

tenho ele em inglês, muito bom, o que as muitas vezes é muito melhor que uma versão traduzida. Alias é bom pegar livros em inglês pra ja ir se acostumando com a língua.

Hebert_Coelho

tenho ele em inglês, muito bom, o que as muitas vezes é muito melhor que uma versão traduzida. Alias é bom pegar livros em inglês pra ja ir se acostumando com a língua.
Concordo com o gRoOve viu.

Eu li esse livro no eReader que eu tenho, com isso pago menos pelo livro! 8)

Por isso não sei te falar se tem o livro em PT para a 3 edição.

gRoOve

Andei fazendo uma pesquisa e encontrei em vários lugares a 2ª Edição, mas ela trata sobre JSF 2.1, a diferença é muito grande? Compensa pegar a 2ª edição?

Hebert_Coelho

Não sei te falar mano, eu só li a terceira edição. Sorry. :roll:

Criado 16 de dezembro de 2011
Ultima resposta 21 de dez. de 2011
Respostas 14
Participantes 4