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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSP параметры передаются, но доходят иероглифы :(, проблемы при работе с русскими буквами 
V
    Опции темы
Иван Человеков
  Дата 4.2.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть JSP страница Person.jsp, она передаёт параметры сервлету ActionPersonUpdate.java для их обновления в СУБД. 
Код Person.jsp:

Код

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

<html>
<head>
    <title>Simple jsp page</title>
    <meta  http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
 <%
     int id;
     PersonBook personBook;
     PersonDataBean personDataBean=new PersonDataBean();

     try {
         id = Integer.parseInt(request.getParameter("p_id"));   //Получаем параметр, какого работника пользователь хочет посмотреть
     } catch (NumberFormatException nfE) {
         JOptionPane.showMessageDialog(null, "Ошибка преобразования ID из String в int." + nfE.getMessage(), "Ошибка преобразования", JOptionPane.ERROR_MESSAGE);
         id = 1;
     }
     personBook = personDataBean.getPersonId(id);
 %>
 <b>Просмотр и изменение карточки работника.</b>
 <p>
 <form action="<%=request.getContextPath()%>/ActionPersonUpdate" method="get">
     <br>        <input value="<%=personBook.getId()%>" name="pId" type="text" maxlength="7" size=5>  Табельный номер.
     <br>        <input value="<%=personBook.getFio()%>" name="pFio" type="text" maxlength="45" size=45>  ФИО.
     <br>        <input value="<%=personBook.getDoljnost()%>" name="pDoljnost" type="text" maxlength="17" size=17>  Должность.
     <br>        <input value="<%=personBook.getRazrad()%>" name="pRazrad" type="text" maxlength="5" size=5>  Квалификационный разряд.
     <br>        <input value="<%=personBook.getKoef_tarif_ets()%>" name="pKoef_tarif_ets" type="text" maxlength="5" size=5>  Тарифный коэффициент кратный размер ЕТС.
     <br>        <input value="<%=personBook.getKoef_tarif_razn()%>" name="pKoef_tarif_razn" type="text" maxlength="5" size=5>  Тарифный коэффициент с учётом межразрядной единицы.
     <br>        <input value="<%=personBook.getOklad_procent()%>" name="pOklad_procent" type="text" maxlength="5" size=5>  Процент месячного должностного оклада с увеличением.
     <br>        <input value="<%=personBook.getPers_nadb_proc()%>" name="pPers_nadb_proc" type="text" maxlength="3" size=5>  Персональная надбавка процента %.
     <br>        <input value="<%=personBook.getVisl_nadb_proc()%>" name="pVisl_nadb_proc" type="text" maxlength="3" size=5>  Надбавка за выслугу лет %.
     <p><input value="Сохранить" type="submit"/></p>
 </form>
 <form action="AllPerson.jsp" >
     <p><input value="Отменить" type="submit"/></p>
 </form>
</body>
</html>


Код ActionPersonUpdate.java:

Код

package com.Djordano_Bruno.zpl.actions;

public class ActionPersonUpdate extends HttpServlet {
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException {
        connection= Connect.Connect();  //Объект который управляет соединением между Java программой и БД
       try{
        request.setCharacterEncoding("UTF-8");
       }catch(Exception e){
           e.printStackTrace();
       }
        
        fio=request.getParameter("pFio");
        doljnost=request.getParameter("pDoljnost");
        try {
            id=Integer.parseInt(request.getParameter("pId"));
            razrad=Integer.parseInt(request.getParameter("pRazrad"));
            koef_tarif_ets=Float.parseFloat(request.getParameter("pKoef_tarif_ets"));
            koef_tarif_razn=Float.parseFloat(request.getParameter("pKoef_tarif_razn"));
            oklad_procent=Integer.parseInt(request.getParameter("pOklad_procent"));
            pers_nadb_proc=Integer.parseInt(request.getParameter("pPers_nadb_proc"));
            visl_nadb_proc=Integer.parseInt(request.getParameter("pVisl_nadb_proc"));
        }catch(NumberFormatException nfE){
            JOptionPane.showMessageDialog(null,"Ошибка преобразования String в необходимое число :"+nfE.getMessage(),"Ну блин так всегда...",JOptionPane.ERROR_MESSAGE);  nfE.printStackTrace();
        }
        try{   //Возвращаю запись об работнике по ID
            setPrepStatUpdatePerson=connection.prepareStatement("UPDATE person " +
                 "SET fio=?,doljnost=?,razrad=?,koef_tarif_ets=?,koef_tarif_razn=?," +
                 "oklad_procent=?,pers_nadb_proc=?,visl_nadb_proc=? " +
                 "WHERE id=?");
        }catch(SQLException sqle){
         JOptionPane.showMessageDialog( null, "При создании SQL оператора \"setPrepStatUpdatePerson\"возникла ошибка '"+sqle.getMessage()+"'.", "Database Error",   JOptionPane.ERROR_MESSAGE );         sqle.printStackTrace();
        }

         try{
            setPrepStatUpdatePerson.setString(1,fio); //"Карацупа"
            setPrepStatUpdatePerson.setString(2,doljnost);
            setPrepStatUpdatePerson.setInt(3,razrad);
            setPrepStatUpdatePerson.setFloat(4,koef_tarif_ets);
            setPrepStatUpdatePerson.setFloat(5,koef_tarif_razn);
            setPrepStatUpdatePerson.setInt(6,oklad_procent);
            setPrepStatUpdatePerson.setInt(7,pers_nadb_proc);
            setPrepStatUpdatePerson.setInt(8,visl_nadb_proc);
            setPrepStatUpdatePerson.setInt(9,id);
            
            id=setPrepStatUpdatePerson.executeUpdate();
        }catch (SQLException sqlE){
             JOptionPane.showMessageDialog(null,"При попытке внесения изменений в СУБД с запросом 'setPrepStatUpdatePerson' произошла ошибка, информация: "+sqlE.getMessage(),"Опаньки... приплыли ;)",JOptionPane.ERROR_MESSAGE); sqlE.printStackTrace();
        }

        try{
        request.getRequestDispatcher(url+"message=Обновление прошло шикарно :)&put=top/spr/AllPerson.jsp").forward(request, response);
        }catch(IOException e)
        {
            e.printStackTrace();
        }
    }
    private String fio,doljnost,url="/service/Message.jsp?";
    private float koef_tarif_ets,koef_tarif_razn;
    private int id,razrad,oklad_procent,pers_nadb_proc,visl_nadb_proc;
    private ResultSet results;
    private Connection connection;  //Объект который управляет соединением между Java программой и БД
    private PreparedStatement setPrepStatUpdatePerson;   //Возвращаю все записи работников
}


Параметры передаются, но доходят иероглифы smile 
Использую кодировку UTF-8, база данных PostqreSQL такжеиспользует UTF-8, драйвер postgresql-8.2-504.jdbc3.jar. 
Если я в БД запишу ручками русские буквы, то JSP страничка читает их верно.

Спасибо.

PM ICQ   Вверх
Tony
Дата 4.2.2007, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

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



Nu 4to takoe......
Сто раз уже кодировки обсуждались. 
Напиши фильтер: 
Код

public class FilterSys implements Filter{
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
         request.setCharacterEncoding("utf-8");
         HttpServletResponse res = (HttpServletResponse) response;
         //res.setHeader("Pragma", "no-cache");
         //res.setHeader("Cache-Control", "no-cache");
         //res.setHeader("Expires", "0");
         chain.doFilter(request, response);
    }
    
    public void init(FilterConfig config) throws ServletException {
         
    }
    
    public void destroy() {
        // TODO Auto-generated method stub
    }
}

Соединение с базой должно быть в UTF-8 и база должна быть в UTF-8 


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
Иван Человеков
Дата 4.2.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вот фильтр:
Код
package com.Djordano_Bruno.zpl.tools;

import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {

    public void init(FilterConfig arg0) throws ServletException {}

    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException{
        response.setContentType("text/html;charset=UTF-8");
        chain.doFilter(request, response);
    }

    public void destroy() {}
}


Пример конфига в web.xml:
Код

    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.Djordano_Bruno.zpl.tools.MyFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


Ребята подскажите пожалуйста, почему не работает? 
Результат - иероглифы неизвестного происхождения  smile 
Спасибо.
PM ICQ   Вверх
Tony
Дата 4.2.2007, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

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



Ну так 
Код

request.setCharacterEncoding("utf-8");

а у тебя
Код

response.setContentType("text/html;charset=UTF-8");



--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
tux
Дата 4.2.2007, 23:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Нужно править конфиг Томката. В файле conf/server.xml найди тэг Connector, у которого атрибут port="8080" и добавь в Connector еще один атрибут - URIEncoding="UTF-8". То есть у тебя должно получится что-то такое:
Код

    <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />

Фильтр будет работать только для метода POST, правила, по которым кодируются URL'ы метода GET задаются самим веб-контейнером.
PM MAIL Skype GTalk Jabber YIM   Вверх
Hidrag
Дата 4.2.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Попробуй добавить 
Код

<%@page pageEncoding="UTF-8"%>

в самый верх.... где 
Код

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

как то меня это спасло от закарючек...


--------------------
user posted image
PM WWW ICQ   Вверх
Tony
Дата 4.2.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

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



Цитата(tux @ 4.2.2007,  23:04)
Нужно править конфиг Томката. В файле conf/server.xml найди тэг Connector, у которого атрибут port="8080" и добавь в Connector еще один атрибут - URIEncoding="UTF-8". То есть у тебя должно получится что-то такое:
Код

    <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />

Фильтр будет работать только для метода POST, правила, по которым кодируются URL'ы метода GET задаются самим веб-контейнером.

Хм.. Но ты же не всегда имеешь доступ к server.xml. 


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
tux
Дата 4.2.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(Tony @  4.2.2007,  23:13 Найти цитируемый пост)
Хм.. Но ты же не всегда имеешь доступ к server.xml.  

Тогда твои проблемы перекладываются на плечи администратора.
PM MAIL Skype GTalk Jabber YIM   Вверх
Иван Человеков
Дата 5.2.2007, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ой спасибо tux!  smile  Работает  smile Никаких и фильтров ненадо smile

Добавлено @ 07:47 
P.S. Ребята спасибо за обсуждение smile
PM ICQ   Вверх
tux
Дата 5.2.2007, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(Иван Человеков @  5.2.2007,  07:40 Найти цитируемый пост)
Никаких и фильтров ненадо

Ошибаешься, фильтр все равно нужен будет когда будешь использовать POST.
PM MAIL Skype GTalk Jabber YIM   Вверх
Иван Человеков
Дата 6.2.2007, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Хм... поменял запрос на post, верно работает также как и get. 
1. Может в данном случае и без фильтра можно обойтись? Ведь обходится же smile
2. Как я знаю: способ передачи get передаёт параметры в url после знака вопрос, параметры разделяются амперсандрами. Способ передачи post передаёт параметры в содержании страницы. Кроме перечисленных мною различий есть разница какой способ передачи данных на сервер get или post использовать?
3. Какой использовать в данном случае?

Спасибо tux за помощь smile
PM ICQ   Вверх
tux
Дата 6.2.2007, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(Иван Человеков @  6.2.2007,  06:28 Найти цитируемый пост)
Может в данном случае и без фильтра можно обойтись? Ведь обходится же smile

Видимо в сервлете кодировка запроса выставляется. Вроде Tomcat в любви к кириллице замечен не был.

Цитата(Иван Человеков @  6.2.2007,  06:28 Найти цитируемый пост)
Какой использовать в данном случае?

Обычно предпочитают в формах использовать POST если нет явной необходимости обратного. У GET есть кой-какие ограничения. Например, большой текст им не передашь. Переход по ссылке - это, естественно, GET.
PM MAIL Skype GTalk Jabber YIM   Вверх
Иван Человеков
Дата 6.2.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



tux, благодарен за разъяснения smile
PM ICQ   Вверх
spbnvb
Дата 15.6.2008, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Насчет правки томкатовского конфига и URI Encoding:
Скажите, кодировку задавать в стиле java, или windows? То есть в моем случае это будет Cp1251, или windows-1251?

Это сообщение отредактировал(а) spbnvb - 15.6.2008, 08:59
PM MAIL WWW   Вверх
tux
Дата 15.6.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(spbnvb @  15.6.2008,  08:57 Найти цитируемый пост)
Скажите, кодировку задавать в стиле java, или windows? То есть в моем случае это будет Cp1251, или windows-1251?

Никогда про такие стили не слышал. Есть перечень кодировок, зарегистрированных IANA (http://www.iana.org/assignments/character-sets), согласно ему у кодировки одно имя - windows-1251.
PM MAIL Skype GTalk Jabber YIM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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