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吹きプログラマの黙示録