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タグで書いていた模様。

えーと、そして、今SAStrutsPluginで気づいたこと

return "xxx.jsp?redirect=true";

のようなリダイレクトに対応していないので、この場合JSPファイルに飛べないです。

あとショートカットキーがStep Over(F6)とStep Return(F7)にかぶってるのね。。。