2010-04-13 45 views
3

如何使servlet接受從JSP傳遞的非ASCII字符(阿拉伯語,漢語等)字符?如何啓用在Servlets中讀取非ASCII字符

我試過下面添加的JSP的頂部:

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 

,並添加下面的每個帖子/在servlet獲得方法:

request.setCharacterEncoding("UTF-8"); 
response.setCharacterEncoding("UTF-8"); 

我試着添加執行上述兩個語句的過濾器,而不是在servlet中。

說實話,這些工作都在過去,但現在它不再工作了。

我在JDK1.6上的Win & Linux機器上使用了tomcat 5.0.28/6.x.x。

下面是一個例子: 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> 

的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); 
    } 

的問題是:在控制檯 ,值 「???」但是,返回值返回到包含正確Unicode字的JSP頁面

「???」打印到控制檯是我運行此測試的機器中的問題。 我在另一臺機器上運行過相同的例子,它工作正常!

回答

8

至此,您需要設置request encoding

對於GET請求(其中參數通過請求URL傳遞),您需要在應用程序服務器級別配置此參數。在例如Tomcat 6.0中,將/conf/server.xml<Connector>元件的URIEncoding屬性設置爲UTF-8就足夠了。

<Connector (...) URIEncoding="UTF-8" /> 

對於POST請求(其中的參數是「不可見的」通過請求體通過),則需要調用ServletRequest#setCharacterEncoding()UTF-8之前收集任何請求參數。最好的地方是要做到這一點是在這被稱爲鏈的第一個過濾器過濾器:

if (request.getCharacterEncoding() == null) { 
    request.setCharacterEncoding("UTF-8"); 
} 
chain.doFilter(request, response); 
+0

哦,謝謝太多了,它實際上就是我想要的。 我的問題是因爲我發送了Get請求,而不是Post – 2010-04-13 16:31:36

+0

不客氣。 – BalusC 2010-04-13 16:46:26

+0

那麼,是不是有任何編程(相對於可配置)的方式來解決這個GET問題? – 2010-04-13 17:19:03

0

設置頁面的內容類型是從服務器到瀏覽器的關於服務器發送的內容的信息,這對您不會有什麼幫助。您需要確保的是,您的客戶端到服務器通信具有正確的字符編碼,並且您的服務器正在以正確的語言環境運行。您設置的精確方式取決於您使用的框架以及您的服務器的配置方式;首先要做的是確保在環境中使用正確的語言環境啓動服務器(可能爲LC_ALL變量)。

請注意,客戶端可能會嘗試告訴您的服務器它想要的語言環境,這是您的框架可能會幫助您的東西。 (它會是HTTP請求中的標題。)

0
if (request.getCharacterEncoding() == null) {  request.setCharacterEncoding("UTF-8"); } 

這爲我工作。 我在JSP META標記中設置了charset = UTF-8,並在servlet中添加了上面的代碼。 在此之後,它已經在Oracle數據庫中正確保存了阿拉伯文數據。