TeedaのURL決定のフロー

id:jfluteさんがGOODなテンプレを用意してくれたので、

1.0.9からのURL決定時の処理フローについて書いてみたいと思います.

NavigationHandlerUtil.redirect()
 → ExternalContext.encodeActionURL()
  → EncodeUrlCustomizer.encodeActionUrl() ※1
   (実質はExternalContext.encodeResourceURL())
   → HttpServletResponse.encodeURL()
    → ExternalContext.redirect()
     → ServletExternalContextImpl.redirect()
      → ServletExternalContextUtil.redirect()
       → RedirectUrlResolver.resolveUrl()  ※2Resolverがあれば
        → HttpServletResponse.sendRedirect()

*1でencodeAction/ResourceでURL自体の書き換えを自由に
いじることができます.基本はWindowId付加だけをする、
WindowIdEncodeUrlCustomizerです.




コイツは今までの実装をリファクタリングして抽出しただけ.

public class WindowIdEncodeUrlCustomizer implements EncodeUrlCustomizer {

    private static final long serialVersionUID = 1L;

    public String encodeActionUrl(ExternalContext externalContext, String url) {
        return encodeResourceUrl(externalContext, url);
    }

    public String encodeResourceUrl(final ExternalContext externalContext,
            final String url) {
        AssertionUtil.assertNotNull("url is null.", url);
        AssertionUtil
                .assertNotNull("externalContext is null.", externalContext);
        final String wid = WindowIdUtil.getWindowId(externalContext);
        final StringBuffer buf = new StringBuffer(url.length()
                + WindowIdUtil.WID.length() + 2);
        buf.append(url);
        if (!StringUtil.isEmpty(wid)) {
            if (url.lastIndexOf("?") >= 0) {
                buf.append("&");
            } else {
                buf.append("?");
            }
            buf.append(WindowIdUtil.WID);
            buf.append("=");
            buf.append(wid);
        }
        return buf.toString();
    }

    //do nothing
    public String encodeNamespace(String name) {
        return name;
    }

}


Seasar-user:9448さんのように、プロジェクトの都合上でキーを付加したいなどの

場合にも対処はできるようにしました.

置き換えはteedaCustomize.diconを使ってカスタマイズしたもので置き換えてください.


*2はREDIRECT時のURLをいじれるRedirectUrlResolver.通常はResolverはいません.

これはREDIRECT時のみに介入します.



他のJSFとかWebフレームワークがどうしているのかはわかりませんが、

*1、*2でほぼTeeda内でのURL決定のタイミングの全てに介入できるようになってます.