JSF Navigation

Phenix

Bekanntes Mitglied
Hallo zusammen,

wie kann ich das Thema Navigation in JSF 2.0 am elegantesten angehen?
Konkret: Der Benutzer soll sich einloggen können. Ist der Login erfolgreich, wird er auf eine bestimmte Seite gelotst. Wenn nicht, bleibt er auf der gleichen Seite und eine Fehlermeldung erscheint.
Ich habe dazu einen Button mit ActionListener genommen. Im actionListener steht dann z.B. folgende Zeile
Java:
ctx.getApplication().getNavigationHandler().handleNavigation(ctx, null, "valid");

Gibt es eine elegantere Lösung, so etwas zu realisieren?

Anbei noch die Navigationrule:

[XML]
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>valid</from-outcome>
<to-view-id>/intern.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>invalid</from-outcome>
<to-view-id>/index.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
[/XML]

Bisher wird allerdings eine Exception geworfen:

Java:
javax.faces.FacesException: Unexpected error restoring state for component with id j_idt3.  Cause: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0.
	at com.sun.faces.application.view.StateManagementStrategyImpl$1.visit(StateManagementStrategyImpl.java:273)
	at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1485)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1496)
	at com.sun.faces.component.visit.VisitUtils.doFullNonIteratingVisit(VisitUtils.java:75)
	at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:257)
	at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:181)
	at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:448)
	at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:148)
	at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:187)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:111)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
	at java.util.ArrayList.RangeCheck(ArrayList.java:547)
	at java.util.ArrayList.get(ArrayList.java:322)
	at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:165)
	at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1432)
	at com.sun.faces.application.view.StateManagementStrategyImpl$1.visit(StateManagementStrategyImpl.java:265)
	... 33 more
 

nocturne

Bekanntes Mitglied
Anstatt im Actionlistener, kannst du im link/button img tag-attribut "action" nehmen.


HTML:
<... action="${not empty loginBean.angemeldet?'valid':'fehler'}" ... />
 
Zuletzt bearbeitet:

Phenix

Bekanntes Mitglied
Ok, danke.
Daran habe ich auch gedacht. Wusste nur nicht so genau, ob die Seite komplett neu geladen werden muss, wenn der login nicht erfolgreich war (bisher läufts per ajax). Ich werds mal ausprobieren, sobald ich herausgefunden habe, woher die Fehlermeldung kommt. Der Stacktrace ist wenig aussagekräftig hierbai, weil ich in kaum eine der Methoden reinspringen kann und den Ursprung des Fehlers nicht finde.

PS: Ne Idee wo der Fehler herkommen könnte? Debugging hat bisher keine Ergebnisse gebracht
 
Zuletzt bearbeitet:

nocturne

Bekanntes Mitglied
Wenn du es nicht weist musst du es ausprobieren. Deine Entwicklung ist ja im Zyklus Entwicklung-Klicktest-Entwicklung. Ich nehme an, dass du sehr lange Zyklen hast. Wenn du es schaffst diese Zyklen zu verkürzen (JPDA, Inkrementelles Hot-Depoly) wirst du deine Erfahrung und Geschwindigkeit enorm erhöhen.

Im allgemeinen ist die JSF-Fehlersuche aber immer schwierig.
Am besten du benutzt Firefox. Dann kannst du folgende Suchmethode anwenden:

1. Guck in der Firefox-Fehlerkonsole
2. Nutze <rich:messages> um alle logikfehler zu offenbaren.
3. Nutze <a4j:log> um Fehler zu finden.
4. Debugge die Applikation
5. Mach ein Backup von der jsf-Datei und entferne solange unwichtige Teile bis das Problem identifiziert ist (Fork).
6. Such dir jemand zum skypen.
 
Zuletzt bearbeitet:

jwiesmann

Bekanntes Mitglied
Wenn es nur um das Login geht, solltest du einfach mal nach "form - authentication jsf" googlen. Ist anfänglich vielleicht etwas aufwendig, dafür kümmert sich dann dein Server um alles....
Gruß
 

Ähnliche Java Themen

Neue Themen


Oben