個人的には Wicket 使う時は短かく書けるとかを気にするよりしっかり書いた方が後々楽だと思う


http://d.hatena.ne.jp/t_yano/20090203/1233690077
世界のやんやんに Wicket で意見を言うなんて恐縮しすぎちゃうんだけど
この書き方だとバリデーションとか増えて来ると途端に訳がわからなくなってくる気がする

add(new Form<TestPage>("testForm", new CompoundPropertyModel<TestPage>(
		this)) {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	{
		// フォームにコンポーネントを追加
		add(new TextField<Integer>("age"));
		add(new TextField<String>("name"));
		final TextField<String> addressTextField = new TextField<String>(
				"address");
		final TextField<String> tellTextField = new TextField<String>(
				"tel");
		add(addressTextField);
		add(tellTextField);
		add(new AbstractFormValidator() {

			/**
			 * 
			 */
			private static final long serialVersionUID = 2431917058763253555L;

			public FormComponent<?>[] getDependentFormComponents() {
				return new FormComponent<?>[] { addressTextField,
						tellTextField };
			}

			public void validate(Form<?> form) {
				if (Strings.isEmpty(addressTextField.getInput())
						&& Strings.isEmpty(tellTextField.getInput())) {
					error(addressTextField, "addressAndTellIsEmpty");
				}

			}
		});
	}

	@Override
	protected void onSubmit() {
		// doSomething...
	}
});


submit 内でバリデーションするとかは バリデーション前の値がモデルに入っちゃうし、
そもそも Component#error はリソースすら見ない駄目な子なので論外という事で……

public TestPage(boolean test) {
	add(new TestForm<TestPage>("testForm",new CompoundPropertyModel<TestPage>(this)));
}

class TestForm<T> extends Form<T> {

	private TextField<Integer> ageTextField = new TextField<Integer>("age");
	private TextField<String> nameTextField = new TextField<String>("name");
	private TextField<String> addressTextField = new TextField<String>("address");
	private TextField<String> tellTextField = new TextField<String>("tel");

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public TestForm(String id, IModel<T> model) {
		super(id, model);
		add(ageTextField);
		add(nameTextField);
		add(addressTextField);
		add(tellTextField.setRequired(true));
		add(new RequiredValidator(addressTextField,tellTextField));
	}
}
class RequiredValidator extends AbstractFormValidator{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private final FormComponent<?>[] formComponents;
	/**
	 * 
	 */
	public RequiredValidator(FormComponent<?>... formComponents) {
		this.formComponents = formComponents;
	}

	public FormComponent<?>[] getDependentFormComponents() {
		return formComponents;
	}

	public void validate(Form<?> form) {
		for(FormComponent<?> formComponent : formComponents){
			if(!Strings.isEmpty(formComponent.getInput())){
				return;
			}
		}
		error(formComponents[0],"requireError");
	}
	
}

この方が見通しも良いと個人的には思うし、
RequiredValidator とかも再利用しやすいしいいかなぁと……
実は今、前者のパターンでコーディングしちゃってた物にバリデーション追加してるんだけど、
書き直しが多すぎて泣きそうになってて、後者な書き方しておけばよかったなぁと
自戒も含めてたりするのです><


もちろん。やんやん(id:t_yano)は
「こういう書き方もアリだよ!」
的に書いてるのは重々承知してるんだけど、
今のやんやんの立場的に
Wicket ではこう書け!」
と思っちゃう人もいるかなぁと思って書いてみました!!