为JVM的战争设置一个区域设置?

时间:2010-01-31 09:15:38

标签: java tomcat web-applications internationalization

我的tomcat6在带有locale en_US的JVM中运行。 我需要部署几个webapps&我希望每个webapp(打包在war文件中)具有不同的默认语言环境。这可能吗?

2 个答案:

答案 0 :(得分:1)

没有。但是,您可以在每个JSP页面上显式设置Locale。将语言环境存储在会话对象或资源中。

如果您使用sesison对象,您的用户可能拥有自己的个人区域设置,这在国际环境中可能很不错。

答案 1 :(得分:1)

(警告:我还没有在Java中做过很多语言环境。)

如果可能,您希望避免在JSP或servlet的实际代码中执行此操作。如果没有直接配置方式(这看起来很令人惊讶),我打赌有一个几乎直接配置方式:你可以使用过滤器。

创建javax.servlet.Filter的子类,将其安装在相关应用程序的web.xml中,然后在setLocale实施中的ServletResponse上致电doFilter。或类似的规定。请注意,这并不妨碍您为特定用户执行特定操作,因此如果有用,他们可以拥有自己的区域设置。

如果您以前没有使用过滤器,那么它们很容易(并且非常强大)。您只需实现一个三方法接口,其中两个通常只是空的存根,除非您有必须获取和释放的资源,第三个(doFilter)看起来像这样:

public void doFilter(
    ServletRequest request,
    ServletResponse response,
    FilterChain chain
    )
throws IOException, ServletException
{
    // Do your stuff here; so for instance:
    response.setLocale(...);

    // Chain to the next filter
    chain.doFilter(request, response);
}

然后web.xml部分看起来像这样:

<filter>
    <filter-name>My Servlet Filter</filter-name>
    <filter-class>com.example.MyServletFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>My Servlet Filter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>

关于过滤器的一个很酷的事情是,如果需要,可以在requestresponse上插入一个外观(在这种情况下我不认为你这样做,但谁知道)通过ServletRequestWrapperServletResponseWrapper实用程序类。这些基类只包含requestresponse实例并传递给它们。这意味着您可以替换传递给链中下一个过滤器的requestresponse实例,并使用您自己的包装器子类的实例来覆盖任何请求或需要参与的响应方法。

我已经使用过滤器(和包装器)来做各种各样的事情,它们是一种享受,对于特定于应用程序的配置驱动的东西非常好。