妄想その3
妄想の3.こっから普通にこんな機能がないと困る的なものを紹介。
まあ近代的なフレームワークであれば、意外とどれも同じようなのありそうだけど、まあいいや。
繰り返し項目で、繰り返し内のどのボタンが押されたのか知りたい場合ってのは結構あります。
というわけで地味だけど重要なそんな機能です。
まずはjsp。肝はForEach内で展開されるサブミットボタンのname属性のところ。
展開されると、hoge[${s.index}]→hoge[0]とかそんな感じになる。
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" errorPage="/error/debug.jsp"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!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> <form method="post" action="/t2-samples/foreach"> <c:forEach var="e" items="${hogeList}" varStatus="s"> <input type="submit" name="hoge[${s.index}]" value="${e}"/> <br /> </c:forEach> <span>${message}</span> </form> </body> </html>
これを受け取る。
@RequestScope @Page("foreach") public class ForeachPage { @Default public Navigation index(Context context) { List<String> hogeList = CollectionsUtil.newArrayList(); { hogeList.add("aaa"); hogeList.add("bbb"); hogeList.add("ccc"); } context.getRequest().setAttribute("hogeList", hogeList); return Forward.to("/jsp/foreach.jsp"); } @POST @ActionParam("hoge[{index}]") public Navigation hoge(@Index String id, Context context) { if (id == null) { throw new NullPointerException("can't be null."); } final Integer i = Integer.valueOf(id); context.getRequest().setAttribute("message", "button : " + String.valueOf(i.intValue() + 1) + " submitted."); return Forward.to("jsp/foreach.jsp"); } }
ポイントは、
- @ActionParamで{}で簡単な式を表現できるようにしている点。ここではindexを値として指定。式は全く難しいことができないようにしてる。
- @IndexでForEach内のインデックスがあればそれを扱う。
これで、Index値を受け取れる。いまんとこ面倒くさくてStringだけにしてるけど、いずれ普通に型変換するつもり。
jspのforEach内の記述(hoge[${s.index}])はカスタムのタグリブにして隠蔽しちゃったほうがいいかもしれないなあ。