<F: meta veriler>, <f: viewParam> ve <f: viewAction> ne için kullanılabilir?


149

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:


288

GET parametrelerini işle

<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:

  • İstek parametresi değerini ada göre alın id.
  • Dönüştürme ve validate gerekli (kullanabilirsiniz eğer required, validatorve converternitelikleri ve yuva bir<f:converter> ve <f:validator>olduğu gibi gibi o <h:inputText>)
  • Dönüştürme ve doğrulama başarılı #{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 10gö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" />

GET parametreleri üzerinde iş yapma

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ı.


Görünüm parametrelerini bir sonraki görünüme geçir

includeViewParamsÖzniteliği ayarlayarak trueveya includeViewParams=trueistek 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.xhtmlvardır ayrıca bir <f:viewParam>çok aynı parametre üzerinde aksi takdirde geçirilir edilmeyecektir.


JSF'de GET formlarını kullanma

<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 @RequestScopedfasulye 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).


Ayrıca bakınız:


@BalusC faces-redirect = true ile birlikte kullanıldığında "fasulye" nin kapsamı ne olmalıdır? Kapsam "@RequestScoped" olarak ayarlanmışsa beklendiği gibi çalışır mı?
Geek

@Geek: Yönlendirme yeni bir GET isteği oluşturur. Kaynak ve hedef fasulyenin fasulye kapsamı önemsizdir. Ancak, yeni bir GET isteğinin olası sonuçlarını dikkate almanız ve kapsam dahilindeki fasulyeyi görüntülemeniz gerekir. Ayrıca bkz. Stackoverflow.com/questions/7031885/…
BalusC

@BalusC "Bununla birlikte, bir istek için yeni bir GET isteğinin olası sonuçlarını dikkate almalı ve kapsamlı fasulyeyi görüntülemelisiniz."
Geek

@Geek: Kapsamları sona erecek ve başlayacakları için çöpe atılacak ve yeniden yaratılacaklar.
BalusC

@BalusC. Kapsamlı bir cevap. Msgstr "Her istekte çağrılmayan görünüm kapsamındaki fasulye için '@' PostConstruct benzeri bir özellik kullanmanız gerektiğinde, isteğin geri gönderme olup olmadığını kontrol edin". Her istekte çağrılmadıysa, isteğin neden bir geri gönderme olup olmadığını kontrol etmelisiniz?
Uluk Biy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.