s:formタグのaction属性
s:fromタグはS2FormTagで実装されている。といってもこのクラスはStrutsのFormTagを継承しており、
lookupとrenderActionメソッドをオーバーライドすることで簡潔に機能を実現している。
ふーむ、こういう拡張がすんなりできること自体Strutsって優れていると思うな。
SAStrutsのチュートリアルforeachButton.jspは他の例とは異なり、唯一action属性が/で始まっていない。
<s:form method="post" action="submit/${f:u(m.id)}">
このaction属性をS2FormTagのrenderActionメソッドで料理している
HttpServletRequest request = (HttpServletRequest) pageContext .getRequest(); HttpServletResponse response = (HttpServletResponse) pageContext .getResponse(); results.append(" action=\""); String contextPath = request.getContextPath(); StringBuffer value = new StringBuffer(); if (contextPath.length() > 1) { value.append(contextPath); } if (!action.startsWith("/")) { String s = RequestUtil.getPath(); if (s.indexOf('.') > 0) { s = s.substring(0, s.lastIndexOf('/') + 1); } else if (!s.endsWith("/")) { s = s + "/"; } value.append(s); } value.append(action); if (!action.endsWith("/")) { value.append("/"); } results.append(response.encodeURL(value.toString())); results.append("\"");
まずコンテキストパス/sa-struts-tutorialを取得する。
actionがsubmit/0なのでifブロックの中に入り、サーブレットパス/foreachButton/foreachButton.jspを取得する。
ifブロックを抜けるとvalueが/sa-struts-tutorial/foreachButton/になり、最終的には、
action="/sa-struts-tutorial/foreachButton/submit/0/"
となる。
コンテキストパスとかサーブレットパスとかPathInfoは混乱するので、以下を参考。
Servlet(サーブレット)リファレンス
SAStrutsPluginでもこのあたりは対応しているので、foreachButton.jspからForeachButtonAction.javaに飛べます。
実はこのパターンは1.0.1-rc4からのようですね。前はformタグで書いていた模様。
- [Seasar-user:13038] [SAStruts]formタグとs:fromタグの使い分けについて
- [SASTRUTS-25] s:formでアクションのパス以外にメソッド名やパラメータも書けるようにしました - The Seasar Foundation Issues (Deprecated)
えーと、そして、今SAStrutsPluginで気づいたこと
return "xxx.jsp?redirect=true";
のようなリダイレクトに対応していないので、この場合JSPファイルに飛べないです。
あとショートカットキーがStep Over(F6)とStep Return(F7)にかぶってるのね。。。