Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo zusammen,
ich habe folgendes Problem mit meiner Anwendung (JSF 1.2, Tomcat 5.5, Java 1.6):
Ich habe eine login.jsp, welche (unter anderem) einen Button enthält. Habe ich diese Seite nun im Browser aufgerufen und betätige die Schaltfläche, werden in der Bean die Logindaten geprüft und dann ein entsprechender Wert zurückgeliefert, der gemäß faces-config.xml eine Weiterleitung auslöst. So weit so gut.
Wenn nun aber die Seite länger ungenutzt geöffnet bleibt, und ich betätige dann den Button, dann wird die Seite scheinbar refresht, aber die Methode in der Bean wird nicht aufgerufen. Erst bei erneutem Betätigen passiert das oben Beschriebene.
Hat jemand eine Idee, wo mein Problem liegt? Was muss ich tun, damit die Methode sofort aufgerufen wird und nicht erst beim zweiten Versuch? Ich verzweifle gerade, denn ich finde die Ursache nicht...
Gruß, Nick
Wenn nun aber die Seite länger ungenutzt geöffnet bleibt, und ich betätige dann den Button, dann wird die Seite scheinbar refresht, aber die Methode in der Bean wird nicht aufgerufen. Erst bei erneutem Betätigen passiert das oben Beschriebene.
Hat jemand eine Idee, wo mein Problem liegt? Was muss ich tun, damit die Methode sofort aufgerufen wird und nicht erst beim zweiten Versuch? Ich verzweifle gerade, denn ich finde die Ursache nicht...
Kann man nur raten. Ich tippe mal darauf, dass Du die Seite im Browsercache hast und der Browser sie deswegen von dort lädt, anstatt den Request zum Server zu senden.
Mir ist aufgefallen, dass bei diesem "Reload" meiner Loginseite (wie oben beschrieben) die Methoden
Code:
getActiveUser( )
und
Code:
getSoftwareVersion()
aufgerufen werden, und auch das SelectOneMenu lädt seine Werte, nur der Button scheint "funktionslos" zu sein.
Ich hoffe, dies sind die gewünschten Mehrinfos, ansonsten bitte einfach fragen.
@nillehammer: Meine Vermutung ist auch, dass es ein Caching-Problem sein könnte, daher habe ich auf Deinen Hinweis hin die Zeilen bezüglich "caching" in meine Login.jsp eingefügt (s.o.), allerdings besteht das Problem immer noch...
Mit dem Cache hat das nichts zu tun, wenn die Seite das längeren nicht mehr benutzt wurde, ist die Session abgelaufen und damit sind auch die Information über den Komponentenbaum/ Status verloren d.h. müssen diese Informationen erstmal neu erstellt werden - war eine unschönheit mit JSF 1.2 das man darauf schlecht reagieren konnte.
Lösung wäre:
1. Entweder State Saving von server auf client setzen [XML]
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
[/XML]
Die ViewState Informationen werden dann in der Seite in einem hidden field gespeichert und bei jedem request mit gesendet - ist aber nur für kleinere Anwendung ratsam.
2. Wenn ich mich noch erinnern kann - einen Phaselistener zu erstellen - ungefähr so:
Java:
public class MyPhaseListener implements PhaseListener {
public void afterPhase(PhaseEvent arg0) {
final FacesContext facescontext = arg0.getFacesContext();
if (facescontext.getViewRoot() == null) {
createViewRoot(facescontext, "/pages/loginPage.jsp");
}
}
public void beforePhase(PhaseEvent arg0) {
// nothing to do
}
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
private void createViewRoot(FacesContext context, String viewId) {
UIViewRoot view = context.getApplication().getViewHandler().createView(
context, viewId);
context.setViewRoot(view);
}
Programmatisch die Seite neu erstellen - aber ist schon ein wenig her d.h. musst du ein wenig probieren.
also ich habe beide von JimPanse vorgeschlagenen Wege ausprobiert und es hilft auch tatsächlich wenn ich mich auf der Loginseite befinde und diese längere Zeit ruhen lasse und so die Session abläuft.
Wenn ich mich aber irgendwo anders in meiner Anwendung befinde, und dann die Session abläuft, dann bleibt das Problem bestehen.