読者です 読者をやめる 読者になる 読者になる

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されちゃってるから。