アプリケーションの性質により、ユーザーがログインしてから、ロケールを決めるのが遅すぎる場合があります。
例えば、ユーザーがログインする前に、 前セッションで使用した同じロケールを使用させる場合があります。
そのとき、ウェブアプリケーションでは、クッキーを使って行われます。ZKの場合は、リ クエストインターセプターを登録し、インターセプターが呼ばれるときにクッキーを処理します。
リクエストインターセプターはZKローダーとZKアップデートエンジンによって処理されたリクエストをインターセプト(介入) します。
それを使用するため、org.zkoss.zk.ui.util.RequestInterceptorインターフェースを実装しなければなりません。例えば、
public class MyLocaleProvider implements org.zkoss.zk.ui.util.RequestInterceptor { public void request(org.zkoss.zk.ui.Session sess, Object request, Object response) { final Cookie[] cookies = ((HttpServletRequest)request).getCookies(); if (cookies != null) { for (int j = cookies.length; --j >= 0;) { if (cookies[j].getName().equals("my.locale")) { //determine the locale String val = cookies[j].getValue(); Locale locale = org.zkoss.util.Locales.getLocale(val); sess.setAttribute(Attributes.PREFERRED_LOCALE, locale); return; } } } } }
有効にするために、以下のようにWEB-INF/zk.xmlの中にそれを登録しなければなりません。
一度登録されると、ZKローダーまたはZKアップデートエンジンがリクエストを受け取るたびに、リクエストメソッドを呼び出します。
設定について開発用リファレンス中のAppendix Bを参照してください。
<listener> <listener-class>MyLocaleProvider</listener-class> </listener>
【メモ】:インターセプターのインスタンスは登録されるときにインスタンス化されます。
同一アプリケーション中のすべてのリクエストで共有されます。このため、同時に通信できる(つまり、thread-safe)ことを事前に確認しなければなりません。
【メモ】:request メソッドはかなり早い段階、リクエストパラメータが渡される前に、呼び出されます。
このため、リクエストにロケールと文字列を適切にエンコードしない限り、このメソッドでそれらに通信することを推奨します。