如何在自定义Struts 2 ActionMapper中设置区域设置

时间:2009-08-18 10:07:39

标签: internationalization struts2 locale

我已经实现了一个自定义ActionMapper,它从URI中获取区域设置(URI本身,而不是请求参数)。从ActionMapper.getMapping()中,如何设置当前操作的语言环境?

以下是我考虑过的一些想法:

  • ActionContext.getCurrent()。的setLocale()。不幸的是,似乎在调用操作时会创建一个全新的ActionContext,并且语言环境将重置为默认值。
  • 设置参数request_locale,它将由i18n拦截器处理。不幸的是,i18n拦截器坚持不仅为当前操作而且还为当前会话设置语言环境,这会引发异常,因为我的应用程序没有启用会话。
  • 通过实现setLocale()设置参数并在操作本身中处理它。直截了当,但这意味着没有一个拦截器可以访问该语言环境。
  • 设置参数并编写拦截器(基本上与i18n拦截器做同样的事情而不假设会话支持)。对于这样一个简单的问题来说似乎有些过分,更不用说重新发明轮子了。

有没有简单的方法来实现这个目标?

2 个答案:

答案 0 :(得分:1)

设置参数时可以使用提供的I18nInterceptor: request_only_locale

而不是 request_locale

request_only_locale仅存储请求的区域设置,不会触及会话。

干杯, 基督教

答案 1 :(得分:0)

我确实最终设置了一个参数“locale”,并重写了使用它的i18n拦截器。

从Struts 2.1.1开始,ActionMapping中的参数与请求参数保持独立。 actionMappingParams拦截器获取这些参数并将它们应用于操作对象。但是,我希望我的i18n拦截器使用“locale”参数而将其传递给动作,以下是我的操作方式:

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之前。