Wicket stateless なページ

Wicket の基本は、ステートフルである。それでもステートレスのページが必要なケースも要件によっては発生するのが
Webアプリ開発の世界。

Form → StatelessForm
Link → StatelessLink か、 BookmarkablePageLink に置き換える

で済ませられれば良いが、Page の中で、

    boolean status = isPageStateless();

をチェックすると、AJAXコンポーネントやビヘビアでは false になってしまう。
wicketstuff-stateless が、これら AJAX におけるステートレス化を提供しているのでこれを使う。

現時点、バージョンが、Wicket本体より遅れてるみたいで、8.0.0-M2 なので、pom.xml は、

<dependency>
    <groupId>org.wicketstuff</groupId>
    <artifactId>wicketstuff-stateless</artifactId>
    <version>8.0.0-M2</version>
</dependency>

wicketstuff-stateless が提供するものは、
コンポーネントでは、、
StatelessAjaxEventBehavior
StatelessAjaxFormComponentUpdatingBehavior
StatelessAjaxFormSubmitBehavior
StatelessOnChangeAjaxBehavior

ビヘビアでは、
StatelessAjaxButton
StatelessAjaxFallbackLink
StatelessAjaxSubmitLink
StatelessIndicatingAjaxButton
StatelessIndicatingAjaxFallbackLink

例えば、、、

queue(new StatelessForm<Void>("form"));
queue(new Button("submit").add(new StatelessAjaxFormSubmitBehavior("click"){
   @Override
   protected void onSubmit(AjaxRequestTarget target){
      // TODO
   }
}));

ということだが、やはり、onSubmit は、Consumer ラムダ式にしたい。

ステートフルの時のように、、

queue(new Button("submit").add(AjaxFormSubmitBehavior.onSubmit("click", t->{
  // TODO
})));

と書きたい。。

しかたなく、StatelessAjaxFormSubmitBehavior を継承したクラスを用意して、、

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.util.lang.Args;
import org.danekja.java.util.function.serializable.SerializableConsumer;
import org.wicketstuff.stateless.behaviors.StatelessAjaxFormSubmitBehavior;

/**
 * CustomStatelessAjaxFormSubmitBehavior.
 */
public class CustomStatelessAjaxFormSubmitBehavior extends StatelessAjaxFormSubmitBehavior{

   public CustomStatelessAjaxFormSubmitBehavior(String event){
      super(event);
   }
   public static CustomStatelessAjaxFormSubmitBehavior onSubmit(String eventName, SerializableConsumer<AjaxRequestTarget> onSubmit){
      Args.notNull(onSubmit, "onSubmit");
      return new CustomStatelessAjaxFormSubmitBehavior(eventName){
         private static final long serialVersionUID = 1L;
         @Override
         protected void onSubmit(AjaxRequestTarget target)   {
            onSubmit.accept(target);
         }
      };
   }
}

ステートレスを保つように、、、以下にする。

queue(new Button("submit").add(CustomStatelessAjaxFormSubmitBehavior.onSubmit("click", t->{
  // TODO
})));

さらに、ステートレス、シリアライズ、Thowable ということであれば、、、
Serializable And Throwable Consumer - Oboe吹きプログラマの黙示録