Adakah yang bisa menjelaskan bagaimana kita dapat menggunakan cuplikan ini secara umum, atau di dunia nyata?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
Adakah yang bisa menjelaskan bagaimana kita dapat menggunakan cuplikan ini secara umum, atau di dunia nyata?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
Jawaban:
The <f:viewParam>
mengelola pengaturan, konversi dan validasi parameter GET. Ini seperti <h:inputText>
, tetapi kemudian untuk parameter GET.
Contoh berikut
<f:metadata>
<f:viewParam name="id" value="#{bean.id}" />
</f:metadata>
pada dasarnya melakukan hal berikut:
id
.required
, validator
dan converter
atribut dan sarang a <f:converter>
dan <f:validator>
di dalamnya seperti dengan <h:inputText>
)#{bean.id}
nilai, atau jika value
atribut tidak ada, maka tetapkan sebagai permintaan, tertera nama id
sehingga tersedia #{id}
dalam tampilan.Jadi ketika Anda membuka halaman foo.xhtml?id=10
saat nilai parameter 10
diatur dalam kacang dengan cara ini, tepat sebelum tampilan diberikan.
Mengenai validasi, contoh berikut ini mengatur param ke required="true"
dan memungkinkan hanya nilai antara 10 dan 20. Setiap kegagalan validasi akan menghasilkan pesan yang ditampilkan.
<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" />
Anda dapat menggunakan <f:viewAction>
ini untuk ini.
<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" />
dengan
public void onload() {
// ...
}
The <f:viewAction>
namun baru sejak JSF 2.2 (yang <f:viewParam>
sudah ada sejak JSF 2.0). Jika Anda tidak dapat meningkatkan, maka taruhan terbaik Anda adalah menggunakan <f:event>
.
<f:event type="preRenderView" listener="#{bean.onload}" />
Namun ini diminta pada setiap permintaan. Anda perlu memeriksa secara eksplisit apakah permintaan tersebut bukan postback:
public void onload() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// ...
}
}
Saat Anda ingin melewatkan kasus "Konversi / Validasi gagal" juga, lakukan sebagai berikut:
public void onload() {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
// ...
}
}
Menggunakan <f:event>
cara ini pada dasarnya adalah solusi / peretasan, itulah sebabnya <f:viewAction>
diperkenalkan di JSF 2.2.
Anda dapat "melewati" parameter tampilan di tautan navigasi dengan menyetel includeViewParams
atribut ke true
atau dengan menambahkan includeViewParams=true
parameter permintaan.
<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">
yang menghasilkan dengan <f:metadata>
contoh di atas pada dasarnya tautan berikut
<a href="next.xhtml?id=10">
dengan nilai parameter asli.
Pendekatan ini hanya membutuhkan bahwa next.xhtml
memiliki juga sebuah <f:viewParam>
pada parameter yang sama, jika tidak maka tidak akan melewati.
The <f:viewParam>
juga dapat digunakan dalam kombinasi dengan "plain HTML" bentuk GET.
<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>
Pada dasarnya @RequestScoped
kacang ini :
private String query;
private List<Result> results;
public void search() {
results = service.search(query);
}
Perhatikan bahwa <h:message>
ini untuk <f:viewParam>
, bukan HTML biasa <input type="text">
! Perhatikan juga bahwa nilai input ditampilkan #{param.query}
ketika #{bean.query}
kosong, karena nilai yang dikirimkan tidak akan muncul sama sekali ketika ada kesalahan validasi atau konversi. Harap dicatat bahwa konstruk ini tidak valid untuk komponen input JSF (sudah melakukan itu "di bawah penutup").