Seam – Component Driven Events

Seam Component Event

Seam Component Event

Seam içerisinde bazı tetikleyici mekanizmalar vardır. Bunlardan biridi Seam componentleri içerisinde tanımlanan event mekanizmalarıdır. Bunların yaptığı iş belirli çağırımlarda eventleri tetiklemektir. Bu eventler observer tanımları ile belirlenir.

 

Örnek verecek olursak aşağıda bir observer tanımı bulunmakta

    @Observer("sonDurum")
    public void sonDurum() {
     System.out.println("son durum kontrolu…");
    }


peki bu observer tanımı ne zaman tetiklenecek ? Bunun için bir kaç yöntem var. Örneğin aşağıdaki işlem içerisinde sonDurum un tetiklenmesini istiyorum.

    public void kaydet()
    {
     System.out.println("kaydet");
     Events.instance().raiseEvent("sonDurum");
    }

Bunun haricinde daha kullanışlı bir yöntem olan annotation tanımları kullanılabilir. Bu durumda raiseevent annotation ı kullanılabilir.

    @RaiseEvent("sonDurum")
    public void kaydet(){
     System.out.println("kaydet");
    }

Observer tanımı event tetiklemesi için bir kaç yerde aynı isimde tanımlanabilir. Bu durumda bir kaç event sırayla tetiklenmiş olur. Bunun haricinde observer metodlarına aşağıdaki şekilde parametre gönderimi de yapabilirsiniz.

parametre gönderimi

    public void kaydet(){
     …
     Events.instance().raiseEvent("sonDurum",kullaniciNesnesi);
    }

parametre alımı da aşağıdaki gibi olmalı

    @Observer("sonDurum")
    public void sonDurum(Kullanici kullanici) {
     System.out.println("son durum kontrolu… " + kullanici.getAd());
    }

Bir başka tanım şeklinde olarak eventleri components.xml içerisine aşağıdaki şekilde de tanımlıyor olabilirsiniz.

    <event type="sonDurum">
     <action execute="#{demoBean.sonDurum}" />
    </event>

Son olarak Seam içerisinde kullanabileceğiniz halihazırda event çağırımları vardır. Bu çağırımları observer tanımı şeklinde kullandığınızda halihazırdaki eventlere erişebilirsiniz.

Event listesi ve örnek kullanım aşağıdaki gibidir.

    @Observer("org.jboss.seam.security.postAuthenticate")
    public void kullaniciGirisYapti() {
     System.out.println("kullanici giris yapti diger kontrolleri yap…");
    }

Security events

 org.jboss.seam.security.initCredentials
 org.jboss.seam.security.credentialsUpdated
 org.jboss.seam.security.loginSuccessful
 org.jboss.seam.security.loginFailed
 org.jboss.seam.security.notLoggedIn
 org.jboss.seam.security.notAuthorized
 org.jboss.seam.security.preAuthenticate
 org.jboss.seam.security.postAuthenticate
 org.jboss.seam.security.loggedOut
 org.jboss.seam.security.alreadyLoggedIn
 org.jboss.seam.security.quietLogin
 org.jboss.seam.notLoggedIn

Diğer Eventler

 org.jboss.seam.validationFailed
 org.jboss.seam.transaction.transactionFailed
 org.jboss.seam.localeSelected.
 org.jboss.seam.timeZoneSelected
 org.jboss.seam.afterPhase
 org.jboss.seam.beforePhase
 org.jboss.seam.preDestroyContext.
 org.jboss.seam.postCreate.
 org.jboss.seam.endConversation
 org.jboss.seam.beginConversation
 org.jboss.seam.conversationDestroyed
 org.jboss.seam.conversationTimeout
 org.jboss.seam.noConversation

Jul 25th, 2011
  1. Oğuzcan
    Jul 26th, 2011 at 10:10 | #1

    Parametre alımında örnekte, run time’da NullPoaintException hatası vermez mi ? Çünkü kullanıcı değişkenin Insatance ‘i yok ? Kullanıcı sınfı Session veya Conversation Scope’da mıdır ?
    @In veya @Inject ile Kullanici kullanici bean’e inject etmek gerekmez mi ?

  2. Jul 26th, 2011 at 10:16 | #2

    Burada kullanici nesnesinin var oldugunu dusunuyoruz örnegin metod icerisinde yakalaniyor. O kadar detay yazmayim dedim.

  3. Koray
    Jul 26th, 2011 at 10:22 | #3

    @Oğuzcan
    Seam’de BijectionInterceptor, EventIntercepter’dan önce çağırıldığı için , önce event raise edilir, ardından injection yapılır. O yüzden kullanıcı değişkenin değeri null olur.

    Bildiğim kadarı ile , @RaiseEvent ile parametre gönderilemiyor, bunun için Events.instance().raiseEvent(“sonDurum”, parameterler); şeklinde parametre göndermeniz gerekir.

  4. Jul 26th, 2011 at 17:52 | #4

    raiseEvent ikinci parametre olarak object tipinde varargs aliyor bu sekilde gonderilebiliyor. Ben System.out.println seklinde yazmisim duzelttim.

  5. Jul 26th, 2011 at 19:11 | #5

    Bu arada raiseEvent ile birlikte parametreyi gonderdigimizden injection icin bir sorun yok bunun disinda nesne asagidaki gibi de alinabilir.

    Kullanici kullaniciNesnesi= (Kullanici) Component.getInstance(“kullaniciNesnesi”);

  6. Selman
    Jul 31st, 2011 at 00:15 | #6

    Faydalı oldu . Teşekkür ettik

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>