Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JDBC кодировка, JSP+Servlet on JBoss, Win Postgresql 8.3 
V
    Опции темы
ins0mnia
Дата 17.4.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.4.2009
Где: Kyiv

Репутация: нет
Всего: нет



Добрый день, всезнающий all

У меня возник  stupid blocking point при реализации моего веб-приложения с использованием Postgresql 8.3 (running on Windows).

Кратко о приложении: чистая JSP&Servlet платформа (даже без базовых taglibs), деплоится на JBoss AS 4.2.2.GA и использует Win PostgreSQL  8.3.
Проблема заключается в сохранении в базе данных записей, поступивших из JSP (все JSP pages используют 
Код
 charset=UTF-8" and pageEncoding="UTF-8" 
, в некорректной кодировке (некорректность определена визуально - при просмотре записей чере pgAdmin III, а также при дальнейшей их выборке из БД и передаче через HttpSession для отображения их в тех же JSP страницах.

Скрипты создания БД и таблицы:
Database 'test'
Код

CREATE DATABASE test
  WITH OWNER = dwh
       ENCODING = 'UTF8';


Table 'users'
Код

CREATE TABLE events
(
  id serial NOT NULL,
  field1 text NOT NULL,
  field2 text NOT NULL,
  CONSTRAINT events_pk PRIMARY KEY (id)
)
WITH (OIDS=FALSE);
ALTER TABLE events OWNER TO dev;


Страница JSP requestsList.jsp (часть кода):
Код

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

<%
    String flowControl = (String)session.getAttribute("flowControl");
%>

<table cellspacing="0" cellspacing="5" width="150" border="0">
    <tr>
        <td bgcolor="F6F6F6">
            <font face="Verdana">Поиск</font>
            <form>
                <input type="hidden" name="action" value="search">
                <input type="text" name="keyword" size="10">
                <input type="submit" value="Искать">
            </form>


После ввода в поле значени "тест" и нажатия кнопки "Создать" действие передаётся по следующей ссылку
Код

http://serv_ip:8081/ssweb/Controller?action=search&keyword=%F2%E5%F1%F2


Вот код обработки в сервлете:
Код

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...
if(request.getParameter("action").equals("search")) {
            session = request.getSession();
            boolean created = dbHelper.createEvent(request.getParameter("keyword"), session);
            if(created)
                session.setAttribute("message", "New event created successfully.");
            else
                session.setAttribute("message", "New event creation failed.");
            session.setAttribute("action", request.getParameter("action"));

            RequestDispatcher rd = getServletContext().getRequestDispatcher("/WEB-INF/requestsList.jsp");
            rd.forward(request, response);
        }
...


Код dbHelper.createEvent(String value):
Код

    public boolean createEvent(String keyword, HttpSession session)
    {
        boolean result = false;        
        Connection conn = this.getConnection();
        try {
            Statement createStatement = conn.createStatement();
            String test = new String(keyword.getBytes("UTF-8"), "UTF-8"); // также были попытки не трансформить строку
            System.out.println(test);
            PreparedStatement prep = conn.prepareStatement("insert into events(field1, field2) values(?, ?)");
            prep.setString(1, keyword);
            prep.setString(2, keyword);
            int affect = prep.executeUpdate();
            if(affect == 1)
                result = true;
        }
        catch (SQLException sqle) {
            sqle.printStackTrace();
        } catch (UnsupportedEncodingException ioe) {
            ioe.printStackTrace();
        }
        return result;
    }


Вот собственно говоря все детали. 
Сервер - Windows 2003 Server, Location=Ukraine, lang for the non-Unicode program (Advanced tab in Regional Settings)=Ukrainian (все чекбоксы включены).

При просмотре через pgAdmin:
Код

14;"òåñò";"òåñò";1


На JSP выводит: òåñò 

Интересно то, что если я ввожу на другой JSP в поле ввода "тест", а затем ищу это значение в таблице - возвращается одна запись.

Большая просьба ткнуть носом в тот момент, где скрывается ошибка.
Заранее благодарен smile 

PM MAIL ICQ   Вверх
NeoNYura
Дата 17.4.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 10.3.2008

Репутация: нет
Всего: нет



Вы бы распечатали, вашу информацию во всех точках, для того что бы понять где происходит проблема с кодировкой.\


Если в Сервлете то  можно добавить следующий код

Код

        try {
            request.setCharacterEncoding("utf8");
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }

PM MAIL   Вверх
goodday1941
Дата 17.4.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: нет
Всего: 9



что выдает данный системаут
Код

System.out.println(test);

если текст правильный, то база таки у вас не в утф-8 (хотя создается база вроде правильно)

Добавлено @ 18:04
это излишество
Код

String test = new String(keyword.getBytes("UTF-8"), "UTF-8");


Добавлено @ 18:06
так не пробвали писать?
Код

<%@ page contentType="text/html; charset=utf-8"%>


Это сообщение отредактировал(а) goodday1941 - 17.4.2009, 18:08


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
ins0mnia
Дата 17.4.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.4.2009
Где: Kyiv

Репутация: нет
Всего: нет



Изменил код
Код

try {
            Statement createStatement = conn.createStatement();
            //String test = new String(keyword.getBytes("UTF-8"), "UTF-8");
            System.out.println(keyword);
            PreparedStatement prep = conn.prepareStatement("insert into events(field1, field2) values(?, ?)");
            prep.setString(1, keyword);
            prep.setString(2, keyword);
            int affect = prep.executeUpdate();
            if(affect == 1)
                result = true;
        }
        catch (SQLException sqle) {
            sqle.printStackTrace();
        } 

Вот результат 

Код

System.out.println(keyword);


18:01:56,858 INFO  [STDOUT] ?????? ?????? ??????


Также в начале doGet и doPost поставил:
Код

request.setCharacterEncoding("utf-8");

...не помогло
PM MAIL ICQ   Вверх
Asal
Дата 20.4.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 26.12.2006
Где: Минск

Репутация: 4
Всего: 7



еще можно попробывать поставить в настройках соединения UTF-8 для результата и данных которые вставляются


--------------------
PM MAIL ICQ   Вверх
ins0mnia
Дата 21.4.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.4.2009
Где: Kyiv

Репутация: нет
Всего: нет



Есть некий прогресс: явно указал метод post для формы и action (на контроллер действий) - в логах jboss и таблице postgresql данные пошли русскими, корректными символами

Код

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    String flowControl = (String)session.getAttribute("flowControl");
%>
<table cellspacing="0" cellspacing="5" width="150" border="0">
    <tr>
        <td bgcolor="F6F6F6">
            <font face="Verdana">Поиск</font>
            <form method="post" action="/ssweb/Controller">
                <input type="hidden" name="action" value="search">
                <input type="text" name="keyword" size="10">
                <input type="submit" value="Искать">
            </form>


Также установил, что при отсутствии
Код

request.setCharacterEncoding("utf-8");

символы в jboss log & postgre table будут в некорректной кодировке.

В принципе это решение удовлетворяет текущим потребностям, но на будущее хотелось бы разъяснить для себя эту тему.
Взглянув на значение keyword в этой uri
Код

http://serv_ip:8081/ssweb/Controller?action=search&keyword=%F2%E5%F1%F2


, я подумал, что при [code=java]request.getParameter("keyword") в программу данные попадают вот в такой вот, неприемлемой, кодировке.

Есть мнение использовать атрибут Connector'a URIEncoding (server.xml JBoss'овского Tomcat'а) 
This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.
и возможно это позволит решить трабл с обработкой в doGet().

Это сообщение отредактировал(а) ins0mnia - 21.4.2009, 12:01
PM MAIL ICQ   Вверх
ins0mnia
Дата 21.4.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.4.2009
Где: Kyiv

Репутация: нет
Всего: нет



Прошу простить за общение с самим собойsmile
С doGet решилась проблема использованием того самого атрибута URIEncoding. Теперь мой Connector выглядит так:
Код

<Connector port="8081" address="${jboss.bind.address}"    
         maxThreads="250" maxHttpHeaderSize="8192"
         emptySessionPath="true" protocol="HTTP/1.1"
         enableLookups="false" redirectPort="8443" acceptCount="100"
         connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>


URL, в свою очередь, получается таким:
Код

http://serv_ip:8081/ssweb/Controller?action=search&keyword=тест


Собственно сабж, мне кажется, можно считать разобранным smile 
PM MAIL ICQ   Вверх
ins0mnia
Дата 27.4.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.4.2009
Где: Kyiv

Репутация: нет
Всего: нет



considered as solved  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.