Wicket – AbstractEvent Update | wicket praxis
Skip to content


Wicket – AbstractEvent Update

Wie ich bereits beschrieben habe, kann man mit Wicket relativ leicht eine lose Koppelung von Komponenten über einen Event-Mechanismus erreichen. Dabei wurden bisher nur Komponenten berücksichtigt. Manchmal ist es aber sinnvoll, die Behandlung dieser Events an einer zentralen Stelle durchzuführen. Daher habe ich die Basisklasse leicht erweitert. Dabei ist der Visitior in eine eigene Klasse gewandert. Außerdem ist es wesentlich geschickter, auch bei nicht Ajax-Requests mit Events zu arbeiten. Die Modifikation des EventListener-Interface trägt dem Rechnung.

 Java(TM) 2 Platform Standard Edition 5.0 | 
 
 copy code |
?

  1. package de.wicketpraxis.web.blog.pages.questions.events;
  2. public interface EventListenerInterface
  3. {
  4.   public void notifyEvent(AbstractEvent event);
  5. }

Die Methode lautet nun notifyEvent statt notifyAjaxEvent.

 Java(TM) 2 Platform Standard Edition 5.0 | 
 
 copy code |
?

  1. package de.wicketpraxis.web.blog.pages.questions.events;
  2. import org.apache.wicket.Component;
  3. import org.apache.wicket.Component.IVisitor;
  4. public class NotifyVisitor implements IVisitor<Component>
  5. {
  6.   private final AbstractEvent _event;
  7.   
  8.   public NotifyVisitor(final AbstractEvent event)
  9.   {
  10.     _event = event;
  11.   }
  12.   
  13.   public Object component(final Component component)
  14.   {
  15.     if (component instanceof EventListenerInterface)
  16.     {
  17.       ((EventListenerInterface) component).notifyEvent(_event);
  18.     }
  19.     return IVisitor.CONTINUE_TRAVERSAL;
  20.   }
  21. }

Der Event sucht jetzt nicht nur in allen Komponenten nach dem EventListenerInterface, sondern auch in der Application, der Session und der Page.

 Java(TM) 2 Platform Standard Edition 5.0 | 
 
 copy code |
?

  1. package de.wicketpraxis.web.blog.pages.questions.events;
  2. import org.apache.wicket.Application;
  3. import org.apache.wicket.Component;
  4. import org.apache.wicket.Page;
  5. import org.apache.wicket.Session;
  6. import org.apache.wicket.Component.IVisitor;
  7. import org.apache.wicket.ajax.AjaxRequestTarget;
  8. public class AbstractEvent
  9. {
  10.   private final Component _source;
  11.   protected final AjaxRequestTarget _target;
  12.   
  13.   public AbstractEvent(final Component source, AjaxRequestTarget target)
  14.   {
  15.     _source = source;
  16.     _target = target;
  17.   }
  18.   
  19.   public AbstractEvent(final Component source)
  20.   {
  21.     this(source,null);
  22.   }
  23.   
  24.   public Component getSource()
  25.   {
  26.     return _source;
  27.   }
  28.   
  29.   /**
  30.    * notify Application, Session, Page and Components
  31.    */
  32.   public final void fire()
  33.   {
  34.     Page page=getSource().getPage();
  35.     
  36.     Application application=page.getApplication();
  37.     if (application instanceof EventListenerInterface)
  38.     {
  39.       ((EventListenerInterface) application).notifyEvent(this);
  40.     }
  41.     Session session=page.getSession();
  42.     if (session instanceof EventListenerInterface)
  43.     {
  44.       ((EventListenerInterface) session).notifyEvent(this);
  45.     }
  46.     if (page instanceof EventListenerInterface)
  47.     {
  48.       ((EventListenerInterface) page).notifyEvent(this);
  49.     }
  50.     page.visitChildren(EventListenerInterface.class, getVisitor());
  51.     onAfterFire();
  52.   }
  53.   protected  void onAfterFire()
  54.   {
  55.     
  56.   }
  57.   protected IVisitor<Component> getVisitor()
  58.   {
  59.     return new NotifyVisitor(this);
  60.   }
  61.   public AjaxRequestTarget getTarget()
  62.   {
  63.     return _target;
  64.   }
  65.   
  66.   public boolean isAjax()
  67.   {
  68.     return _target!=null;
  69.   }
  70.   public final void update(Component component)
  71.   {
  72.     if (_target!=null)
  73.     {
  74.       _target.addComponent(component);
  75.     }
  76.   }
  77. }

Hinzugekommen ist außerdem die Funktion onAfterFire() die aufgerufen wird, sobald alle möglichen Listener benachrichtig wurden. An dieser Stelle könnte man dann Prüfungen einbauen, ob z.B. der Event überhaupt ein Ziel erreicht hat.

Ich glaube, dass diese Lösung zu offensichtlich war, so dass man sie leicht übersehen konnte.

Posted in Wicket.

Tagged with , , .


One Response

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

Continuing the Discussion

  1. Tweets die New blog post: Wicket - AbstractEvent Update erwähnt -- Topsy.com linked to this post on 11. April 2010

    […] Dieser Eintrag wurde auf Twitter von Michael Mosmann erwähnt. Michael Mosmann sagte: New blog post: Wicket – AbstractEvent Update http://www.wicket-praxis.de/blog/2010/04/09/wicket-abstractevent-update/ […]



Some HTML is OK

or, reply to this post via trackback.