Behandlung von Ansichtsparametern in JSF nach dem Posten

Ich habe ein paar Seiten, die eine Benutzer-ID benötigen, um zu arbeiten, daher der folgende Code:

userpage.xhtml

<code><!-- xmlns etc. omitted -->
<html>
<f:metadata>
    <f:viewParam name="userId" value="#{userPageController.userId}"/>
</f:metadata>
<f:view contentType="text/html">
<h:head>
</h:head>
<h:body>
    <h:form>
        <h:commandButton action="#{userPageController.doAction}" value="post"/>
    </h:form>
</h:body>
</f:view>
</code>

userPageController.java

<code>@Named
@ViewScoped
public class userPageControllerimplements Serializable {
    private static final long serialVersionUID = 1L;

    @Inject protected SessionController sessionController;
    @Inject private SecurityContext securityContext;
    @Inject protected UserDAO userDAO;

    protected User user;
    protected Long userId;

    public UserPage() {
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        if(!FacesContext.getCurrentInstance().isPostback()){
            User u = userDAO.find(userId);
            this.userId = userId;
            this.user = u;
        }
    }

    public void doAction(){

    }

}
</code>

Nach dem Aufruf von doAction wird der Ansichtsparameter in der URL jedoch ausgeblendet. Die Bohne funktioniert immer noch aufgrund ihres aussichtsreichen Charakters, aber sie ruiniert meine Versuche der zukünftigen Navigation. Wenn ich mich umsehe, habe ich den Eindruck, dass der Ansichtsparameter nach einem Beitrag verbleiben sollte, also userpage.jsf? UserId = 123, aber das ist nicht der Fall. Was ist eigentlich das beabsichtigte Verhalten?

Im Zusammenhang damit habe ich versucht, das automatische Hinzufügen von Ansichtsparametern zu implementieren, wenn ich zu einer anderen Seite navigiere, auf der ich die Benutzer-ID behalten möchte. Es scheint für andere zu funktionieren, aber für mich ist die Benutzer-ID im ViewRoot immer null. Code unten zum Abrufen des Ansichtsparameters verwendet (ich weiß, ich könnte meine temporär gespeicherte Benutzer-ID in der Bean für die Navigation verwenden, aber diese Lösung wäre viel ausgefallener):

<code>    String name = "userId";
    FacesContext ctx = FacesContext.getCurrentInstance();
    ViewDeclarationLanguage vdl = ctx.getApplication().getViewHandler().getViewDeclarationLanguage(ctx, viewId);
    ViewMetadata viewMetadata = vdl.getViewMetadata(ctx, viewId);
    UIViewRoot viewRoot = viewMetadata.createMetadataView(ctx);
    UIComponent metadataFacet = viewRoot.getFacet(UIViewRoot.METADATA_FACET_NAME);

    // Looking for a view parameter with the specified name
    UIViewParameter viewParam = null;
    for (UIComponent child : metadataFacet.getChildren()) {
        if (child instanceof UIViewParameter) {
            UIViewParameter tempViewParam = (UIViewParameter) child;
            if (name.equals(tempViewParam.getName())) {
                viewParam = tempViewParam;
                break;
            }
        }
    }

    if (viewParam == null) {
        throw new FacesException("Unknown parameter: '" + name + "' for view: " + viewId);
    }

    // Getting the value
    String value = viewParam.getStringValue(ctx);  // This seems to ALWAYS be null.
</code>

Ein letzter Gedanke ist, dass die Setter-Methoden immer noch zu funktionieren scheinen. SetUserId wird mit dem korrekten Wert für post aufgerufen.

Habe ich überhaupt nicht verstanden, wie Ansichtsparameter funktionieren, oder gibt es hier einen Fehler? Ich denke, mein Anwendungsfall sollte seinextrem gemeinsam und haben grundlegende Unterstützung im Rahmen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage