JSF: commandButton reagiert nicht

  • Themenstarter Themenstarter LordZed
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
L

LordZed

Gast
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
Code:
<%@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
Code:
<?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
Code:
<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>
 
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! 😉
 
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:

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

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

private void refreshSelectItems(){
....
}

keine rocket-science 😛
 
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:

Code:
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:
Code:
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.
 
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 .....
 
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 ^^
 
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).
 
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 😉
 
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!?
 
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 😉
 
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 😉
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben