![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Tirael |
|
||||||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 31.1.2006 Где: Москва Репутация: 1 Всего: 7 |
Делаю простейшее приложение на сервлетах. Суть: Есть HTML страница с одним полем. Вводишь в поле (например) свое имя, страница обнавляется и выводится "Привет" + то, что ты ввел. Решил приделать к программе неколько фильтров.
Собственно три вопроса: №1: Хочу вводимую информацию проверять на наличие спец символов. Если таковые имеются. то заменять их на коды. Например, спецсимвол © заменяется на © Написал и задеплоил фильтр. Но не работает. Код фильтра
Как сделать так чтоб работал. Может стоит фильтровать не вводимую информацию, а выводимую? Но тогда ведь очень накладно получается. №2 Хотел сделать счетчик. Создал класс Counter
Создал и прописал фильтр
в самой программе ( в сервлете) пишу
И все вроде бы работает, но криво. А именно: Вводишь в строку адреса расположение сервлета ( http://bla-bla:8080/hello), счетчик показывает 0. Вводишь информацию в поле, кликаешь кнопку, страница обнавляется ( в адресной строке уже http://bla-bla:8080/hello?username=BLA-BLA-BLA ). Выводится 1. Все бы хорошо. Но если опять перейти по адресу http://bla-bla:8080/hello, то опять выведется 0. Вводим в поле данные, жмем кнопку, уже выводиться не 1, а 2. Как сделать по нормальному ? № 3 Если ввести в поле русские символы, то потом они выводяться криво ( каракулями), хотя вроде кодировку меняю в фильтре. CharSetEncodingFilter
Вот код самих сервлетов : GreetingServlet
ResponseServlet
--------------------
|
||||||||||||||
|
|||||||||||||||
| tux |
|
||||||||||||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Обрати внимание, что получаешь ты параметр (request.getParameter()), а потом устанавливаешь атрибут (request.setAttribute()), а в сервлете получаешь опять параметр. Изменение значений параметров в Servlet API не предусмотрено, поэтому придется обходиться какими-то другими вариантами, например, получать в сервлете атрибут вместо параметра, предполагая что фильтр у тебя уже поработал.
Могу предположить, что страница сохраняется в кэше браузера и показывается без запроса к серверу. Попробуй в метаинформации html-страницы установить что-нибудь такое:
То есть у тебя в сервлете будет примерно так:
Если бы фильтр не работал у тебя бы скорее всего (не знаю какой веб-контейнер) выводились не каракули, а знаки вопроса. Попробуй проверить использование кодировок. Вот здесь:
у тебя второй раз кодировка запроса устанавливается (первый в фильтре). Попробуй ее просто убрать, а первую строку заменить на такую:
И проверь везде ли у тебя UTF-8. Кодировку для response в фильтре тоже в общем-то устанавливать не нужно. |
||||||||||||
|
|||||||||||||
| Bulat |
|
||||||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
1) Могу еще посоветовать такой способ:
посмотри простейший пример использования jsp. В jsp используются либо коды html - для статической части, либо скриптлеты(коды java) - для динамической части. Чтоб при запуске сразу выводить эту страничку в методе doGet прописиываешь:
message - то, что вводит пользователь(ниже прояснится) URL - соответственно где твоя страница jsp находится На странице jsp:
Здесь URL - где находится класс сервлета А в методе doPost:
2) По поводу кодировки тебе уже отписали, но почитай может что полезное еще почерпнешь http://jug.in.ntu-kpi.kiev.ua/forum/posts/list/49.page 3) А по поводу количества посещений у самого руки еще не дошли чтоб разобраться, но попробуй как атрибуты сессии P.S. Писал в торопях, поэтому тупо не копируй коды, возможно(даже очень) где-то ошибка. Модератор: P.S.S. Как-то надо улучшать культуру письма, так ведь тебя никто не поймет. Это сообщение отредактировал(а) tux - 7.4.2006, 10:45 -------------------- менеджер по кодеврайтингу |
||||||
|
|||||||
| Tirael |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 31.1.2006 Где: Москва Репутация: 1 Всего: 7 |
tux, спасибо
Да, действительно, я сначала не разобрался в чем отличие Parameter от Attribute. Потом почитал спецификацю, стало понятно. Сейчас в фильтре приделываю аттрибут request.setAttribute("hitCounter",userCounter); , а в основоном сервлете его считываю String username=(String)request.getAttribute("username");. Все работает.
Да, действительно, так и было. Вставил meta-данные и все стало хорошо.
Да, действительно, до того как появился фильтр кодировки показывались знаки вопроса. Но где еще можно проверить использование кодировки ? Ведь филтр по-идее все уже сделал?? Bulat, конечно JSP это хорошо. Но в данный момент меня интересуют именно сервлеты. Конкретнее - фильтры и листенеры. ))) tux, нажал было [+], а мне сказали что 16 постов это мало. Надо 100 Это сообщение отредактировал(а) Tirael - 7.4.2006, 12:21 --------------------
|
||||
|
|||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 16 Всего: 151 |
Поможем... -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
Судя по тому что ты хочешь сделать, вообще, удобнее использовать jsp. Ну а если именно фильтры тебя интересуют то лучше, чем уже написали выше, вряд ли что-то посоветую. Кстати при создании сервлетов jsp играет не самую последную роль. -------------------- менеджер по кодеврайтингу |
|||
|
||||
| Tirael |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 31.1.2006 Где: Москва Репутация: 1 Всего: 7 |
И все таки, после всего сказанного не могу разобраться с кодировкой.
ВВожу в поле русские буквы, а на страницу выводятся каракули. Как ни старался. Везде вроде поставленно UTF-8. Заметил еще один глюк. Не все спец символы отображаются корректно. Так, например, символ > заменяется на > , но символ © почему-то заменяется на ©. Наверное дело тоже в кодировке. Уже полголовы сломал. Это сообщение отредактировал(а) Tirael - 9.4.2006, 12:24 --------------------
|
|||
|
||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
||||
|
||||
| Tirael |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 31.1.2006 Где: Москва Репутация: 1 Всего: 7 |
--------------------
|
|||
|
||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Если метод в форме поменять на POST и добавить в ResponseServlet его обработку (метод doPost()), то все работает. Почему не работает GET пока не могу сказать. Будут новости, напишу.
|
|||
|
||||
| Tirael |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 31.1.2006 Где: Москва Репутация: 1 Всего: 7 |
Н-да ....действительно ....пути господни неисповедимы
--------------------
|
|||
|
||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Вспомнил наконец в чем проблема, склероз отпустил.
Так вот, методы GET и POST работают по-разному. В методе POST все параметры запроса передаются отдельно от строки запроса URI и вызов request.setCharacterEncoding() влияет как раз на обработку этих отдельных параметров. В методе GET параметры передаются в самой строке запроса, а каким образом настроить декодирование запроса будет зависеть от конкретного сервера. Для JBoss (если в качестве веб-контейнера Tomcat, что скорее всего) проблема решается таким образом:
|
|||
|
||||
| Tirael |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 31.1.2006 Где: Москва Репутация: 1 Всего: 7 |
tux, спасибо за разьеснение.
Кстати, хотелось бы знать, откуда такого рода информацию можно подчерпнуть. Дабы не плодить темы, задам следующий вопрос, так же про сервлеты. Как видно выше, мое приложение состоит из двух сервлетов:
Так вот, как ограничить доступ к ResponseServlet, так чтобы, например, запросы http://bla-bla:8080/response не обрабатывались, либо шла переадресация на http://bla-bla:8080/hello Это сообщение отредактировал(а) Tirael - 11.4.2006, 22:23 --------------------
|
|||
|
||||
| tux |
|
||||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Про фильтры, устанавливающие кодировку запроса, писалось много где и неоднократно, например, здесь - http://www.getinfo.ru/article296.html. А про URIEncoding не помню где читал, настолько давно, что едва вспомнил.
Можно, опять-таки, использовать фильтры. Обнаруживаешь в запросе response и переадресуешь на hello, вроде должно работать. |
||||
|
|||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |