如何在java web-app中更改Locale?

时间:2014-04-12 07:48:05

标签: java java-ee servlets cookies

所以这是我的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(新的语言环境(“tr”,“TR”));

我做错了什么?为什么我要使用locale = en获取cookie?

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

1 个答案:

答案 0 :(得分:2)

设置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的值仅作为示例显示。执行后检查正确的。