F: viewAction / preRenderView ve PostConstruct ne zaman kullanılır?


97

Ek açıklamayı kullanmak yerine bir sayfa için verileri başlatmak için f:viewActionveya preRenderViewolayı ne zaman kullanılmalıdır @PostConstruct? Destek fasulyesinin kapsamının türüne bağlı olarak birini veya diğerini kullanmanın gerekçesi, örneğin, eğer destek fasulyesi ise @RequestScoped, görünümü oluşturmadan önce arka fasülyenizi başlatmak için kullanma f:viewActionveya preRenderViewüzerinde seçim @PostConstruct, ikisi gibi alakasız olur mu? aynı etkiye neden olur?

f: viewAction veya preRenderView

<f:metadata>
  <f:viewAction action="#{myBean.initialize}" />
</f:metadata>
<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>

veya

@Filmdenkare

public class MyBean
{
    @PostConstruct
    public void initialize()
    {

    }
}

Yanıtlar:


121

@PostConstruct açıklamasını kullanarak bir sayfa dizeleri için verileri başlatmak için f: viewAction veya preRenderView olayını ne zaman kullanmalısınız?

Kullanım <f:viewAction>HTML kılınmış önce bir yöntemi yürütmek istediğinizde. Bu, özellikle <f:viewParam>güncelleme modeli değerleri aşamasında tarafından ayarlanan model değerlerine dayalı eylemler gerçekleştirmek istiyorsanız yararlıdır . Yani, şu an koşularda mevcut değiller @PostConstruct. JSF 2.0 / 2.1'de bu etiket mevcut değildi ve preRenderViewgeçici çözümü kullanmanız gerekiyor .

Destek fasulyesi @RequestScoped ise, aynı şeyi etkili bir şekilde yapıyorlar mı? (ve böylece geliştiricinin seçimine kalmış mı? (@PostConstruct "daha temiz" görünüyor).

Hayır, kesinlikle aynı şeyi etkili bir şekilde yapmıyorlar. @PostConstructEylemleri gerçekleştirmek için intented olduğunu doğrudan fasulye inşaat ve tüm enjekte bağımlılıkları ayarı ve bu şekilde yönetilen özellikleri sonra @EJB, @Inject, @ManagedPropertyvb Yani, enjekte bağımlılıkları fasulye kurucu içinde kullanılamaz. Bu nedenle, bean görüntüleme, oturum veya uygulama kapsamlı olduğunda, görünüm, oturum veya uygulama başına yalnızca bir kez çalışacaktır. <f:viewAction>Sadece ilk GET isteği üzerine çağrılan varsayılan olarak, ancak aktarma yöntemiyle onPostback="true"özniteliği sıra geri gönderme istekleri çağrılır üzere yapılandırılabilir. preRenderViewOlay her HTTP isteği üzerine çağrılır (evet, bu da ajax istekler için de!).

Kullanımı özetlenmiştir @PostConstructsen enjekte bağımlılıkları ve tarafından belirlenir yönetilen özelliklerine eylemleri gerçekleştirmek istiyorsanız @EJB, @Inject, @ManagedPropertyfasulye yapımı sırasında, vb. Kullan <f:viewAction>eğer ayrıca belirlediği özelliklerine eylemleri gerçekleştirmek istiyoruz <f:viewParam>. Hala JSF 2.0 / 2.1 kullanıyorsanız, preRenderViewyerine kullanın <f:viewAction>. İşlemi yalnızca ilk istek üzerine FacesContext#isPostback()gerçekleştirmek için gerekirse bir kontrol ekleyebilirsiniz preRenderView.

Ayrıca bakınız:


Teşekkürler. Özür dilerim, cevabı yazarken orijinal sorumu düzenledim ...
BestPractices

Bean kapsamından bahsetmiştim çünkü @PostConstruct, fasulye SessionScoped ise (bean ilk oluşturulduğunda) yalnızca bir kez çağrılacaktı, ancak preRenderView sayfaya her erişildiğinde çağrılacaktı. Yoksa yanlış mı anladım?
BestPractices

Evet doğru. Ön işleme görünümü olayı, çağırma eylemi aşamasında çağrılır. Post yapısı fasulyenin yapımından sonra çağrılır. Her HTTP isteğinde oturum kapsamlı bir bean oluşturulmaz.
BalusC

Ajax istekleri sırasında yöntemimin çağrıldığını merak ediyordum. isPostBack () çağrısı günü kurtardı !!
jacosta

Eksiksizlik adına Omnifaces'tan@Param bahsetmeliyiz : "HTTP istek parametreleri için temelde benzer <f:viewParam>, ancak büyük farkla birlikte enjekte edilen parametrenin doğrudan kullanılabilir @PostConstructolması, bir <f:event type="preRenderView">veya <f:viewAction>içinde görünüm."
Jens Piegsa

1

Yönetilen fasulyenin özelliklerini başlatmanız mı gerekiyor? -> Ardından, @ PostConstruct kullanın Aksi takdirde, diğer görünümden aktarılan parametrelerle çalışmanız gerekir mi? -> Ardından " preRenderView " kullanın

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.