アプリケーションの性質により、ユーザーがログインしてから、ロケールを決めるのが遅すぎる場合があります。
例えば、ユーザーがログインする前に、 前セッションで使用した同じロケールを使用させる場合があります。
そのとき、ウェブアプリケーションでは、クッキーを使って行われます。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 メソッドはかなり早い段階、リクエストパラメータが渡される前に、呼び出されます。
このため、リクエストにロケールと文字列を適切にエンコードしない限り、このメソッドでそれらに通信することを推奨します。