妄想その2


昨日の続き。足し算。

やっぱメソッド呼ばれたやつがわかってほしいお年頃。

どれが呼ばれたのかわからないようじゃあ、苦しい感じでござるですよ。

というわけで@ActionParamとつけると、押されたボタンに対応するメソッドがよばれたりしたら素敵♪

これもAction統合型のPageモデル(勝手にそう名づけた)ならでは。

PageはあるURL以下にひもづいたActionの集合ってところ。



あと、やっぱバリデーションは千差万別だから中途半端にフレームワーク側でやるよりも

自前でやったほうがいいんじゃないかなあというのがオレの意見。というわけでバリデーションは自分で書きましょう。

何か使うのであれば、CommonsよりもOvalがお奨めです。


package examples.page;

@RequestScope
@Page("add")
public class AddPage {

	@Default
	public Navigation index(Context context) {
		return Redirect.to("jsp/add.jsp");
	}

	/**
	 * addボタンがPOSTで押されたときだけ呼ばれる
	 */
	@POST
	@ActionParam
	public Navigation add(Context context) {
		//Validationはここらでお好きにどうぞ。
		Request request = context.getRequest();
		Integer arg1 = Integer.valueOf(request.getParameter("arg1"));
		Integer arg2 = Integer.valueOf(request.getParameter("arg2"));
		request.setAttribute("arg1", arg1);
		request.setAttribute("arg2", arg2);
		request.setAttribute("result", new Integer(arg1.intValue()
				+ arg2.intValue()));
		return Forward.to("jsp/add.jsp");
	}

	/**
	 * addAndMoveボタンがPOSTで押されたときだけ呼ばれる
	 */
	@POST
	@ActionParam
	public Navigation addAndMove(Context context) {
		//Validationはここらでお好きにどうぞ。
		Request request = context.getRequest();
		Integer arg1 = Integer.valueOf(request.getParameter("arg1"));
		Integer arg2 = Integer.valueOf(request.getParameter("arg2"));
		request.setAttribute("result", new Integer(arg1.intValue()
				+ arg2.intValue()));
		return Forward.to("jsp/addResult.jsp");
	}

}
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" errorPage="/error/debug.jsp"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>足し算画面</title>
</head>
<body>
<!-- Functionは適当。 -->
<form action="${t:url('/add')}" method="post">
	<input type="text" name="arg1" />
	<br />
	<input type="text" name="arg2" />
	<br />
	<span>${result}</span><br />
	<!-- addを押したときはaddメソッドが呼ばれる -->
	<input type="submit" name="add" value="同一ページ"/>

	<!-- addAndMoveを押したときはaddAndMoveメソッドが呼ばれる -->
	<input type="submit" name="addAndMove" value="結果ページ"/>
</form>
</body>
</html>