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>
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:
id
ab.required
, validator
und converter
verwenden und darin wie folgt einen <f:converter>
Und <f:validator>
Verschachteln wie bei <h:inputText>
)#{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" />
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.
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.
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").