Thí dụ Java ServerPage (JSP) sau đây chạy trên Tomcat 5.5.7, gói chung với NetBeans 4.1, trên Windows XP.
The following Java ServerPage (JSP) example runs on Tomcat 5.5.7, bundled with NetBeans 4.1, on Windows XP.
lang.jsp:
<!-- Things to note regarding the servlet API: HttpServletRequest.setCharacterEncoding() normally only applies to the request body NOT the URI. Therefore, use POST with forms to return parameters as the parameters are then part of the request body. http://nagoya.apache.org/bugzilla/show_bug.cgi?id=23929 http://nagoya.apache.org/bugzilla/show_bug.cgi?id=12253 http://java.sun.com/developer/qow/archive/179/index.jsp http://jakarta.apache.org/tomcat/tomcat-5.0-doc/config/http.html --> <%@ page language="java" contentType="text/html; charset=UTF-8" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Thử request parameters (Form) với Tiếng Việt Unicode</title> </head> <body> <% request.setCharacterEncoding("UTF-8"); String title = "JSP với Tiếng Việt"; String name = request.getParameter("name"); %> request encoding: <%= request.getCharacterEncoding() %><br /> response encoding: <%= response.getCharacterEncoding() %><br /><br /> Title: <%= title %><br /> Tên: <%= name %><br /><br /> <form method="GET" action="lang.jsp"> Tên: <input type="text" name="name" value="" > <input type="submit" name="submit" value="GET Submit" /> </form> <form method="POST" action="lang.jsp"> Tên: <input type="text" name="name" value="" > <input type="submit" name="submit" value="POST Submit" /> </form> </body> </html>
Với POST method, server sẽ dùng encoding của request body, được set bởi Request.setCharacterEncoding. Nếu không specified, default ISO-8859-1 sẽ được dùng. Lưu ý Request.setCharacterEncoding không có tác dụng với request data gửi bởi GET method.
Với GET method, server không thể biết encoding của URI data, cho nên đã dùng default encoding của server, thường là ISO-8859-1, để decode query data nằm trong URL string. Đây là nguyên nhân của nhiều khó khăn với HTML hay JSP form mặc dù đã được encode với UTF-8 vẫn không nhận đúng Unicode (Tiếng Việt) data mà lại ra raw UTF-8 byte sequences. Để nhận request data đúng, bạn cần chỉnh lại encoding của servlet server's HTTP connector. Setting này được thực thi trên conf/server.xml file của Tomcat qua 1 trong 2 parameters sau:
With POST method, server will use encoding of request body, which is set by Request.setCharacterEncoding. If not specified, default ISO-8859-1 will be used. Note that Request.setCharacterEncoding does not have effect on request data sent by GET method.
With GET method, the server has no way knowing the encoding of URI data, so it uses default encoding of server, typically ISO-8859-1, to decode query data in URL string. This is the cause of many problems associated with HTML or JSP form with data encoded in UTF-8 but not properly decoded to Unicode (Vietnamese) data and thus rendered as raw UTF-8 byte sequences. To receive request data correctly, you need to adjust the encoding of servlet server's HTTP connector. This setting is done in conf/server.xml file of Tomcat via either one of these two parameters:
1. URIEncoding="UTF-8", để decode URL string với UTF-8 (to decode
URL string with UTF-8)
2. useBodyEncodingForURI="true", để decode với encoding của request, nếu
Request.setCharacterEncoding("UTF-8") đã được gọi (to decode using the encoding
of request, if Request.setCharacterEncoding("UTF-8") has been called)
Tiêu biểu/Typically:
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" URIEncoding="UTF-8" useBodyEncodingForURI="true" disableUploadTimeout="true" />
References: