如果我在servlet中以编程方式设置HTTP响应语言环境,如下所示:
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setLocale(SOME_LOCALE); // .. etc }
然后在Jetty 7及更高版本中,任何尝试通过表达式$ {pageContext.response.locale}读取该语言环境的JSP都将获取服务器的默认语言环境,而不是上面的设置。如果我使用Jetty 6或Tomcat,则可以正常工作。
这是演示该问题的完整代码:
public class MyServlet extends HttpServlet { // Use a dummy locale that's unlikely to be the user's default private static final Locale TEST_LOCALE = new Locale("abcdefg"); @Override protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException { // Set a known response locale response.setLocale(TEST_LOCALE); // Publish some interesting locales to the JSP as request attributes for debugging request.setAttribute("defaultLocale", Locale.getDefault()); request.setAttribute("testLocale", TEST_LOCALE); // Forward the request to our JSP getServletContext().getRequestDispatcher("/index.jsp").forward(request, response); } }
和JSP:
<html> <head> <title>Locale Tester</title> </head> <body> <h2>Locale Tester</h2> <ul> <li>pageContext.request.locale = '${pageContext.request.locale}'</li> <li>default locale = '<%= request.getAttribute("defaultLocale") %>'</li> <li>pageContext.response.locale = '${pageContext.response.locale}' (should be '<%= request.getAttribute("testLocale") %>')</li> </ul> </body> </html>
Tomcat返回此信息(正确):
Locale Tester pageContext.request.locale = 'en_AU' default locale = 'en_US' pageContext.response.locale = 'abcdefg' (should be 'abcdefg')
码头7(错误地)返回此:
Locale Tester pageContext.request.locale = 'en_AU' default locale = 'en_US' pageContext.response.locale = 'en_US' (should be 'abcdefg')
FWIW,我使用Jetty / Tomcat Maven插件进行了上述所有测试。
我通过Jetty邮件列表发现这是Jetty 7中的错误,现已修复。