0

URI (要求パラメーターではなく URI 自体) からロケールを取得するカスタム ActionMapper を実装しました。ActionMapper.getMapping() 内から、現在のアクションのロケールを設定するにはどうすればよいですか?

ここに私が検討したいくつかのアイデアがあります:

  • ActionContext.getCurrent().setLocale(). 残念ながら、アクションが呼び出されると新しい ActionContext が作成され、ロケールがデフォルトにリセットされるようです。
  • i18n インターセプターによって処理されるパラメーター request_locale を設定します。残念ながら、i18n インターセプターは、現在のアクションだけでなく現在のセッションにもロケールを設定することを要求します。アプリケーションでセッションが有効になっていないため、例外がスローされます。
  • パラメータを設定し、setLocale() を実装してアクション自体で処理します。簡単ですが、どのインターセプターもロケールにアクセスできないことを意味します。
  • パラメータを設定し、インターセプターを作成します (基本的に、セッションのサポートを想定せずに i18n インターセプターと同じことを行います)。車輪の再発明は言うまでもなく、このような単純な問題にはやり過ぎのように思えます。

これを達成する簡単な方法はありますか?

4

2 に答える 2

1

次のパラメータを設定すると、提供されているI18nInterceptorを使用できます:request_only_locale

request_localeの代わりに

request_only_localeは、リクエストのロケールのみを格納し、セッションにはアクセスしません。

乾杯、クリスチャン

于 2011-04-20T08:31:56.503 に答える
0

私は確かにパラメータ「ロケール」を設定し、それを使用するようにi18nインターセプターを書き直しました。

Struts 2.1.1 以降、ActionMapping のパラメーターは要求パラメーターとは別に保持されます。actionMappingParams インターセプターは、これらのパラメーターを受け取り、アクション オブジェクトに適用します。ただし、i18n インターセプターが「ロケール」パラメーターを消費し、それをアクションに渡さないようにしたかったのです。

private static final String LOCALE_PARAMETER = "locale";

public String intercept(ActionInvocation invocation) throws Exception {
    ActionMapping mapping = (ActionMapping) invocation.getInvocationContext()
        .get(ServletActionContext.ACTION_MAPPING);
    Map params = mapping.getParams(); 
    Locale locale = (Locale) params.remove(LOCALE_PARAMETER);

    if(locale != null) {
        ActionContext.getContext().setLocale(locale);
    }

    return invocation.invoke();
}

このカスタム i18n インターセプターは、インターセプター スタック内の actionMappingParams の前に配置する必要があります。

于 2009-09-01T08:22:07.690 に答える