Wicket で 処理ぶっとばして 他のページに遷移したい時の処理がキモイ
if(isDirect){ throw new RestartResponseException(new TestPage(obj)); }
みたいな方法しか無いのかなぁ……
if(isDirect){ this.setResponsePage(new TestPage(obj)); return; }
if(isDirect){ this.getRequestCycle().setResponsePage(new TestPage(obj)); return; }
とかやっても HTML は読みこんじゃってコンポネントが登録されてねーぜって言われちゃうし><
「違うんです!!正常な動作なんです!!」って思いながら
Exception throw するのがなんかキモイ……
-
- -
追記
/** * */ package org.yoshiori.wicket.test; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.request.target.component.listener.RedirectPageRequestTarget; /** * @author yoshiori * */ public class TestPage extends WebPage { /** * */ public TestPage() { this(false); } public TestPage(boolean isDirect) { if(isDirect){ this.getRequestCycle().setRequestTarget(new RedirectPageRequestTarget(new TestPage(false))); return; } this.add(new Link("link"){ /** * */ private static final long serialVersionUID = -193933159271936353L; @Override public void onClick() { setResponsePage(new TestPage(true)); }}); } }
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/" lang="ja" xml:lang="ja" dir="ltr"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <meta http-equiv="content-style-type" content="text/css"/> </head> test <body> <a wicket:id="link">link</a> </body> </html>
-
- -
さらに追記
id:t_yano(世界のやんやん)と話して理解した
/** * */ package org.yoshiori.wicket.test; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.request.target.component.listener.RedirectPageRequestTarget; /** * @author yoshiori * */ public class TestPage extends WebPage { /** * */ public TestPage() { this(false); } public TestPage(final boolean isDirect) { System.out.println("new TestPage(" + isDirect+");"); if (isDirect) { System.out.println("start this.getRequestCycle().setRequestTarget(new RedirectPageRequestTarget(new TestPage(false)));"); this.getRequestCycle().setRequestTarget( new RedirectPageRequestTarget(new TestPage(false))); System.out.println("end this.getRequestCycle().setRequestTarget(new RedirectPageRequestTarget(new TestPage(false)));"); return; } this.add(new Link("link") { /** * */ private static final long serialVersionUID = -193933159271936353L; @Override public void onClick() { System.out.println("start setRequestTarget(new TestPage(true));"); setResponsePage(new TestPage(true)); System.out.println("end setRequestTarget(new TestPage(true));"); } }); } }
で
new TestPage(false); start setRequestTarget(new TestPage(true)); new TestPage(true); start this.getRequestCycle().setRequestTarget(new RedirectPageRequestTarget(new TestPage(false))); new TestPage(false); end this.getRequestCycle().setRequestTarget(new RedirectPageRequestTarget(new TestPage(false))); end setRequestTarget(new TestPage(true));
つまりコンストラクタでリダイレクト指定してるんだけど、その後にsetRequestTargetされちゃってるから。