webentwicklung-frage-antwort-db.com.de

Wofür können <f: metadata>, <f: viewParam> und <f: viewAction> verwendet werden?

Kann jemand klarstellen, wie wir dieses Snippet im Allgemeinen oder in der Praxis verwenden können?

<f:metadata>
    <f:viewParam id="id" value="#{bean.id}" />
    <f:viewAction action="#{bean.init}" />
</f:metadata>
142
Hanynowsky

GET-Parameter verarbeiten

Das <f:viewParam> verwaltet die Einstellung, Konvertierung und Validierung von GET-Parametern. Es ist wie das <h:inputText>, Aber dann für GET-Parameter.

Das folgende Beispiel

<f:metadata>
    <f:viewParam name="id" value="#{bean.id}" />
</f:metadata>

macht im Grunde folgendes:

  • Ruft den Wert des Anforderungsparameters mit dem Namen id ab.
  • Konvertieren und validieren Sie es bei Bedarf (Sie können die Attribute required, validator und converter verwenden und darin wie folgt einen <f:converter> Und <f:validator> Verschachteln wie bei <h:inputText>)
  • Wenn die Konvertierung und Validierung erfolgreich ist, legen Sie sie als Bean-Eigenschaft fest, die durch den Wert #{bean.id} Dargestellt wird, oder wenn das Attribut value fehlt, legen Sie sie als Anforderungsattribut für den Namen id fest. so dass es durch #{id} in der Ansicht verfügbar ist.

Wenn Sie die Seite also als foo.xhtml?id=10 Öffnen, wird der Parameterwert 10 Auf diese Weise in der Bean festgelegt, unmittelbar bevor die Ansicht gerendert wird.

Im folgenden Beispiel wird der Parameter auf required="true" Gesetzt und es sind nur Werte zwischen 10 und 20 zulässig. Wenn die Validierung fehlschlägt, wird eine Meldung angezeigt.

<f:metadata>
    <f:viewParam id="id" name="id" value="#{bean.id}" required="true">
        <f:validateLongRange minimum="10" maximum="20" />
    </f:viewParam>
</f:metadata>
<h:message for="id" />

Geschäftsaktion für GET-Parameter ausführen

Sie können hierfür das <f:viewAction> verwenden.

<f:metadata>
    <f:viewParam id="id" name="id" value="#{bean.id}" required="true">
        <f:validateLongRange minimum="10" maximum="20" />
    </f:viewParam>
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
<h:message for="id" />

mit

public void onload() {
    // ...
}

Der <f:viewAction> Ist jedoch neu seit JSF 2.2 (der <f:viewParam> Existiert bereits seit JSF 2.0). Wenn Sie kein Upgrade durchführen können, verwenden Sie am besten <f:event> .

<f:event type="preRenderView" listener="#{bean.onload}" />

Dies wird jedoch auf every Anfrage aufgerufen. Sie müssen explizit prüfen, ob die Anfrage kein Postback ist:

public void onload() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
    }
}

Wenn Sie auch die Fälle "Konvertierung/Validierung fehlgeschlagen" überspringen möchten, gehen Sie wie folgt vor:

public void onload() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
        // ...
    }
}

Die Verwendung von <f:event> Auf diese Weise ist im Wesentlichen ein Workaround/Hack. Deshalb wurde <f:viewAction> In JSF 2.2 eingeführt.


Ansichtsparameter an nächste Ansicht übergeben

Sie können die Ansichtsparameter in Navigationslinks "durchgehen", indem Sie das includeViewParams-Attribut auf true setzen oder den Anforderungsparameter includeViewParams=true Hinzufügen.

<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">

was mit dem obigen <f:metadata> Beispiel grundsätzlich den folgenden Link erzeugt

<a href="next.xhtml?id=10">

mit dem ursprünglichen Parameterwert.

Dieser Ansatz erfordert nur , dass next.xhtml auch einen <f:viewParam> Auf der rechten Seite hat Gleicher Parameter, sonst wird er nicht durchgereicht.


Verwenden Sie GET-Formulare in JSF

Das <f:viewParam> Kann auch in Kombination mit GET-Formularen mit "einfachem HTML" verwendet werden.

<f:metadata>
    <f:viewParam id="query" name="query" value="#{bean.query}" />
    <f:viewAction action="#{bean.search}" />
</f:metadata>
...
<form>
    <label for="query">Query</label>
    <input type="text" name="query" value="#{empty bean.query ? param.query : bean.query}" />
    <input type="submit" value="Search" />
    <h:message for="query" />
</form>
...
<h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}">
     ...
</h:dataTable>

Mit dieser @RequestScoped Bean:

private String query;
private List<Result> results;

public void search() {
    results = service.search(query);
}

Beachten Sie, dass <h:message> Für <f:viewParam> Steht, nicht für einfaches HTML <input type="text">! Beachten Sie auch, dass der Eingabewert #{param.query} Anzeigt, wenn #{bean.query} Leer ist, da der übermittelte Wert sonst bei einem Validierungs- oder Konvertierungsfehler überhaupt nicht angezeigt wird. Bitte beachten Sie, dass dieses Konstrukt für JSF-Eingabekomponenten ungültig ist (dies geschieht bereits "under the covers").


Siehe auch:

281
BalusC