Muh*_*edy 3 unicode jsp servlets character-encoding
如何使servlet接受从JSP传递的非ascii(阿拉伯语,中文等)字符?
我试图将以下内容添加到JSP的顶部:
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Run Code Online (Sandbox Code Playgroud)
并在servlet中的每个post/get方法中添加以下内容:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)
我试图添加一个Filter来执行上面两个语句而不是servlet.
说实话,过去这些都在起作用,但现在它不再起作用了.
我在Win和Linux机器上的JDK1.6上使用tomcat 5.0.28/6.xx.
这是一个例子:JSP页面:
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>Push Engine</title>
</head>
<body>
Hello ${requestScope['val']}
<form action="ControllerServlet" method="POST">
<table>
<tr>
<td>ABC</td>
<td><input name="ABC" type="text" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit"></td>
</tr>
</table>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
Servlet doGet方法:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String val = "request.getParameter('ABC') : " + request.getParameter("ABC");
System.out.println(val);
request.setAttribute("val", val);
request.getRequestDispatcher("index.jsp").forward(request, response);
}
Run Code Online (Sandbox Code Playgroud)
问题是: 在控制台中,值"???" 然而,正在打印的值返回到包含正确Unicode字的JSP页面
"???" 打印到控制台是我运行此测试的机器中的问题.我在另一台机器上运行了同样的例子,它运行正常!
至此,您需要设置请求编码.
对于GET请求(其中参数通过请求URL传递),您需要在appserver级别配置它.例如,在Tomcat 6.0中,只需URIEncoding将<Connector>元素的属性设置/conf/server.xml为UTF-8.
<Connector (...) URIEncoding="UTF-8" />
Run Code Online (Sandbox Code Playgroud)
对于POST请求(其中的参数是"看不见",通过请求体传递),你需要调用ServletRequest#setCharacterEncoding()与UTF-8 之前收集的任何请求参数.最好的地方是这样做是在一个过滤器,它被称为链中的第一个过滤器:
if (request.getCharacterEncoding() == null) {
request.setCharacterEncoding("UTF-8");
}
chain.doFilter(request, response);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4970 次 |
| 最近记录: |