2010-04-13 4 views
3

Как заставить сервлет принимать символы, отличные от ascii (арабские, китайские и т. Д.), Переданные из JSP?Как включить чтение символов, отличных от ascii, в сервлетах

Я попытался добавить следующее в начало JSPs:

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

И добавить следующее в каждый пост/получить метод в сервлет:

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

Я пробовал для добавления фильтра, который выполняет указанные выше два оператора, а не в сервлет.

Чтобы быть честным, они работали в прошлом, но теперь это больше не работает.

Я использую tomcat 5.0.28/6.x.x на JDK1.6 как на Win & Linux-боксах.

Вот пример: 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> 

сервлетов 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); 
    } 

ПРОБЛЕМА IS: в консоли, значение "???" печатается, однако, значение, возвращенное на страницу JSP, содержащее правильное слово Юникода

«???» напечатанный на консоли, является проблемой в машине, на которой я запускал этот тест. Я использовал тот же пример на другом компьютере, и он работает правильно!

ответ

8

К тому же вам необходимо установить request encoding.

Для запросов GET (где параметры передаются через URL-адрес запроса), вам необходимо настроить это на уровне приложений. В примере, например, Tomcat 6.0, достаточно установить атрибут URIEncoding элемента <Connector> в /conf/server.xml до UTF-8.

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

Для запросов POST (где параметры «невидимо» проходит через тело запроса), вам нужно позвонить ServletRequest#setCharacterEncoding() с UTF-8перед тем сбор какой-либо параметр запроса.Лучшее место, чтобы сделать это в фильтре, который был призван в качестве первого фильтра в цепи:

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

Ох, спасибо большое, Это на самом деле то, что я хочу. Моя проблема была в том, что я отправил Получить запрос, а не сообщение –

+0

Добро пожаловать. – BalusC

+0

Итак, не существует ли какой-либо программный (напротив настраиваемого) способ решить эту проблему GET? –

0

Установка типа содержимого страница - это сообщение с вашего сервера в браузер о том, что сервер отправляет, и это на самом деле не поможет вам. Необходимо убедиться, что связь между клиентом и сервером имеет правильную кодировку символов и что ваш сервер работает с правильной локалью. Точный способ настройки зависит от используемой структуры и того, как настроен ваш сервер; первое, что нужно сделать, - убедиться, что ваш сервер запущен с правильной локалью в среде (возможно, переменная LC_ALL).

Обратите внимание, что клиент может попытаться рассказать вашему серверу о том, какой язык он хочет, и это то, с чем вам, вероятно, поможет ваша структура. (Это будет заголовок в HTTP-запросе.)

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

Это работает для меня. Я установил chasset = UTF-8 в теге JSP META и добавил код выше в сервлет. После этого он правильно сохранил арабские данные в базе данных Oracle

Смежные вопросы