JSF - não chama o método do ManagedBean (dúvida iniciante)

8 respostas
SadNess

galera… comecei agora a mexer com jsf
então comecei a criar um sisteminha, pra ver se eu pego o jeito
mas na minha primeira tela já estou com um problema. o problema é que quando eu clico no botão “registrar”, ele da refresh na pagina, mas não chama o ManagedBean
alguém sabe oq está errado? tem algum conceito do jsf que eu não entendi pra isso estar acontecendo?
segue meu código:

jsp:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<html>
<body>
<f:view>
	<h:form>
		&lt;h:inputText value="#{playerBean.id}"/&gt;<br/>
		&lt;h:commandButton value="registrar" action="#{playerBean.registrar}" /&gt;<br/>

		&lt;h:selectOneMenu value="playerBean.nome"&gt;
			&lt;f:selectItems value="#{playerBean.players}"/&gt;
		&lt;/h:selectOneMenu&gt;

	&lt;/h:form&gt;
&lt;/f:view&gt;
&lt;/body&gt;
&lt;/html&gt;

ManagedBean:

public class PlayerBean implements Serializable {

	private long id;
	private String nome;

	private List&lt;SelectItem&gt; players = listarPlayers();
		
	public List&lt;SelectItem&gt; getPlayers() {
		return players;
	}
	public void setPlayers(List&lt;SelectItem&gt; players) {
		this.players = players;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}

	
	
	/**
	 * action
	 * @return
	 */
	public String registrar()	{
		this.id = 2;
		return null;
	}
	
	private void listarPlayers()	{
		players = new ArrayList&lt;SelectItem&gt;();
		
		players.add(new SelectItem(0, "a"));
		players.add(new SelectItem(1, "b"));
		players.add(new SelectItem(2, "c"));
	}
	
}

faces-config:

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
                              "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"&gt;
&lt;faces-config&gt;
	&lt;managed-bean&gt;
		&lt;managed-bean-name&gt;playerBean&lt;/managed-bean-name&gt;
		&lt;managed-bean-class&gt;br.rafael.ui.mb.PlayerBean&lt;/managed-bean-class&gt;
		&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;
	&lt;/managed-bean&gt;
&lt;/faces-config&gt;

eu percebi que quando eu clico no botao registrar, o metodo “listarPlayers” é chamado de novo (até onde eu entendi é pq ele instancia a classe de novo), mas o registrar não é chamado
mas o curioso é: se eu tiro o select da pagina jsp, o botao registrar funciona normalmente, e altera o valor do inputText pra 2

alguém sabe oq ta acontecendo?

8 Respostas

anderson.bonavides

Seu método tem que ser um List e não void.

public List<SelectItem> getListarPlayers()    {  
        players = new ArrayList<SelectItem>();  
          
        players.add(new SelectItem(0, "a"));  
        players.add(new SelectItem(1, "b"));  
        players.add(new SelectItem(2, "c"));  

        return   players;
    }

Prst atenção nas modificações, bem axo q é só isso.

SadNess

ops
entao
veio esse void sem querer
até pq se o metodo retornar void nem compila
T_T

ta retornando um " List<SelectItem>" sim
mas mesmo assim nao funciona =[

anderson.bonavides

posta ele

SadNess

segue o código do mb:

public class PlayerBean implements Serializable {

	private long id;
	private String nome;

	private List&lt;SelectItem&gt; players = listarPlayers(); 	
	
	public List&lt;SelectItem&gt; getPlayers() {
		return players;
	}
	public void setPlayers(List&lt;SelectItem&gt; players) {
		this.players = players;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}

	
	
	/**
	 * action
	 * @return
	 */
	public String registrar()	{
		this.id = 2;
		return null;
	}
	
	private List&lt;SelectItem&gt; listarPlayers()	{
		players = new ArrayList&lt;SelectItem&gt;();
		
		players.add(new SelectItem(0, "a"));
		players.add(new SelectItem(1, "b"));
		players.add(new SelectItem(2, "c"));
		
		return players;
	}
	
}
wamarra

Altere a declaração do seu selectOneMenu para:

<h:selectOneMenu value="#{playerBean.nome}"> <f:selectItems value="#{playerBean.players}"/> </h:selectOneMenu>

Assim acho q funcionará…

t+

e-cowboy

Dá uma olhada no seu SelectItem, você está setando Integer,String! seta String, String new SelectItem(“0”,“Zero”), já que o valor do select vai para o atributo nome que é String e não Integer!
E coloque um <h:messages/> para verificar o erro que ocorre caso persista!!
Isso deve resolver!

anderson.bonavides

Realmente o select item tem que conter String e já o managed bean não da para ficar sem " { } " pelo menos que eu saiba.

SadNess

foi esse mesmo o problema

fiz a somatória do que o Wesley e o e-cowboy falaram e funcionou

valeu galera

Criado 9 de junho de 2008
Ultima resposta 9 de jun. de 2008
Respostas 8
Participantes 4