- PR -

SpringMVCのAbstractWizardFormControllerでフォームのネスト?

1
投稿者投稿内容
yoshi
会議室デビュー日: 2004/03/09
投稿数: 6
お住まい・勤務地: 新橋
投稿日時: 2006-02-03 22:59
AbstractWizardFormControllerを使って入力フォームを作っています。入力させたい情報は、


  • 1ページ目:アカウント情報
  • 2ページ目:個人情報
  • 3ページ目:趣味情報(複数)
  • 4ページ目:確認
  • 5ページ目:終了画面


という感じでなのですが、この3ページ目の処理で少々困っています。

趣味情報を複数個(好きなだけ)追加できるように、入力フォームに追加ボタンをつけています。追加を押すと入力した情報を追加して、もう一度同じ画面(3ページ目)に戻り、どんどん追加していき、次へを押すと4ページ目に行くといったからくりを考えています。

今のところ下のようにcontrollerのonBind内で処理をしています。

コード:
// commandクラス
class ProfileCommand{
	
	....中略....
	
	ArrayList<Hobby> hobby;
	
	public ArrayList<Hobby> getHobby() {
		return hobby;
	}
	
	public void setHobby(ArrayList<Hobby> hobby) {
		this.hobby = hobby;
	}
	
	....中略....
	
}

// Hobbyクラス
class Hobby{
	
	....中略....
	
	String type;
	
	String comment;
	
	public String getType() {
		return type;
	}
	
	public void setType(String type) {
		this.type = type;
	}
	
	public String getComment() {
		return comment;
	}
	
	public void setComment(String comment) {
		this.comment = comment;
	}
	
	....中略....
	
}

// Controller
public class ProfileWizard extends AbstractWizardFormController {
	
	....中略....
	
	protected Object formBackingObject(HttpServletRequest request){
		ProfileCommand form = new ProfileCommand();
		form.setHobby(new ArrayList<Hobby>());
		return form;
	}
	
	protected void onBind(HttpServletRequest request,
			Object command,
			BindException exception) throws Exception {
		int current_page = this.getCurrentPage(request);
		int target_page = this.getTargetPage(request, current_page);
		
		if(current_page == 2 && target_page == 2){
			ProfileCommand form = (ProfileCommand)command;
			String type = request.getParameter("tmp_type");
			String comment = request.getParameter("tmp_comment");
			
			if(!type.equals("") && !comment.equals("")){
				Hobby hobby = new Hobby();
				hobby.setType(type);
				hobby.setComment(comment);
				form.getHobby().add(hobby);
			}else{
				exception.rejectValue("hobby", "", "error");
			}
		}
	}
	
	....中略....
	
}

// 3ページ目のjsp(<form>のみ)
<form method="post">
	<spring:bind path="form.hobby">
		type : <input type="text" name="tmp_type" value="" /><br/>
		comment : <input type="text" name="tmp_comment" value="" /><br/>
		<input type="submit" name="_target2" value="追加" /><br/><br/>
		<div style="color:#ff0000">${status.errorMessage}</div>
	</spring:bind>
	<ol>
		<c:forEach items="${form.hobby}" var="item">
			<li>
				type : ${item.type}<br />
				comment : ${item.comment}<br />
			</li>
		</c:forEach>
	</ol>
	
	<input type="submit" name="_target3" value="次へ" /><br />
	<input type="submit" name="_target1" value="戻る" />
</form>



しかしこれだとtypeやcommentに対して<spring:bind>が使えなかったり、onBindの中でValidationの処理をしないといけないなど、なんかすっきりしません。

どなたかもっとスッキリかける方法をご存知ないでしょうか?よろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)