Chamar Bean onClick - JSF

5 respostas
Y

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

J

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”

Y

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

[]´s

N

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.

Y

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

N

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