2009-08-18 70 views
0

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

这里有一些想法,我认为:

  • ActionContext.getCurrent()的setLocale()。不幸的是,当动作被调用时,似乎创建了新的ActionContext,并且区域设置被重置为默认值。
  • 设置参数request_locale,由i18n拦截器处理。不幸的是,i18n拦截器坚持不仅为当前操作设置语言环境,而且还为当前会话设置语言环境,这会引发异常,因为会话没有为我的应用程序启用。
  • 通过实现setLocale(),设置一个参数并在动作本身中对其进行处理。直截了当,但这意味着没有任何拦截器可以访问区域设置。
  • 设置一个参数并编写一个拦截器(基本上和i18n拦截器完全相同,而不需要假设会话支持)。对于这样一个简单的问题似乎过度杀伤,更不用说重新发明轮子。

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

+0

如果您需要在您的拦截器的语言环境,我想你坚持重新发明用自定义的i18n拦截轮。令我惊讶的是ActionContext被重新创建 - 我想你的第一个想法也会起作用。 – Pat 2009-08-19 01:08:53

回答

0

我确实最终设置了一个参数“locale”,并重写了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前。只为请求 request_only_locale的

代替 request_locale

request_only_locale存储区域和不接触会议:

1

当您设置帕拉姆,你可以使用提供I18nInterceptor。

干杯, 基督教

+0

好的解决方案。我猜这在我问原始问题的时候使用的Struts2的任何版本都不可用(因为我确定我经历了I18nInterceptor源代码)。 – 2011-04-21 02:00:13