Herkes bu pasajı genel olarak veya gerçek dünya örneğinde nasıl kullanabileceğimizi açıklığa kavuşturabilir mi?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
Herkes bu pasajı genel olarak veya gerçek dünya örneğinde nasıl kullanabileceğimizi açıklığa kavuşturabilir mi?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
Yanıtlar:
<f:viewParam>
GET parametrelerinin ayarı, dönüşüm ve doğrulama yönetir. Bu gibi <h:inputText>
, ama sonra GET parametreleri için.
Aşağıdaki örnek
<f:metadata>
<f:viewParam name="id" value="#{bean.id}" />
</f:metadata>
temel olarak aşağıdakileri yapar:
id
.required
, validator
ve converter
nitelikleri ve yuva bir<f:converter>
ve <f:validator>
olduğu gibi gibi o <h:inputText>
)#{bean.id}
olursa, değeri temsil eden bir fasulye özelliği olarak ayarlayın veya value
özellik yoksa, adda istek niteliği olarak ayarlayınid
bu tarafından kullanılabilir, böylece #{id}
görünümünde.Sayfayı şu şekilde açtığınızda: foo.xhtml?id=10
parametre değeri 10
görünüm oluşturulmadan hemen önce bu şekilde ayarlanır.
Doğrulama ile ilgili olarak, aşağıdaki örnek parametreyi ayarlar required="true"
ve yalnızca 10 ile 20 arasındaki değerlere izin verir. Herhangi bir doğrulama hatası bir mesajın görüntülenmesine neden olur.
<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" />
Bunun için kullanabilirsiniz <f:viewAction>
.
<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" />
ile
public void onload() {
// ...
}
<f:viewAction>
JSF 2.2 (çünkü ancak yenidir <f:viewParam>
zaten JSF 2.0 beri var). Yükseltme yapamıyorsanız, <f:event>
bunun yerine en iyi bahisiniz kullanılır .
<f:event type="preRenderView" listener="#{bean.onload}" />
Ancak bu, her istek üzerine çağrılmaktadır . İsteğin geri gönderme olup olmadığını açıkça kontrol etmeniz gerekir:
public void onload() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// ...
}
}
"Dönüşüm / Doğrulama başarısız oldu" durumlarını da atlamak istediğinizde şu işlemleri yapın:
public void onload() {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
// ...
}
}
<f:event>
Bu şekilde kullanmak özünde bir geçici çözüm / kesmek, bu yüzden <f:viewAction>
JSF 2.2'de tanıtıldı.
includeViewParams
Özniteliği ayarlayarak true
veya includeViewParams=true
istek parametresi ekleyerek , gezinme bağlantılarındaki görünüm parametrelerini "geçebilirsiniz" .
<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">
Bu, yukarıdaki <f:metadata>
örnekle temel olarak aşağıdaki bağlantıyı oluşturur:
<a href="next.xhtml?id=10">
orijinal parametre değeri ile.
Bu yaklaşım, sadece gerektirir o next.xhtml
vardır ayrıca bir <f:viewParam>
çok aynı parametre üzerinde aksi takdirde geçirilir edilmeyecektir.
<f:viewParam>
Ayrıca "düz HTML" GET formlarıyla birlikte kullanılabilir.
<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>
Temelde bu @RequestScoped
fasulye ile:
private String query;
private List<Result> results;
public void search() {
results = service.search(query);
}
Düz HTML <h:message>
için <f:viewParam>
değil, olduğunu unutmayın <input type="text">
! Ayrıca , bir değerleme veya dönüştürme hatası olduğunda gönderilen değer aksi halde görünmeyeceğinden , giriş değerinin boş #{param.query}
olduğunda görüntülendiğine dikkat edin #{bean.query}
. Lütfen bu yapının JSF giriş bileşenleri için geçersiz olduğunu unutmayın (bunu "kapakların altında" zaten yapıyor).