JSF Kein Methodenaufruf mit Button möglich durch PhaseListener (redirect) Problem?

JayGabriel

Aktives Mitglied
Hallo,

ich bin mal wieder mit meinem Latein am Ende, dabei hört sich mein Problem voll banal an...

Ich habe einen einfachen commandButton, der per action Property eine Methode aufrufen soll und diese gibt, jenachdem ob eine Variable null oder !null ist einen anderen String zurück um auf zwei unterschiedlichen Seiten weiterleiten zu können. In allen anderen Fällen, wo ich die gleiche Art und Weise zum Weiterleiten benutz habe, funktioniert es... nur bei diesem einen Button nicht. ???:L

Der Messages Tag bringt auch nichts an Fehlern für die Seite.

Die ManageBean, auf die mein Button zurgreift, um die Methode aufzurufen ist vom Scope Session, instanziiert wird diese Bean auch und auch die Initialisierung (@PostConstruct) wird aufgerufen.

Bei einem Klick auf den Button nun passiert jedoch NIX. Die Methode wird nicht einmal aufgerufen.
Ich vermute, dass das Problem durch meine Redirect Funktion entsteht, weiß jedoch nicht, was ich dort anders machen sollte, denn vor der Umstellung auf Templating mittels Apache Tiles hatte alles funktioniert.

In der Abfrage, ob ein Redirect ausgelöst werden soll oder nicht, habe ich meine Login-, Password- und Register Seite angegeben, von denen kein Redirect ausgelöst werden soll. (also !"auf angegebener Seite").
Der PhaseListener wird beim Klick auch ausgelöst, doch danach geht es nicht weiter. Daher meine Vermutung.

Mein Redirect mit einem PhaseListener:
Java:
package de.webproject.mytest.listener;

import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import de.webproject.mytest.model.Model;
import de.webproject.mytest.model.UserVerwaltung;

public class SessionPhaseListener implements PhaseListener {
  private static final long serialVersionUID = 1L;
  private HttpServletRequest request;
  private HttpSession session;
    
  private Model mmod;

  public void afterPhase(PhaseEvent event) {
  	System.out.println("afterPhase() Anfang");
  	request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
  	session = request.getSession();
  	
  	UserVerwaltung verw = UserVerwaltung.getInstanz();
		mmod = verw.getUserModel(session);
		
		FacesContext fc = event.getFacesContext();
		/* Abfrage:
		 * mmod == null -> wenn User nicht eingelogt
		 * !FacesContext.getCurrentInstance().getViewRoot().getViewId().equals("/webabo/password.jsp") ->
		 * 			wenn aktuelle Seite nicht "/webabo/password.jsp" ist
		 * !FacesContext.getCurrentInstance().getViewRoot().getViewId().equals("/webabo/login.jsp") ->
		 * 			wenn aktuelle Seite nicht "/webabo/login.jsp" ist
		 * 
		 * => dann Redirect auf Login Seite
		 */
		if(mmod==null && !fc.getViewRoot().getViewId().equals("/webabo/password.jsp")
									&& !fc.getViewRoot().getViewId().equals("/webabo/login.jsp")
									&& !fc.getViewRoot().getViewId().equals("/webabo/register.jsp")) {
			NavigationHandler nav = fc.getApplication().getNavigationHandler();
			System.out.println("redirect");
			nav.handleNavigation(fc, null, "logout");
		}
	}

  public void beforePhase(PhaseEvent event) {/* ignore */}

  public PhaseId getPhaseId() {
    return PhaseId.RESTORE_VIEW;
  }
}

Mein Button (soll von der PasswordSeite (PW vergessen) zurück auf die LoginSeite führen, wenn man das PW doch nicht zurück setzen lassen möchte):
Code:
<h:commandButton value="<- Login" action="#{passwordController.backTo}"/>

Methode, die der Button aufrufen soll, es jedoch nicht tut:
Java:
public String backTo() {
  System.out.println("PWContr: backTo()");
  reset();
  	
  if(mmod!=null) {
    System.out.println("back to userdata");
    return "userdata";
  } else {
    System.out.println("back to login");
     return "logout";
  }
}

Naviagtion in der faces-config.xml:
Code:
<navigation-rule>
  <from-view-id>/webabo/*</from-view-id>
  <navigation-case>
    <from-outcome>logout</from-outcome>
    <to-view-id>/webabo/login.jsp</to-view-id>
  </navigation-case>
  <navigation-case>
    <from-outcome>home</from-outcome>
    <to-view-id>/webabo/mainpage.jsp</to-view-id>
  </navigation-case>
  <navigation-case>
    <from-outcome>subscription</from-outcome>
    <to-view-id>/webabo/subscription.jsp</to-view-id>
  </navigation-case>
  <navigation-case>
    <from-outcome>list</from-outcome>
    <to-view-id>/webabo/overview.jsp</to-view-id>
  </navigation-case>
  <navigation-case>
    <from-outcome>contact</from-outcome>
    <to-view-id>/webabo/contact.jsp</to-view-id>
  </navigation-case>
  <navigation-case>
    <from-outcome>userdata</from-outcome>
    <to-view-id>/webabo/userdata.jsp</to-view-id>
  </navigation-case>
</navigation-rule>

auch mit der expliziten Angabe hat es nicht funktioniert:
Java:
<navigation-rule>
  <from-view-id>/webabo/password.jsp</from-view-id>
  <navigation-case>
    <from-outcome>logout</from-outcome>
    <to-view-id>/webabo/login.jsp</to-view-id>
  </navigation-case>
</navigation-rule>

Tiles config (dargestellt und erreicht werden beide Seiten problemlos):
Java:
<!-- Login ====================================================== -->
<definition name="/webabo/login.tiles" extends="single.main">
  <put-attribute name="title" value="WebAbo Login" />
  <put-attribute name="content" value="/views/tiles/login/content.jsp" />
</definition>
	
<!-- Password =================================================== -->
<definition name="/webabo/password.tiles" extends="single.main">
  <put-attribute name="title" value="WebAbo Pasword" />
  <put-attribute name="content" value="/views/tiles/password/content.jsp" />
</definition>

und zu guter Letzt meine Web.xml (vielleicht liegt auch hier der Fehler?)
die Grundeinstellungen für Tiles habe ich aus einem Tutorial entnommen, daher weiß ich nicht genau, ob hier auch wirklich alles richtig ist.
Code:
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  id="WebApp_ID" version="2.5">

  <display-name>webabo</display-name>
  
  <listener>
    <listener-class>de.webproject.ws.jsf.test09.listener.TimeoutSessionListener</listener-class>
  </listener>
  
  <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>*.faces</url-pattern>
  </servlet-mapping>
	
<!-- Welcome Seite ================================================ -->
  <welcome-file-list>
    <welcome-file>/webabo/login.faces</welcome-file>
  </welcome-file-list>

<!-- Make it sure to add myfaces servlet to make use of MyFacesExtensions Filter -->
  <servlet>
    <servlet-name>faces</servlet-name>
    <servlet-class>org.apache.myfaces.webapp.MyFacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>faces</servlet-name>
    <url-pattern>*.faces</url-pattern>
  </servlet-mapping>
  <listener>
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
  </listener>

<!--
  Session Config - Timeout 
-->
  <session-config>
    <session-timeout>5</session-timeout>
  </session-config>

<!-- APACHE TILES ================================================= -->
  <context-param>
    <param-name>tiles-definitions</param-name>
    <param-value>/WEB-INF/tiles.xml</param-value>
  </context-param>

<!--
  Tomahawk Extensions Filter  
-->
  <filter>
    <filter-name>extensionsFilter</filter-name>
    <filter-class>
      org.apache.myfaces.webapp.filter.ExtensionsFilter
    </filter-class>
    <init-param>
      <description>
        Set the size limit for uploaded files. Format: 10 - 10
        bytes 10k - 10 KB 10m - 10 MB 1g - 1 GB
      </description>
      <param-name>uploadMaxFileSize</param-name>
      <param-value>20m</param-value>
    </init-param>
    <init-param>
      <description>
        Set the threshold size - files below this limit are
        stored in memory, files above this limit are stored on
        disk.

        Format: 10 - 10 bytes 10k - 10 KB 10m - 10 MB 1g - 1 GB
      </description>
      <param-name>uploadThresholdSize</param-name>
      <param-value>100k</param-value>
    </init-param>
  </filter>

<!-- MYFACES EXTENSIONS ========================================== -->
<!-- This extensions are required for jscookmenu -->
  <filter>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
  </filter>
  <!--
    extension mapping for adding <script/>, <link/>, and other resource
    tags to JSF-pages
  -->
  <filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <url-pattern>*.faces</url-pattern>
  </filter-mapping>

  <!--
    extension mapping for serving page-independent resources
    (javascript, stylesheets, images, etc.)
  -->
  <filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
  </filter-mapping>
  
  <!--
    List required and recommended of context parameter
  -->
  <context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
  </context-param>
  <context-param>
    <param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name>
    <param-value>true</param-value>
  </context-param>
  <context-param>
    <param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name>
    <param-value>false</param-value>
  </context-param>
  <context-param>
    <param-name>facelets.SKIP_COMMENTS</param-name>
    <param-value>true</param-value>
  </context-param> 
  <context-param>
    <param-name>org.apache.myfaces.PRETTY_HTML</param-name>
    <param-value>false</param-value>
  </context-param>
  <context-param>
    <param-name>org.apache.myfaces.AUTO_SCROLL</param-name>
    <param-value>true</param-value>
  </context-param>
  <context-param>
    <param-name>org.apache.tiles.definition.DefinitionsFactory.DEFINITIONS_CONFIG</param-name>
    <param-value>/WEB-INF/tiles-defs.xml</param-value>
  </context-param>
</web-app>

Entwicklunsgumgebung:
Ich benutze zurzeit Myfaces 1.2.10, Tomahawk12-1.1.10 und Apache Tiles 2.0.5 (nachdem ich gelesen hatte, dass dies die einzige Version ist, die mit Tomahawk einigermaßen läuft). Dann hab ich noch einen lokalen Tomcat 6.0 und arbeite mit Eclipse Helios.
Zuvor hatte alles funktioniert, doch ich bin gerade beim Umstieg aufs Templating und seitdem ich Tiles benutze, tauchen ständig neue Probleme auf...

Ich hoffe, mir kann hier jemand weiter helfen!

mfg
Jay
 

JimPanse

Bekanntes Mitglied
Hallo,
Bei einem Klick auf den Button nun passiert jedoch NIX. Die Methode wird nicht einmal aufgerufen.
Ich vermute, dass das Problem durch meine Redirect Funktion entsteht, weiß jedoch nicht, was ich dort anders machen sollte, denn vor der Umstellung auf Templating mittels Apache Tiles hatte alles

Hört sich ganz so an ob dein CommandButton nicht in einem <h:form/> Komponente eingebunden ist. Ich würde das als aller erstes prüfen.

Grretz
 

JayGabriel

Aktives Mitglied
Das gibts doch nicht! :autsch:

Super, danke! Ich hatte zwei in einander verschachtelte Form Tags. Dabei hatte ich gedacht, dass ich das nachgeprüft hatte. Nun gut, manchmal sieht man den Wald vor lauter Bäumen nicht. ;)

Vielen Dank!

Jay
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
7 kein Absatz mittels request.getParameter()?? Web Tier 8
M JSF Kein Zugriff auf ManagedBeans, nach JSF Migration von 1.2 nach 2.0 Web Tier 4
L XML-Verarbeitungsfehler: Kein Element gefunden - Nur bei verwendung eines ServletFilters Web Tier 3
J h:graphicImage lädt kein Bild. Web Tier 3
G JSP kein Datenbankzugriff möglich Web Tier 2
Y myFaces 1.2 - kein ServletContext ? Web Tier 9
K [GWT] Probleme beim asynchronen Methodenaufruf mit GWT-RPC Web Tier 8
T Back Button bei JSF Anwendung Web Tier 2
J Session ist nach Klick auf Zurück-Button wieder aktiv Web Tier 3
S Button klick soll Java methode aufrufen Web Tier 2
Y Welcher Submit-Button wurde gedrückt? Web Tier 0
O JSF AccessKey auf Button-Beschriftung hervorheben Web Tier 0
G JSF Radio Button ValueChangeListener Wert wird nicht übernommen Web Tier 2
5 Button ID von betätigten Button herausfinden Web Tier 8
M JSF Button - Methode wird nicht aufgerufen Web Tier 4
M JSF Simple Testklasse für Button - MethodNotFoundException? Web Tier 6
L in JSF ein download button erstellen Web Tier 4
B Mit JavaServlet Submit Button ermitteln Web Tier 5
T Button im Servlet - Werte übergeben Web Tier 2
K JSF: Tabelle; Button, Stringausgabe Web Tier 2
Tandibur JSF: Verlinkung mittels Button, bedingte Weiterleitung Web Tier 4
I Zurück Button mit JSF Command Button Web Tier 2
J location response-header? Browser-Back-Button "deaktivieren" Web Tier 9
MQue in JSP: "Drucken"- Button Web Tier 2
P Zurück-Button des Browsers macht Probleme Web Tier 9
M Struts 2 Submit Button lokalisieren Web Tier 5
S Facelets Form: Validation abschalten bei Abbrechen-Button Web Tier 2
T Button abfrage mit Struts leicht gemacht ? Web Tier 3
A JSF: Button reagiert nicht und nicht verständliche Warnung Web Tier 6
G radio button deselect mit struts Web Tier 7

Ähnliche Java Themen

Neue Themen


Oben