[JSF] Dropdownbox und Listbox mit AJAX

D

derpy

Gast
Hallo! :)

Ich möchte, dass auf einer JSF Seite eine Dropdown-Box dargestellt wird, in der die österreichischen Bundesländer angezeigt werden. Wenn ich eins auswähle, soll in der Listbox darunter eine Liste von Städten aus diesem Bundesland ausgegeben werden. Das ganze soll über AJAX realisiert werden.

An sich sollte ja alles funktionieren, nur mein Problem ist, dass bei Auswahl des Bundeslands nichts in der Listbox angezeigt wird.

Ich hoffe mir kann jemand helfen... Ich steh total auf'm Schlauch :(

Auszug der JSF-Seite:
Code:
<h:form id="bundeslandForm">
            <h:selectOneMenu id="som" value="#{bundesCon.bundesland}">
                <f:ajax render="bListbox" event="valueChange"/>
                <f:selectItems value="#{bundesCon.bundesland.austria2}" var="b" itemValue="#{b}" itemLabel="#{b.name}"/>
            </h:selectOneMenu>
            <br/>
            <h:selectOneListbox id="bListbox">
                <f:selectItems value="#{bundesCon.bundesland.staedte}"/>
            </h:selectOneListbox>
        </h:form>

und der zugehörige Controller:

Java:
@ManagedBean(name = "bundesCon")
@SessionScoped
public class BundeslandController implements Serializable {

    private Bundesland bundesland = new Bundesland();
    private String aktBL = Bundesland.getAustria().get(0).toString();

    public String getAktBL() {
        return aktBL;
    }

    public void setAktBL(String aktBL) {
        this.aktBL = aktBL;
    }

    public BundeslandController() {
    }

    public Bundesland getBundesland() {
        return bundesland;
    }

    public void setBundesland(Bundesland bundesland) {
        this.bundesland = bundesland;
    }
}

model-Klasse Bundesland:
Java:
package model;

import java.util.ArrayList;
import java.util.List;

public class Bundesland {

    private final static List<Bundesland> austria;
    private List<String> staedte = new ArrayList<String>();
    private final static List<String> sList = new ArrayList<String>();

    public Bundesland(String name, String capital, int area) {
        this.name = name;
        this.capital = capital;
        this.area = area;
    }

    public Bundesland(String name, String capital, int area, List<String> staedte) {
        this.name = name;
        this.capital = capital;
        this.area = area;
        for (String s : staedte) {
            this.staedte.add(s);
        }
    }

    public List<String> getStaedte() {
        return staedte;
    }

    static {
        austria = new ArrayList<Bundesland>();
        sList.add("Neusiedl");
        sList.add("Eisenstadt");
        sList.add("Mattersburg");
        austria.add(new Bundesland("Burgenland", "Eisenstadt", 3965));
        sList.clear();
        sList.add("Linz");
        sList.add("Wels");
        sList.add("Steyr");
        austria.add(new Bundesland("Oberösterreich", "Linz", 11982));
        //usw.
    }
    private String name;
    private String capital;
    private int area;

    public static List<Bundesland> getAustria() {
        return austria;
    }

    public List<Bundesland> getAustria2() {
        return getAustria();
    }

    public Bundesland() {
        this("", "", 0);
    }

    public String getCapital() {
        return capital;
    }

    public String getName() {
        return name;
    }

    public int getArea() {
        return area;
    }
}
 

freez

Top Contributor
Oh, weh, wo fängt man an ;).

Es gibt hier schon einige Dinge die mir spontan auffallen, die zum einen zu deinem Problem gehören, und zum anderen von der Umsetzung ... ich sag mal ... nicht clever sind

Java:
    static {
        austria = new ArrayList<Bundesland>();
        sList.add("Neusiedl");
        sList.add("Eisenstadt");
        sList.add("Mattersburg");
        austria.add(new Bundesland("Burgenland", "Eisenstadt", 3965));
        sList.clear();
        sList.add("Linz");
        sList.add("Wels");
        sList.add("Steyr");
        austria.add(new Bundesland("Oberösterreich", "Linz", 11982));
        //usw.
    }

Hier mal einfach grundsätzlich: mit static füllt man nicht eine Klasse mit Infos. Schau dir mal bitte die Annotation @PostConstruct an. Zum anderen füllst du deine sList, schmeisst mit clear() alles weg, was drin ist und füllst sie mit anderen Infos. Ich vermute mal, dass die richtigere Vorgehensweise wohl in dem Beispiel so wäre: Der Controller erstellt ein Bundesland und fügt diesem entsprechende Städte hinzu und speichert es in einer Liste. Dann erstellt er das nächste Bundesland ... Städte ... Liste ... usw. => Hier brauchst du @PostConstruct. In deiner Bundesland Klasse benötigst du nur die reinen Daten: Name, Liste mit Städte etc + Getter und Setter. Mehr scheint mir in deinem Fall erst mal nicht nötig zu sein.

Dein [c]f:ajax[/c] benötigt einen Listener, also eine Methode in deinem Controller, welche aufgerufen wird, wenn das Event gefeuert wird. In dieser Methode prüfst du, welches Bundesland ausgewählt wurde, suchst es aus deiner Bundeslandliste raus und speicherst es als [c]bundesland[/c] in deinem Controller. Deine Listbox mit den Städten sollte nun die Städte des gewählten [c]bundesland[/c] haben.

Hier ein Beispiel mal schnell aus dem Netz gefischt ;):
Code:
<f:ajax
    event="valueChange"
    execute="@this"
    listener="#{controller.genericAjaxEventLogger}"
    render="#{cc.attrs.ajaxRenderTargets}" />
 

SSAT

Mitglied
Alternativ zum Methodenaufruf beim valueChange, kannst du auch einen Converter schreiben, z.B.

Java:
@FacesConverter(value="bundeslandConverter")
public class BundeslandConverter implements Converter
{

	@Override
	public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2)
	{
		int index = Integer.valueOf(arg2);
		return Bundesland.getAustria().get(index);
	}

	@Override
	public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2)
	{
		if(arg2 instanceof Bundesland)
			return ""+Bundesland.getAustria().indexOf(arg2);
		else
			return "";
	}

}

Den Converter musst du dann noch deim selectOneMenu anmelden

Code:
          <h:selectOneMenu id="som" value="#{bundesCon.bundesland}">
            	<f:converter converterId="bundeslandConverter"/>
                <f:ajax render="bListbox"/>
                <f:selectItems value="#{bundesCon.bundesland.austria2}" var="b" itemValue="#{b}" itemLabel="#{b.name}"/>
            </h:selectOneMenu>

Der Grund, weshalb dann immernoch keine Städte angezeigt werden, liegt einfach daran, dass du deinen Bundesländern nie Städte hinzufügst.

P.S: Wegen der statischen Liste in der Bundesland-Klasse kann ich freez nur zustimmen.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben