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.