# JSF: commandButton reagiert nicht



## LordZed (12. Nov 2008)

Hi! Ich habe eine Seite wo ich aus einer ComboBox eine Vorlage auswähle. Mit einem Button daneben soll die Liste in dieser ComboBox aktualisiert werden. Dafür existiert in der Bean der Liste eine entsprechende Methode.

Wenn ich nun den Button drücke passiert allerdings nichts. Ich habe auch schon mit dem Debuger einen Breakpointer in die Methode gesetzt und gesehen, dass er dort garnicht reinspringt. Kann mir jemand sagen, wo der Fehler liegt?

Hier die nötigen Dateien:
*vorlage.jsp*

```
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>

<f:loadBundle basename="de.amb.anw.c2s.lang.resources" var="messages" />

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>
<%@page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<html>
<head>
<base href="<%=basePath%>">
<title>C2S-Auftragsgenerator</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta name="GENERATOR" content="Rational Software Architect">
<LINK href="css/allgemein.css" rel="stylesheet" type="text/css">
<LINK href="css/vorlage.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="container">
<div class="header">Version 1.0 [img]images/amgis_logo.jpg[/img]
<h1>C2S-Auftragsgenerator</h1>
</div>
<f:view>
	<h:form id="formVorlage">
		


			<h:outputText value="#{messages.vorlage_text}"/>
		</p>
		


			<h:selectOneMenu id="vorlage" value="#{auftrag.auftragSource}">
				<f:selectItems value="#{auftragsliste.auftragsliste}" />
			</h:selectOneMenu>
			<%--
			<h:commandButton id="refresh"
				actionListener="#{auftragsliste.doRefresh}"
				value="#{messages.refresh}" alt="#{messages.refresh_alt}" />
			--%>
		</p>
		


			<h:commandButton id="submit" action="submit"
				value="#{messages.submit}" alt="#{messages.submit_alt}" />
		</p>
	</h:form>
</f:view>
</div>
</body>
</html>
```

*web.xml*

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
	<display-name>Editor</display-name>

	
	<context-param>
		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
		<param-value>client</param-value>
	</context-param>
	<context-param>
		<param-name>javax.faces.CONFIG_FILES</param-name>
		<param-value>/WEB-INF/faces-config.xml</param-value>
	</context-param>

	
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>
```

*faces-config.xml*

```
<faces-config>
	<application>
		<message-bundle>lang.resources</message-bundle>
		<locale-config>
			<default-locale>en</default-locale>
			<supported-locale>de</supported-locale>
		</locale-config>
	</application>
	
	<navigation-rule>
		<description>Aktionen bei der Auftragsauswahl</description>
		<from-view-id>/jsf/EditorVorlage.jsp</from-view-id>
		<navigation-case>
			<description>Vorlage ausgewaehlt</description>
			<from-outcome>submit</from-outcome>
			<to-view-id>/jsf/EditorEdit.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
	
	<managed-bean>
		<description>Liste aller vorhandenen Aufträge</description>
		<managed-bean-name>auftragsliste</managed-bean-name>
		<managed-bean-class>beans.AuftragslisteBean</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
	
	<managed-bean>
		<description>Daten eines einzelnen Auftrages</description>
		<managed-bean-name>auftrag</managed-bean-name>
		<managed-bean-class>beans.AuftragBean</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
	</managed-bean>
</faces-config>
```


----------



## LordZed (12. Nov 2008)

sehe gerade die Zeile mit dem Button ist hier noch auskommentiert! Ist sie natürlich nicht, sonst könnte ich den Button ja garnicht klicken!


----------



## L (12. Nov 2008)

Interessanter als faces-config/web.xml wäre hier der Code aus deiner Bean..

ActionListener wird für sowas hier nicht wirklich gebraucht, ne normale action (oder ajax) tut es auch:


```
.jsp:
<h:commandButton action="#{auftragsliste.refresh}" value="Refresh" />

.java:
public String refresh(){
 refreshSelectItems();
 return null;
}

private void refreshSelectItems(){
....
}
```

keine rocket-science


----------



## LordZed (12. Nov 2008)

Ich hatte jetzt den ActionListener genommen, weil ich ja nicht wirklich weiter navigiere, aber auch mit action klappt es nicht. Als ActionListener sieht die Funktion der Bean so aus:


```
public void doRefresh(ActionEvent event) {
	this.refreshAuftragsliste();
}
```

Als Action wie folgt und zusätzlich eine Navigation-Rule "refresh", die auf die Seite selbst führt:

```
public StringdoRefresh() {
	this.refreshAuftragsliste();
	return "refresh";
}
```

Funktionieren tuts das trotzdem nicht! Was in der Methode refreshAuftragsliste() passiert ist mehr oder weniger unerheblich, da er die Methode problemlos ausführt, wenn ich sie im Konstruktor der Bean aufrufe.


----------



## L (12. Nov 2008)

Problem ist also eigentlich nur, dass die Action-Methode nicht aufgerufen wird... kann nicht sein 

Eine extra Navigationsregel, um auf die gleiche Seite zu navigieren, braucht man nicht. Das wird durch ein "return null" bzw return "" realisiert.

ActionListener verwendet man, wenn man UI-Parameter bzw. Elemente in die Bean übergeben will. 

Der Code für den commandButton ist definitiv korrekt, Signatur der Action-Methode passt, Bean ist angelegt. Hmm pack' mal ein js-onclick auf deinen Button, ala:

<h:commandButton action="#{auftragsöiste.refresh}" onClick="submit();" /> 

Muss aber auch ohne Js gehen .....


----------



## Guest (12. Nov 2008)

Er schickt die Form ja auch ab, aber es passiert halt nichts... ich such auch schon seit 2 Stunden nach dem Fehler! In einem anderen Projekt, wo es nach dem selben Prinzip arbeitet funktioniert es ^^


----------



## jemand aus dem wald (12. Nov 2008)

Zieh dir am besten einfach mal die Sourcen deiner JSF Implementierung und häng dich etwas in die Interna rein, um genaueres zu erfahren. Mein erster Gedanke ist ja, dass es gar nicht zur Invoke Application Phase kommt. Ein typischer Anfängerfehler ist ja, dass z.B. ein Validierungsfehler auftritt. Interessant sind dazu die Implementierungen der Klasse Lifecycle (ich glaub die heißt sowohl in MyFaces als auch in Mojarra LifecycleImpl). In der Klasse siehst du im Debugger relativ einfach, in welcher Phase du dich gerade befindest (ähnliches könnte man auch mit einem PhaseListener erzielen). 

Ansonsten kannst du ja auch mal die ActionListener Implementierungen debuggen, um zu erfahren, welche Action Methode wirklich ausgeführt werden soll (vielleicht irrst dich diesbezüglich ja dennoch irgendwie, da bekommst dann auf jeden Fall Gewissheit).


----------



## LordZed (13. Nov 2008)

Ich bin erst am Montag wieder auf der Arbeit, aber dann schaue ich weiter  Nen Kollege meinte zu mir es könnte auch sein, dass ich einfach das TEMP-Verzeichniss meines lokalen WebSphere Application Servers mal löschen sollte, dass es daran liegen könnte. Naja  Montag werde ich weiter nach dem Fehler suchen! Wenns nicht spontan wieder klappt - man weiß ja wie "spontan" Computer manchmal sind ^^ - dann werd ich denke ich mal mit dem PhaseListener durchgucken in  welche Phase ich komme!

Danke für die Antworten! Ich melde mich wieder


----------



## Guest (17. Nov 2008)

Ich bin echt etwas verbacken!
Es war garkeine <h:messages /> eingebaut und es trat tatsächlich ein Konvertierungsfehler auf. Allerdings verstehe ich diesen nicht ganz. Er sagt da:


> Konvertierungs-Fehler: Wert 'asd.xml' für Modell 'null Converter'.


Für mich heißt das, dass er den String "asd.xml" mit dem "null Converter" nicht konvertieren kann. Klingt logisch, aber wieso nutzt der hier den "null Converter" oder verstehe ich da was falsch!?


----------



## LordZed (17. Nov 2008)

Hab das Problem gefunden!
Die Klasse an die meine ComboBox ihr Ergebnis zurückliefert erwartete ein SelectItem und keinen String. Dachte, weil die Eingabe auch SelectItems sind liefert der als Ausgabe auch SelectItem :-D Ich glaub als ich das geschrieben habe war ich was müde 

In der Bean die Variable als String deklariert und alles funzt einwandfrei! Danke für die Hilfe


----------



## LordZed (17. Nov 2008)

Hab das Problem gefunden!
Die Klasse an die meine ComboBox ihr Ergebnis zurückliefert erwartete ein SelectItem und keinen String. Dachte, weil die Eingabe auch SelectItems sind liefert der als Ausgabe auch SelectItem :-D Ich glaub als ich das geschrieben habe war ich was müde 

In der Bean die Variable als String deklariert und alles funzt einwandfrei! Danke für die Hilfe


----------

