【问题标题】:How to change the Locale in a java web-app?如何更改 Java Web 应用程序中的语言环境?
【发布时间】:2014-05-26 12:04:37
【问题描述】:

这就是我的 Servlet 中的 doGet() 方法:

protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) 
        throws ServletException, IOException {
    httpServletResponse.setLocale(new Locale("tr", "TR"));
    System.out.println("Cookies being printed:");
    for(Cookie cookie:httpServletRequest.getCookies()){
        System.out.println(cookie.getName());
        System.out.println(cookie.getValue());
    }
}

第一次打doGet方法:

Cookies being printed:
locale
en

然后我刷新页面以再次调用它:

Cookies being printed:
JSESSIONID
A00EB65138C896FC282CE11EB20D1DD7
locale
en

这行好像没有效果:

httpServletResponse.setLocale(new Locale("tr", "TR"));

我做错了什么?为什么我得到一个带有 locale=en 的 cookie?

这是一个非常简单的网络应用程序,我不会在应用程序的任何其他部分设置任何类型的 cookie 或任何内容。这已经是欢迎文件。

【问题讨论】:

  • 我认为您应该将语言环境设置为会话,否则它将在您的下一个请求中丢失。
  • 如何将区域设置设置为会话?
  • @korayTugay:您能说明一下您是如何设置 Cookie 的吗?
  • @Ravinder 我没有设置任何 cookie。只有一个 Servlet 就是这个,我只需启动应用程序并调用这个 servlet 的 url。这是我所有的代码。
  • @KorayTugay:您的意思是说设置区域设置会导致创建 cookie?

标签: java jakarta-ee servlets cookies


【解决方案1】:

设置Cookie 和设置Locale 不一样。
CookieLocale 没有直接关系。

根据
javax.servlet.ServletResponse.setLocale(java.util.Locale loc) 上的文档:

  • 它设置响应的语言环境。
  • 它设置特定于语言环境的字符编码。

如果尚未提交响应,则会执行这些操作。

Cookie 是在客户端浏览器环境中设置一些持久数据。

要设置 Cookie,我们首先创建一个 cookie,将其添加到响应中,然后提交它。并且仅从同一客户端的 next 请求中读取相同的内容。除非这样,否则您无法读取刚刚设置为响应的 cookie。它在 servlet 已经收到的请求中不可用。

// to store cookie value in the format of 
// language + "_" + country + "_" 
//   + (variant + "_#" | "#") + script + "-" + extensions
String cookieValue_fullLength = new Locale( "tr", "TR" ).toString();
Cookie localeCookie_fl = new Cookie( "locale_fl", cookieValue_fullLength );
response.addCookie( localeCookie_fl );

// to store cookie value in the format of "language"
String cookieValue_Language = new Locale( "tr", "TR" ).getLanguage();
Cookie localeCookie_lang = new Cookie( "locale", cookieValue_Language );
response.addCookie( localeCookie_lang );

如果存在与"locale" 同名的 cookie,那么它将被覆盖。
如果您执行此操作,您当前设置为区域设置 "en" 的 cookie 将被覆盖。

收到新请求后,执行以下代码

for( Cookie cookie : httpServletRequest.getCookies() ) {
    System.out.println( cookie.getName() + " - " + cookie.getValue() );
}

将在控制台上打印以下结果:

JSESSIONID - A00EB65138C896FC282CE11EB20D1DD7
locale - tr
locale_fl - tr_TR_TR_#u-nu-thai

locale_fl 的值仅作为示例显示。执行后检查正确的。

【讨论】:

    猜你喜欢
    • 2013-08-28
    • 2011-03-24
    • 1970-01-01
    • 2017-05-09
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 2013-04-01
    相关资源
    最近更新 更多