Chamar Bean onClick - JSF

5 respostas
yorgan

Olá Pessoal,
Tenho um h:selectOneListbox e quero fazer ele chamar um método no bean a cada click. Consegui isso fazendo um submit(), mas dai ele recarrega sempre a tela. Alguém sabe como posso fazer com que ele faça isso utilizando um reRender ou outra coisa?
Para inserir um novo registro eu consegui, mas a seleção de item não.

Segue meu código:
JSP:

<a4j:region>
                        <h:selectOneListbox id="listaDia" value="#{listaTeste.idDiaSemana}" onchange="submit()" 
                        style="width: 150px; height: 100px">
                            <f:selectItems value="#{listaTeste.listaDiaSemana}" />
                            <a4j:support reRender="diaSemana" />
                       </h:selectOneListbox>
                    </a4j:region>
                    <br>
                    <h:outputText id="diaSemana" value="#{listaTeste.idDiaSemana}" />
                    
                    <br>
                    <a4j:commandButton action="#{listaTeste.adicionarDia}" reRender="listaDia" value="Adicionar" />
                </h:form>

Bean:

package teste;

import java.util.ArrayList;
import java.util.List;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;

public class ListTeste {

    private Integer idDiaSemana;
    private List selectItems;

    public ListTeste() {
        selectItems = new ArrayList();
        selectItems.add(new SelectItem(1, "Domingo"));
        selectItems.add(new SelectItem(2, "Segunda-Feira"));
        selectItems.add(new SelectItem(3, "Ter&#65533;a-Feira"));
        selectItems.add(new SelectItem(4, "Quarta-Feira"));
        selectItems.add(new SelectItem(5, "Quinta-Feira"));
        selectItems.add(new SelectItem(6, "Sexta-Feira"));
        selectItems.add(new SelectItem(7, "Sabado"));
    }

    @SuppressWarnings("unchecked")
    public List getListaDiaSemana() {
        return selectItems;
    }

    public void setListaDiaSemena(DataModel dm) {
        
    }

    public Integer getIdDiaSemana() {
        return idDiaSemana;
    }

    public void setIdDiaSemana(Integer idDiaSemana) {
        this.idDiaSemana = idDiaSemana;
    }

    public String definirDiaSemana() {
        System.out.println(idDiaSemana);
        return "";
    }

    public String adicionarDia() {
        List l = this.selectItems;
        boolean podeAdd = true;
        for (int i = 0; i < l.size(); i++) {
            SelectItem itemSelecionado = (SelectItem) l.get(i);
            if (new Integer(itemSelecionado.getValue().toString()) == 9999999) {
                podeAdd = false;
            }
        }
        if (podeAdd) {
            this.selectItems = null;
            l.add(0, new SelectItem(9999999, "Novo Registro"));
            this.selectItems = l;
        }
        return "";
    }
}

[]´s

Daniel

5 Respostas

javax.skol

yorgan:
Olá Pessoal,
Tenho um h:selectOneListbox e quero fazer ele chamar um método no bean a cada click. Consegui isso fazendo um submit(), mas dai ele recarrega sempre a tela. Alguém sabe como posso fazer com que ele faça isso utilizando um reRender ou outra coisa?
Para inserir um novo registro eu consegui, mas a seleção de item não.

Segue meu código:
JSP:

<a4j:region>
                        <h:selectOneListbox id="listaDia" value="#{listaTeste.idDiaSemana}" onchange="submit()" 
                        style="width: 150px; height: 100px">
                            <f:selectItems value="#{listaTeste.listaDiaSemana}" />
                            <a4j:support reRender="diaSemana" />
                       </h:selectOneListbox>
                    </a4j:region>
                    <br>
                    <h:outputText id="diaSemana" value="#{listaTeste.idDiaSemana}" />
                    
                    <br>
                    <a4j:commandButton action="#{listaTeste.adicionarDia}" reRender="listaDia" value="Adicionar" />
                </h:form>

Bean:

package teste;

import java.util.ArrayList;
import java.util.List;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;

public class ListTeste {

    private Integer idDiaSemana;
    private List selectItems;

    public ListTeste() {
        selectItems = new ArrayList();
        selectItems.add(new SelectItem(1, "Domingo"));
        selectItems.add(new SelectItem(2, "Segunda-Feira"));
        selectItems.add(new SelectItem(3, "Ter&#65533;a-Feira"));
        selectItems.add(new SelectItem(4, "Quarta-Feira"));
        selectItems.add(new SelectItem(5, "Quinta-Feira"));
        selectItems.add(new SelectItem(6, "Sexta-Feira"));
        selectItems.add(new SelectItem(7, "Sabado"));
    }

    @SuppressWarnings("unchecked")
    public List getListaDiaSemana() {
        return selectItems;
    }

    public void setListaDiaSemena(DataModel dm) {
        
    }

    public Integer getIdDiaSemana() {
        return idDiaSemana;
    }

    public void setIdDiaSemana(Integer idDiaSemana) {
        this.idDiaSemana = idDiaSemana;
    }

    public String definirDiaSemana() {
        System.out.println(idDiaSemana);
        return "";
    }

    public String adicionarDia() {
        List l = this.selectItems;
        boolean podeAdd = true;
        for (int i = 0; i < l.size(); i++) {
            SelectItem itemSelecionado = (SelectItem) l.get(i);
            if (new Integer(itemSelecionado.getValue().toString()) == 9999999) {
                podeAdd = false;
            }
        }
        if (podeAdd) {
            this.selectItems = null;
            l.add(0, new SelectItem(9999999, "Novo Registro"));
            this.selectItems = l;
        }
        return "";
    }
}

[]´s

Daniel

Tente acrescentar no seu a4j:support um event=“onchange”

yorgan

Valeu, funcinou perfeitamente.
Fica a dica do psyltrance para quem tiver o mesmo problema.

[]´s

netally

Este código de vcs funciona no IE?
A minha implementação esta muito parecida mas não funciona no IE.
Ele até chama o backBean, mas ele não consegue renderizar corretamente.

Ygor

netyCastilho tu tem alguma implementação em js? ou utiliza algum framework?
Pq esses são os maiores problemas de compatibilidade

netally

Versões do que eu utilizo:

richfaces 3.3.2
jsf 1.2
facelets 1.1.15

O código dos meus combos é o código abaixo. Eu acredito que o problema acontece pois os meus combos foram criados como facelets para serem usados em qualquer janela, ou seja, ao selecionar a cidade, a tabela que deve ser populada esta em outro xhtml dentro de um a4j:region .

<a4j:form reRender="#{reRender} slotTypePortPanelGroup">
			<h:panelGrid id="panelGrid" columns="6" cellspacing="5" styleClass="cidadeEstadoPaisCombos">
				<a4j:region id="cidadeEstadoPaisPanelGroup">
					<h:outputText value="País:" />					

					<h:selectOneMenu id="paisComboBox" styleClass="paisCombo"
						converter="selectedPaisDataConverter" value="#{cidadeEstadoPaisController.selectedPaisData}">
						<f:selectItems id="paisComboBoxItens" value="#{cidadeEstadoPaisController.slotList}" />
						<a4j:support event="onchange" reRender="estadoPanelGroup" action="#{cidadeEstadoPaisController.paisComboListener}"/>
					</h:selectOneMenu>
					
                    <h:outputText value="Estado:" />
					<h:panelGroup id="estadoPanelGroup">						
							<h:selectOneMenu id="estadoComboBox" styleClass="paisCombo" value="#{cidadeEstadoPaisController.estadoCode}"
							immediate="true">
								<f:selectItems id="estadoComboBoxItens" value="#{cidadeEstadoPaisController.estadoList}" />
								<a4j:support event="onchange" action="#{cidadeEstadoPaisController.estadoComboListener}"
									reRender="cidadePanelGroup" />
							</h:selectOneMenu>						
					</h:panelGroup>
					
                    <h:outputText value="Cidade:" />
					<h:panelGroup id="cidadePanelGroup">				
							<h:selectOneMenu id="cidadeComboBox" styleClass="paisCombo" value="#{cidadeEstadoPaisController.portNo}">
								<f:selectItems id="cidadeComboBoxItens"
									value="#{cidadeEstadoPaisController.cidadeList}" />
								<a4j:support event="onchange" action="#{cidadeEstadoPaisController.cidadeComboListener}" />
							</h:selectOneMenu>					
					</h:panelGroup>
				</a4j:region>
			</h:panelGrid>
		</a4j:form>

Alguma idéia de pq o problema ocorre só no IE??

Criado 11 de setembro de 2008
Ultima resposta 15 de set. de 2010
Respostas 5
Participantes 4