Hi!
Ich habe hier eine neue JSF2.2App@Tomcat8.0. Gebaut mit Netbeans 8.1
**Das Problem kurz erklärt: **
Template mit Inserts für Left und Content.
Left: Enthält ein Formular, welches an eine Bean im SessionScope gebunden ist. Ein CommandButton gebunden an eine Action in der nichts passiert ausser return “”
Content: Ein OutputText, gebunden an eine RequestScopedBean, welche die o.g. SessionScopedBean, als ManagedProperty enthält. Es soll ein Property der SessionScopedBean angezeigt werden. Im PostConstruct der RequestScopedBean wir ein Property gesetzt, wenn der Eingegebene Text länger, als 10 ist. Wenn dieses Property true ist, dann soll der OutputText nicht gerendert werden.
Das Problem:
Eigentlich sollte nach betätigen des CommandButton die Action der SessionScopedBean ausgeführt werden und erst dann die PostConstruct der RequestScopedBean.
Im Fall von <h:outputText value="#{requestScopedBean.sessionBean.userName}" /> läuft das so korrekt ab.
Sobald <h:outputText value="#{requestScopedBean.sessionBean.userName}" rendered="#{requestScopedBean.showUserName2}" /> in der XHTML steht, dann wird die Reihenfolge umgedreht, sodass erst die PostConstruct und erst dann die Action aufgerufen wird. Das ist doof, da die Eingabe früher ausgewertet wird, als sie in der SessionScopedBean aktualisiert wurde.
Wo liegt das Problem? bzw. wie kann ich erzwingen, dass die Action der SessionScopedBean zuerst aufgerufen wird.
Der Code, als zip:
Die wichtigsten Sachen gekürzt hier
Content
[XML]<ui:composition template="./newTemplate.xhtml">
<ui:define name=“content”>
Username1: <h:outputText value="#{requestScopedBean.sessionBean.userName}" />
Username2: <h:outputText value="#{requestScopedBean.sessionBean.userName}" rendered="#{requestScopedBean.showUserName2}" />
</ui:define>
</ui:composition>[/XML]
requestScopedBean
public void init(){
if(sessionBean.getUserName().length() > 10){
showUserName2 = false;
}else{
showUserName2 = true;
}
}```
sessionScopedBean
```@ManagedBean
@SessionScoped
//@ApplicationScoped
public class SessionScopedBean {
private String userName = "";
public String action(){
return "";
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}```