Avatar billede fredand Forsker
17. september 2013 - 20:03 Der er 1 løsning

Problems with JSF selectOneMenu onchange

Hello guys!
I got a problem with a JSF h:selectOneMenu onchange.

The idea is that the user choose a category for system parameters and then get a couple of textfields for the systemparameters to edit.

How ever my first approach was with just Strings and List<String> and it worked fine.
How ever when I put it in the target environment that, I think just uses JSF 1.2, I got an error saying that I could not use String, I must use SelectItem.

So back to the drawingboard and I change it all to use SelectItems and List<SelectItem>.
But now the onchange does not work.

I hope you guys can help me out.

First my dependencies:
[code]<dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.1.7</version>
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.1.7</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
        </dependency>
                <!-- Tomcat 6 need this -->
        <dependency>
            <groupId>com.sun.el</groupId>
            <artifactId>el-ri</artifactId>
            <version>1.0</version>
        </dependency>[/code]

Then the idea is that this backingbean (method: setPresentCategory) should be called when the user change the select see below. But it does not get called:
[code]
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

public class SystemParameterManager {
    private final SelectItem[] parameters1 = { new SelectItem("a", "A"),
            new SelectItem("b", "B"), new SelectItem("c", "C") };
    private final SelectItem[] parameters2 = { new SelectItem("d", "D"),
            new SelectItem("e", "E"), new SelectItem("f", "F") };
    private final SelectItem[] parameters3 = { new SelectItem("g", "G"),
            new SelectItem("h", "H") };
    private List<SelectItem> categories = Arrays.asList(new SelectItem[] {
            new SelectItem("parameters1", "parameters1"),
            new SelectItem("parameters2", "parameters2"),
            new SelectItem("parameters3", "parameters3") });
    private List<SelectItem> presentParameters = Arrays.asList(parameters2);
    private SelectItem presentCategory = categories.get(1);

    public String save() {
        System.out.println("SAVE: ");

        Map<String, String> requestParams = FacesContext.getCurrentInstance()
                .getExternalContext().getRequestParameterMap();
        Set<String> keySet = requestParams.keySet();

        for (SelectItem selectItem : presentParameters) {
            for (String key : keySet) {
                if (selectItem.getLabel().equals(key)) {

                    selectItem.setValue((String) requestParams.get(key));
                    System.out.println("SAVING: " + selectItem.getValue());

                    break;
                }
            }
        }

        return "success";
    }

    public List<SelectItem> getCategories() {
        return categories;
    }

    public void setCategories(List<SelectItem> categories) {
        this.categories = categories;
    }

    public List<SelectItem> getPresentParameters() {
        return presentParameters;
    }

    public void setPresentParameters(List<SelectItem> presentParameters) {
        this.presentParameters = presentParameters;
    }

    public SelectItem getPresentCategory() {
        return presentCategory;
    }

    public void setPresentCategory(SelectItem presentCategory) {

        System.out.println("SETPRESENTCATEGORY: " + presentCategory);

        if (presentCategory.getLabel().equals("parameters1")) {
            setPresentParameters(Arrays.asList(parameters1));
            this.presentCategory = categories.get(0);
        } else if (presentCategory.getLabel().equals("parameters2")) {
            setPresentParameters(Arrays.asList(parameters2));
            this.presentCategory = categories.get(1);
        } else if (presentCategory.getLabel().equals("parameters3")) {
            setPresentParameters(Arrays.asList(parameters3));
            this.presentCategory = categories.get(2);
        }
    }
}
[/code]

The page is this xhtml-file

[code]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">   
    <body>
                <div>

                    <f:view>
                        <h:form id="SPF" prependId="false">
                            <h:outputText value="Select your system group" />
                           
           
                           
                            <h:selectOneMenu id="presentCategory"  value="#{SPM.presentCategory.value}" onchange="document.getElementById('SPF').submit();">
                               
                                <f:selectItems value="#{SPM.categories}" var="selectItem" itemValue="#{selectItem.value}" itemLabel="#{selectItem.label}" />
                           
                            </h:selectOneMenu>
                                                   
                            <br/>
                           
                            <h:dataTable value="#{SPM.presentParameters}" var="selectItem">
           
                                <h:column>
                                    #{selectItem.label}
                                </h:column>
                           
                                <h:column>
                                    <input type="text" name="#{selectItem.label}" value="#{selectItem.value}" />
                                </h:column>
               
                            </h:dataTable>

                            <h:commandButton action="#{SPM.save}" value="Spara" id="submitButton" />
                           
                        </h:form>
                    </f:view>
                   
                </div>
              </body>
</html>
[/code]

And the faces-config got this tags for the backing bean:
[code]
        <managed-bean>
        <managed-bean-name>SPM</managed-bean-name>
        <managed-bean-class>jsf_test.manager.SystemParameterManager</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
[/code]

So if you guys got any ideas how to reload the page when the select gets changed, please let me know.
Best regards
Fredrik

Btw I'm from sweden feel free th answer in danish.
Avatar billede fredand Forsker
18. september 2013 - 08:17 #1
Hello!

It looks like it work with this attribute:
valueChangeListener="#{SPM.valueChangeMethod}" in the selectOneMenu.

Best regards
Fredrik
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



Seneste spørgsmål Seneste aktivitet
I går 23:37 Poe strøm Af lurup i LAN/WAN
I går 14:46 GIF-EDITOR Af snestrup2000 i Billedbehandling
I går 14:03 Logge ind Af Bob i PC
I går 12:12 2 skærme - 1 virker - den anden siger No signal Af eksmojo i Skærme
I går 10:33 openvpn projekt Af dcedata1977 i Windows