ViewParam - @ManagedProperty (değer = “# {param.id}”)


97

Görünüm Parametrelerini bu şekilde tanımlamak arasındaki fark nedir:

<f:metadata>
  <f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>

Ve ManagedBean'deki mülkü şu şekilde tanımlamak:

@ManagedProperty(value = "#{param.id}")
private Integer id;

Yanıtlar:


144

<f:viewParam>:

  • Değeri yalnızca güncelleme modeli değerleri aşamasında ayarlar (genişlediğinden UIInput).

  • Ayar değeri sırasında mevcut değildir @PostConstruct, bu nedenle ayar değerlerine göre başlatma / ön yükleme yapmak için ek bir <f:event type="preRenderView" listener="#{bean.init}" /><f:metadata>kısma ihtiyacınız vardır . JSF 2.2'den beri <f:viewAction>bunun için kullanabilirsiniz .

  • Yuvalanmış <f:converter>ve <f:validator>daha ayrıntılı dönüştürme / doğrulama sağlar. Bir bile <h:message>eklenebilir.

  • Herhangi bir URL'de includeViewParamsözniteliği <h:link>veya includeViewParams=trueistek parametresi kullanılarak GET sorgu dizesi olarak dahil edilebilir .

  • Bir @RequestScopedfasulye üzerinde kullanılabilir , ancak @ViewScopedgörünüm parametrelerinin, görünümde bulunan formların neden olduğu herhangi bir doğrulama hatasından kurtulmasını istiyorsanız , fasulyenin olmasını gerektirir , aksi takdirde sonraki istekler için tüm istek parametrelerini <f:param>komutta manuel olarak saklamanız gerekir. bileşenleri.

Örnek :

<f:metadata>
    <f:viewParam id="user_id" name="id" value="#{bean.user}"
        required="true" requiredMessage="Invalid page access. Please use a link from within the system."
        converter="userConverter" converterMessage="Unknown user ID."
    />
</f:metadata>
<h:message for="user_id" />

ile

private User user;

ve bir @FacesConverter("userConverter"). Sayfayı http://example.com/context/user.xhtml?id=123 ile çağırmak , idparametreyi dönüştürücüden geçirecek ve Usernesneyi bir bean özelliği olarak ayarlayacaktır .


@ManagedProperty:

  • Fasulye yapımından hemen sonra değeri ayarlar.

  • Ayar değeri, ayar değerine @PostConstructbağlı olarak diğer özelliklerin kolay başlatılmasına / önceden yüklenmesine olanak tanıyan süre boyunca mevcuttur .

  • Görünümde bildirim temelli dönüştürme / doğrulamaya izin vermez.

  • Yönetilen özelliğine, #{param}istek kapsamından daha geniş kapsamı olan fasulyelerde izin verilmez, bu nedenle fasulyenin olması gerekir @RequestScoped.

  • Eğer bir yönetilen özelliğini itimat ederse #{param}sonraki POST istekleri mevcut olan, o zaman olarak eklemenize gerek <f:param>içinde UICommandbileşenlerin.

Örnek :

@ManagedProperty("#{param.id}")
private Long id;

private User user;

@EJB
private UserService userService;

@PostConstruct
public void init() {
    user = userService.find(id);
}

Ama ne zaman doğrulama kendini yönetmek zorunda userolduğu nullkurcalıyor tarafından FacesContext#addMessage()ya da bir şey.


Her ikisini birden ve zorunlu olduğunda da kullanabilirsiniz . Artık yalnızca ayrıntılı dönüştürme / doğrulama uygulayamayacaksınız.@PostConstructincludeViewParams


Ayrıca bakınız:


1
İstisnai durumlarda istek parametrelerini almak için başka alternatifler de vardır: FacesContext.getCurrentInstance (). GetExternalContext (). GetRequestParameterMap (). Get ("parametame");
angelcervera

1
@angel: Yalnızca bean, @ManagedPropertybir istek parametresini imkansız kılan , istek kapsamından daha geniş bir kapsama sahip olduğunda .
BalusC

merhaba @BalusC İkinci bir gönderide managedproperty kullanılarak param.id'den alınan id değerine güveniyorum. Bunu f: param kullanarak nasıl ekleyebilirim? çok teşekkürler
sys_debug

1
@thufir: Model değerlerini güncelleme aşamasında ayarlanır. Postconstruct bundan çok önce, fasulye yapımından ve bağımlılık enjeksiyonundan hemen sonra çalışır. Bu, tarafından <f:event type="preRenderView">veya gelecek JSF 2.2 tarafından çağrılan dinleyici yönteminde mevcuttur <f:viewAction>.
BalusC


6

2 diğer fark:

  • @ManagedPropertyCDI ( @Named) tarafından yönetilen çekirdeklerle değil, yalnızca JSF tarafından yönetilen çekirdeklerle kullanılabilir ;
    • <f:viewParam> yalnızca GET isteklerinin parametreleriyle çalışır.

1
Bu nedenle, ek açıklamayı kullanabilirsiniz: org.omnifaces.cdi.Param
dforce
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.