SORU
11 EKİM 2010, PAZARTESİ


Eylem arasındaki farkları ve actionListener

action actionListener arasındaki fark nedir ve ne zaman action karşı actionListener kullanmalıyım?

CEVAP
11 EKİM 2010, PAZARTESİ


actionListener

Eğer isterseniz actionListener bir kanca varöncegerçek iş aksiyon idam, örneğin günlük ve/veya ayarlamak için ek bir özellik (<f:setPropertyActionListener>), ve/veya gerek erişim bileşeni olan çağrılan eylem (da mevcuttur ActionEvent bağımsız değişken). Yani, gerçek iş eylem çağrılan gelmeden oluşturma amaçlı tamamen.

actionListener yöntemi varsayılan olarak şu imza vardır:

import javax.faces.event.ActionEvent;
// ...

public void actionListener(ActionEvent event) {
    // ...
}

Ve, herhangi bir yöntem parantez olmadan şu şekilde bildirilmesi gerekiyordu

<h:commandXxx ... actionListener="#{bean.actionListener}" />

Geçemezsiniz unutmayınekEL 2.2 bağımsız değişkenleri. Ancak ActionEvent bağımsız tamamen özel ve bağımsız değişkeni geçirmeden belirterek(ler) geçersiz kılabilirsiniz. Aşağıdaki örnekler geçerli

<h:commandXxx ... actionListener="#{bean.methodWithoutArguments()}" />
<h:commandXxx ... actionListener="#{bean.methodWithOneArgument(arg1)}" />
<h:commandXxx ... actionListener="#{bean.methodWithTwoArguments(arg1, arg2)}" />
public void methodWithoutArguments() {}
public void methodWithOneArgument(Object arg1) {}
public void methodWithTwoArguments(Object arg1, Object arg2) {}

Argumentless yöntemi ifadede parantez önemini unutmayın. Eğer yok olsaydı, OLUMSUZLUK hala ActionEvent bağımsız değişken ile bir yöntem beklenir.

EL üstündesin 2.2 , ardından <f:actionListener binding> ile çok sayıda eylem dinleyicisi yöntemleri bildirebilirsiniz.

<h:commandXxx ... actionListener="#{bean.actionListener1}">
    <f:actionListener binding="#{bean.actionListener2()}" />
    <f:actionListener binding="#{bean.actionListener3()}" />
</h:commandXxx>
public void actionListener1(ActionEvent event) {}
public void actionListener2() {}
public void actionListener3() {}

binding öznitelik parantez önemini unutmayın. Eğer yok olsaydı, EL karışacak binding özniteliği varsayılan olarak çünkü javax.el.PropertyNotFoundException: Property 'actionListener1' not found on type com.example.Bean bir değer olarak yorumlandığını ifade, bir ifade yöntemi olarak atardı. EL 2.2 tarzı parantez ekleyerek şeffaf bir değer yöntemi bir ifade ifadeye döner. Ayrıca bir bakın.Ç. Why am I able to bind <f:actionListener> to an arbitrary method if it's not supported by JSF?


eylem

Eğer iş bir eylem yürütmek ve gerekirse navigasyon işlemek istiyorsanız action kullanın. action yöntem (böylece) navigasyon vaka olarak kullanılacak String sonuç (hedef görünümü) geri dönebilirsiniz. null void dönüş değeri aynı sayfaya geri dönün ve Geçerli Görünüm kapsamı hayatta kalsın. Dönüş değeri boş bir dize ya da aynı görünüm KİMLİĞİ de dönüş için aynı sayfa, ama yeniden görünüm kapsamı ve böylece yok herhangi bir etkin görünümü kapsamlı fasulye ve, eğer varsa, yeniden onları.

action yöntemi örneğin 64**, EL 2.2 argümanlar kullanan olanlar: herhangi bir geçerli olabilir

<h:commandLink value="submit" action="#{bean.edit(item)}" />

Bu yöntem ile:

public void edit(Item item) {
    // ...
}

Eylem yöntemi sadece bir dize döndürür, sonra da sadece action özniteliği tam olarak bir dize belirtebilirsiniz unutmayın. Bu nedenle, bu tamamen beceriksiz

<h:commandLink value="Go to next page" action="#{bean.goToNextpage}" />

Kodlanmış bir dize döndürüyor: bu anlamsız yöntemi ile

public String goToNextpage() {
    return "nextpage";
}

Bunun yerine, sadece doğrudan kodlanmış dize özniteliği

<h:commandLink value="Go to next page" action="nextpage" />

Lütfen bu da kötü bir tasarım gösteren not: YAZI navigasyonu. Bu kullanıcı ne de SEO dostu değildir. Bu When should I use h:outputLink instead of h:commandLink? olarak açıklanmıştır ve çözülmesi gerekiyor

<h:link value="Go to next page" outcome="nextpage" />

Çağırma sırası

actionListeners her zaman çağrılıröncegörünüm olarak ilan edilmiş ve bu bileşene bağlı olarak aynı sırada action. Bu yüzden, aşağıdaki örnek

<h:commandLink value="submit" actionListener="#{bean.listener1}" action="#{bean.submit}">
    <f:actionListener type="com.example.SomeActionListener" />
    <f:actionListener binding="#{bean.listener2()}" />
    <f:setPropertyActionListener target="#{bean.property}" value="some" />
</h:commandLink>

bu sıradaBean#listener1(), SomeActionListener#processAction(), Bean#listener2(), Bean#setProperty() ve Bean#submit() çağırır.


Özel durum işleme

actionListener özel bir istisna destekler: AbortProcessingException. Eğer bu durum actionListener bir yöntem atılır, sonra AKSARAY kalan eylem dinleyici ve eylem yöntemi atlayın ve doğrudan yanıt oluşturmak için devam edecek. Ancak oturum AKSARAY özel sayfa/bir hata Göremezsiniz. Bu da dolaylı olarak başka bir istisna actionListener bir yerden atılan her yapılacak. Eğer iş bir istisna olarak bir hata sayfası ile sayfayı engellemek istiyorsanız, o zaman kesinlikle action yöntemi işi gerçekleştirmek gerekir.

Eğer actionListener kullanmak için tek nedeni void yöntem aynı sayfaya dönüyor olması ise, o zaman bu kötü oldu. action yöntemleri mükemmel ayrıca bazı IDEs EL doğrulama ile inanmak ne aksine void, dönüş. PrimeFaces showcase örnekler her yerde actionListeners bu tür ile doludur unutmayın. Bu gerçekten yanlış. Ayrıca kendine bunu yapmak için bir bahane olarak kullanmayın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bucky Roberts

    Bucky Robert

    9 HAZİRAN 2011
  • CZTUTORIALS

    CZTUTORIALS

    28 Ocak 2011
  • HowtoDrawAndPaint

    HowtoDrawAnd

    24 EKİM 2010