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決定のタイミングの全てに介入できるようになってます.