primefaces como obter valor do <p:SelectOneMenu> que usuário selecionou?

4,595 views
Skip to first unread message

Rafael Neves

unread,
Jul 21, 2011, 5:49:00 PM7/21/11
to jav...@googlegroups.com
pessoal,

meu selectonemenu do prime funciona, mas não sei como pegar o valor que o usuário selecionou. dei uma olhada em alguns exemplos mas n compreendi como é feito para pegar o valor selecionado pelo usuário.
meu selectonemenu está assim:

            <p:selectOneMenu effect="drop"
                value="#{charactersMB.selectedCharacter}">
                <f:selectItem itemLabel="Selecione o char" itemValue="" />
                <f:selectItems value="#{charactersMB.list}" var="character"
                    itemLabel="#{character.charName}" itemValue="#{character.charId}"  />
            </p:selectOneMenu>
 lista certinho, como faço entao para pegar o valor selecionado pelo usuário?

--
Att,
Rafael Neves
Cursando Análise e Desenvolvimento de Sistemas
Em breve um analista!!!
Contato: Ranev...@gmail.com

Lucas

unread,
Jul 21, 2011, 6:06:19 PM7/21/11
to javasf: JavaServer Faces Group
o valor é armazenado em no value do selectOne menu neste caso aki:
<p:selectOneMenu effect="drop"
value="#{charactersMB.selectedCharacter}">
onde selectCharacter deve ser um atributo do bean do tipo String/int,
qual seja sua necessidade, e o valor de cada item deve ser colocado
no itemValue
assim:
<f:selectItem itemLabel="item 1" itemValue="algum valor" />
o jsf cuidará do resto
> Contato: Raneves...@gmail.com

Lucas

unread,
Jul 21, 2011, 6:08:52 PM7/21/11
to javasf: JavaServer Faces Group
hum, verificando seu codigo, parece tudo certo, tem q ver então se o
item esta mesmo recebendo este id do bean character

On Jul 21, 6:49 pm, Rafael Neves <raneves...@gmail.com> wrote:
> Contato: Raneves...@gmail.com

Matruskan

unread,
Jul 21, 2011, 9:47:02 PM7/21/11
to jav...@googlegroups.com
Quando você coloca o
value="#{charactersMB.selectedCharacter}"
você está dizendo que o JSF vai chamar o método "setSelectedCharacter(itemValue)"


2011/7/21 Rafael Neves <raneves.mg@gmail.com>
--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil

Rafael Neves

unread,
Jul 22, 2011, 9:32:10 AM7/22/11
to jav...@googlegroups.com
Obrigado, pessoal!

funcionou, ficou aparecendo &nsbn quando entra, mas vou tentar ver o que pode ser vi que isso é um bug do 3.0 em algum lugar, vou pesquisar e tentar corrigir.

Mas tem uma coisa que ainda n entendo, eu vi em alguns foruns o pessoal implementando um tal de Converter, não é necessário fazer isso? quando utilizar isso? alguém saberia me dizer?

Rafael Neves

unread,
Jul 25, 2011, 10:39:31 AM7/25/11
to jav...@googlegroups.com
caraleo que dificuldade de se fazer um listbox em jsf! pqp
esse converter simplesmente n funfa!
estou perdido nesse trem, se alguém puder me ajudar a entender esse converter ficarei grato.

meu componente está assim:
<p:selectOneMenu effect="drop" id="characters"
                value="#{charactersMB.selectedCharacter}" converter="charactersConverter" >

                <f:selectItem itemLabel="Selecione o char" itemValue="" />
                <f:selectItems value="#{charactersMB.list}" var="character"
                    itemLabel="#{character.charName}" itemValue="#{character}" />
            </p:selectOneMenu>

minha classe MB:
public class CharactersMB implements Serializable {
    private static final long serialVersionUID = 1L;
    private Characters selectedCharacter;

    public Characters getSelectedCharacter() {
        return selectedCharacter;
    }

    public void setSelectedCharacter(Characters selectedCharacter) {
        this.selectedCharacter = selectedCharacter;
    }

    public List<Characters> getList() {
        try {
            Connection connection = ConnectionFactory.getInstance();
            try {
                CharactersDAO dao = new CharactersDAO(connection);
                UserMB myUser = (UserMB) MySession
                        .getMB("userMB", UserMB.class);
                return dao.find(myUser.getAcc());
            } catch (SQLException e) {
                MessageFactory.setMessage(
                        "Erro ao listar os chars" + e.getMessage(),
                        "criticalError");
                return null;
            } finally {
                connection.close();
            }
        } catch (SQLException e) {
            MessageFactory.setMessage(
                    "Erro ao estabelecer conexao para listar os chars"
                            + e.getMessage(), "criticalError");
            return null;
        }
    }
}

o converter (o pesadelo):
@FacesConverter(value = "charactersConverter", forClass = Characters.class)
public class CharactersConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) throws ConverterException {
        //System.out.println("Valor: " + value + "\n componente: "
        //        + component.toString());
        //if (value != null) {
    //        return value;
//        }
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent componente,
            Object value) throws ConverterException {
        // TODO Auto-generated method stub
        //Characters character = (Characters) value;
        //System.out.println("\nValor do asString: " + character.getCharName());
        //return value.toString();
         return null;
    }

}

não estou etendendo como implementar esse converter, o cast q tentei fazer da erro.

Rafael Neves

unread,
Jul 25, 2011, 10:59:49 AM7/25/11
to jav...@googlegroups.com
o que eu n to entendendo desse converter, pessoal, é esse value que quando dou um print vem assim:


br.com.l2pog.model.Characters@16b352c
como eu vou pegar o objeto que o usuário selecionou com essa string?
:/

Arthur Franco Ferreira

unread,
Jul 25, 2011, 12:15:59 PM7/25/11
to jav...@googlegroups.com
O ID da sua Characters é Long, Integer, o que? Dependendo do que for, você vai ter que alterar o código em negrito que está que está abaixo. Copie e cole o código e teste para ver se funciona.

Você está utilizando a versão 3 do Primefaces? Se sim, lembre-se que ela ainda está em desenvolvimento e pode apresentar bugs. Não é recomendado.

@FacesConverter(value = "charactersConverter")

public class CharactersConverter implements Converter {

    public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
        if (value != null) {
            return this.getAttributesFrom(component).get(value);
        }
        return null;
    }

    public String getAsString(FacesContext ctx, UIComponent component, Object value) {

        if (value != null && !"".equals(value)) {

            Characters entity = (Characters) value;

            this.addAttribute(component, entity);

            Long codigo = entity.getId();

            if (codigo != null) {
                return String.valueOf(codigo);
            }
        }

        return (String) value;
    }

    protected void addAttribute(UIComponent component, BaseEntity o) {
        String key = o.getId().toString(); // codigo da empresa como chave neste caso
        this.getAttributesFrom(component).put(key, o);
    }

    protected Map<String, Object> getAttributesFrom(UIComponent component) {
        return component.getAttributes();
    }

}


<h:selectOneMenu id="characters" value="#{charactersMB.selectedCharacter}" converter="charactersConverter" >

    <f:selectItem itemLabel="Selecione o char" itemValue="" />
    <f:selectItems value="#{charactersMB.list}" var="character" itemLabel="#{character.charName}" itemValue="#{character}" />
</h:selectOneMenu>

Arthur Franco Ferreira
Analista Desenvolvedor Web Java Pleno
Licenciado em Computação
UNILASALLE-RJ

Matruskan

unread,
Jul 25, 2011, 12:17:43 PM7/25/11
to jav...@googlegroups.com
No seu converter, você tem que ter:

    @Override
    public String getAsString

que converte o objeto para uma string que identifique o objeto. Nessa string você tem que ter todas as informações necessárias para obter o objeto de novo. Geralmente eu retorno o ID do objeto para que eu busque no banco de dados depois.


    @Override
    public Object getAsObject

que pega o String da página (gerado pelo getAsString) e cria ou busca um objeto. Se eu dei o ID dele no getAsString, vou no banco buscando por esse ID. Se o objeto for bem simples, acho que dá para fazer um "new ObjetoX(value)", se não tiver problema. Se for um objeto bem mais complexo, que tenha vários relacionamentos, e que não esteja salvo no banco, aí eu peço desculpas, ainda não sei como resolver... Talvez você possa salvar o objeto no contexto, sei lá...

Mas você conseguiu entender a idéia do converter?

Ednardo Rubens Matos Ignácio

unread,
Jul 25, 2011, 12:29:05 PM7/25/11
to jav...@googlegroups.com

Rafael Neves

unread,
Jul 25, 2011, 2:12:52 PM7/25/11
to jav...@googlegroups.com
Arthur,

Muito obrigado, graças ao seu exemplo consegui entender o funcionamento da coisa... o segredo está no getAsString que deve guardar o obj para depois recuperá-lo...
O que seria esse BaseEntity? troquei ele pela minha classe Characters já que é ela que eu quero guardar.

ficou assim:

    protected void addAttribute(UIComponent component, Characters character) {
        String key = character.getCharId();
        this.getAttributesFrom(component).put(key, character);
    }

aqui está funcionando 100%, mas existe algum problema nisso? devo fazer com BaseEntity?

Em 25 de julho de 2011 13:29, Ednardo Rubens Matos Ignácio <ednard...@gmail.com> escreveu:
http://exteriorizar.blogspot.com/2009/10/conceitos-chaves-do-jsf-converters.html

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil

Arthur Franco Ferreira

unread,
Jul 25, 2011, 2:43:01 PM7/25/11
to jav...@googlegroups.com
Ih, eu esqueci de trocar o BaseEntity, desculpe. Acabei colocando código incompleto. Desculpa mesmo.

De qualquer forma, o BaseEntity é uma interface para você colocar nas suas entities, se não quiser fazer um converter para cada entidade. No post do Rafael Pontes tem essa explicação:

http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/


Arthur Franco Ferreira
Analista Desenvolvedor Web Java Pleno
Licenciado em Computação
UNILASALLE-RJ




Reply all
Reply to author
Forward
0 new messages