Kann jemand klarstellen, wie wir dieses Snippet im Allgemeinen oder als Beispiel aus der Praxis verwenden können?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
Kann jemand klarstellen, wie wir dieses Snippet im Allgemeinen oder als Beispiel aus der Praxis verwenden können?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
Antworten:
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 das Folgende:
id
.required
, validator
und converter
Attribute und Nest ein <f:converter>
und <f:validator>
in ihm wie wie mit <h:inputText>
)#{bean.id}
Wert dargestellt wird, oder wenn das value
Attribut fehlt, legen Sie sie als Anforderungsattribut für den Namen fest, id
damit sie #{id}
in der Ansicht verfügbar ist .Wenn Sie also die Seite so öffnen, wird der foo.xhtml?id=10
Parameterwert auf 10
diese Weise in der Bean festgelegt, unmittelbar bevor die Ansicht gerendert wird.
In Bezug auf die Validierung setzt der folgende Beispiel den Parameter auf required="true"
und lässt nur Werte zwischen 10 und 20 zu. Jeder Validierungsfehler führt dazu, dass eine Meldung angezeigt wird.
<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 das <f:viewAction>
dafür 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() {
// ...
}
Das <f:viewAction>
ist jedoch neu seit JSF 2.2 (das <f:viewParam>
existiert bereits seit JSF 2.0). Wenn Sie kein Upgrade durchführen können, verwenden Sie <f:event>
stattdessen am besten .
<f:event type="preRenderView" listener="#{bean.onload}" />
Dies wird jedoch bei jeder Anfrage aufgerufen . Sie müssen explizit prüfen, ob die Anfrage kein Postback ist:
public void onload() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// ...
}
}
Wenn Sie auch 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 <f:event>
dieser Methode ist im Wesentlichen eine Problemumgehung / ein Hack. Genau deshalb <f:viewAction>
wurde sie in JSF 2.2 eingeführt.
Sie können die Ansichtsparameter in Navigationslinks "durchlaufen", indem Sie ein includeViewParams
Attribut festlegen true
oder einen includeViewParams=true
Anforderungsparameter hinzufügen .
<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">
Das erzeugt mit dem obigen <f:metadata>
Beispiel im Grunde den folgenden Link
<a href="next.xhtml?id=10">
mit dem ursprünglichen Parameterwert.
Dieser Ansatz erfordert nur , dass next.xhtml
sich auch ein <f:viewParam>
auf demselben Parameter befindet, andernfalls wird er nicht durchlaufen.
Das <f:viewParam>
kann auch in Kombination mit "einfachen HTML" GET-Formularen 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 im Grunde dieser @RequestScoped
Bohne:
private String query;
private List<Result> results;
public void search() {
results = service.search(query);
}
Beachten Sie, dass das <h:message>
für das <f:viewParam>
, nicht das einfache HTML ist <input type="text">
! Beachten Sie auch, dass der Eingabewert angezeigt wird, #{param.query}
wenn er #{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 "unter dem Deckmantel").