LINUX.ORG.RU

Кириллица в Веб-приложении (Java EE)

 , , ,


0

1

Создал веб-приложение (IDE NetBeans 7.4, версия Java EE 6 web, сервер Glassfish 4.0). Передаю параметр из одной страницы на другую. Для корректной работы с кириллицей добавил фильтр. Все работает идеально. Затем, для работы с базой данных, добавил классы сущностей и сеансные компоненты. И теперь, при передаче параметра, на странице отображаются иероглифы. Хотя в адресной строке параметр отображается корректно. (Параметр не из БД, а вводимое в текстовое поле значение.) Для эксперимента, удалил сеансные компоненты - все опять работает хорошо. Т. е. при добавлении сеансных компонентов запрос обходит фильтр стороной. Подскажите, как исправить. Заранее благодарен!

Попробуй добавить это в sub-web.xml

<locale-charset-info default-locale="">
    <locale-charset-map locale="" charset=""/>
    <parameter-encoding default-charset="UTF-8"/>
  </locale-charset-info>
и отключи фильтры. Позволь полюбопытствовать, зачем использовать glassfish 4 для jee 6?

f1xmAn ★★★★★ ()
Ответ на: комментарий от f1xmAn

удалил фильтр, добавил вышеуказанный код в файл glassfish-resources.xml (т.к. sub-web.xml нет) и ничего...

«зачем использовать glassfish 4 для jee 6?» - я просто создаю приложение по примеру с сайта netbeans.org, а там проект реализован на netbeans 6.9, jee 6 и glassfish 3, но т.к. последняя версия netbeans 7.4 со встроенным glassfish 4 - решил использовать его.

rielter_al ()
Ответ на: комментарий от rielter_al

Ну так и пиши на jee 7. Расскажи, что происходит с вводимым текстом? Ты ввел текст в форму, нажал кнопочку, в сервлете через дао этот текст сохраняется в базу, оттуда тем же дао в другом сервлете извлекается наружу и вокруг него генерируется новая jsp страница?

f1xmAn ★★★★★ ()
Ответ на: комментарий от f1xmAn

Вообще, выкидывай проект на гитхаб, толпой обругаем, но проблему, думаю, решим.

f1xmAn ★★★★★ ()
Ответ на: комментарий от f1xmAn

index.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <form action="second">
            <input name="nplat" id="nplat" type="text" value="" />
            <input type="submit" value="Подтвердить" />
        </form>
    </body>
</html>

second.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        ${param.nplat}
    </body>
</html>
ControllerServlet.java - контроллер
package controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author PuhovAG
 */
@WebServlet(name = "ControllerServlet", loadOnStartup = 1,
        urlPatterns = {"/second"})
public class ControllerServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String userPath = request.getServletPath();

        if (userPath.equals("/second")) {
            // TODO: Implement update cart action
        } 

        String url = "/WEB-INF/view" + userPath + ".jsp";

        try {
            request.getRequestDispatcher(url).forward(request, response);
        } catch (IOException | ServletException ex) {
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String userPath = request.getServletPath();

//        if (userPath.equals("/second")) {
//            // TODO: Implement update cart action
//        }

        String url = "/WEB-INF/view" + userPath + ".jsp";

        try {
            request.getRequestDispatcher(url).forward(request, response);
        } catch (IOException | ServletException ex) {
        }
    }
}
filter_cyr.java - фильтр
package filter;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(filterName = "filter_cyr", urlPatterns = {"/*"})
public class filter_cyr implements Filter {

    private static final boolean debug = true;

    private FilterConfig filterConfig = null;

    public filter_cyr() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {

        request.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }
...
...
...
}
просто передаю параметр из одной страницы в другую, БД вообще не затрагивается.

пробовал в начало страниц вставлять

<% request.setCharacterEncoding("UTF-8"); %>
- не помогло.

P.S. добавляю сеансовые компоненты для сущностных классов в netbeans: Новый файл -> Персистентность -> Сеансовые компоненты для сущностных классов, перезагружаю glassfish - фильтр не работает. Удаляю пакет с сеансовыми компонентами, перезагружаю glassfish - фильтр работает.

rielter_al ()

Заголовки http ответов/запросов покажи для начала.

anonymous ()
Ответ на: комментарий от rielter_al

Скастуешь меня вечером, если никто не поможет, будем разбираться. А сейчас убегаю.

f1xmAn ★★★★★ ()
Ответ на: комментарий от anonymous

вбиваю в текстовое поле «Александр», нажимаю кнопку «Подтвердить», в запросе вижу следующее: http://localhost:8080/WA/second?nplat=Александр, а на второй странице: Александр

Удаляю сеансовые компоненты, запрос тот же, на второй странице вижу: Александр.

Не могу понять как сеансовые компоненты влияют на приложение, если я БД пока вообще не использую?!

rielter_al ()
Ответ на: комментарий от rielter_al

Ок, в обед внимательно посмотрю и отпишусь.

f1xmAn ★★★★★ ()
Ответ на: комментарий от f1xmAn

И покажи свои сеансные компоненты, как собираешь и деплоишь.

f1xmAn ★★★★★ ()
Ответ на: комментарий от f1xmAn

настройка кодировки в нетбинсе на utf-8 не дала результатов.

По поводу того как все делаю: 1) создал веб-приложение 2) создал нужные странички (index.jsp и view/second.jsp) 3) создал контроллер и настроил его:

package controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "Controller", urlPatterns = {"/second"})
public class Controller extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=UTF-8");
        req.setCharacterEncoding("UTF-8");
        super.service(req, resp); //To change body of generated methods, choose Tools | Templates.
    }
  
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String userPath = request.getServletPath();
        String url = "/WEB-INF/view" + userPath + ".jsp";

        try {
            request.getRequestDispatcher(url).forward(request, response);
        } catch (IOException | ServletException ex) {
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }
}
4) запускаю приложение - все работает идеально! Заметил следующее: если в контроллере переопределить метод service(), то фильтр не нужен.

5) Создаю ресурс JDBC (Создать файл -> Glassfish -> Ресурс JDBC)

6) создаю и настраиваю web.xml файл (Ссылки - Ссылки на ресурс - Добавить)

7) запускаю приложение - все работает идеально!

8) добавляю классы сущностей (Новый файл -> Персистентность -> Классы сущностей из базы данных)

9) запускаю приложение - все работает идеально!

10) Добавляю сеансные компоненты (Новый файл -> Персистентность -> Сеансовые компоненты для сущностных классов)

11) запускаю приложение - и начались проблемы с кодировкой!

Пробовал как на ubuntu 12.04 с mysql server 5.6, так и на windows 7 c mysql server 5.5 - результат один и тот же! Использовал разные базы - все тоже самое!

Пример по поводу добавления классов сущностей и сеансных компонентов взят отсюда: https://netbeans.org/kb/docs/javaee/ecommerce/entity-session_ru.html

rielter_al ()
Ответ на: комментарий от f1xmAn

зачем использовать glassfish 4 для jee 6?

Потому что GlassFish — это RI, Reference Implementation Java EE.

iZEN ★★★★★ ()
Ответ на: комментарий от rielter_al

Кстати, та же фигня с кириллицей на JSF/JPA.

iZEN ★★★★★ ()
Ответ на: комментарий от iZEN

Для jee 6 нужно использовать 3-й glassfish по одной простой причине — 4-й сырой. Это неимоверная дрянь. Иной раз после редеплоя не знаешь, в приложении баг или это косяк глассфиша и часто бывает, что рестарт домена избавляет от проблем. 4-ю версию есть смысл использовать в том случае, если ты пишешь на jee 7, для которой его и наиндусили.

f1xmAn ★★★★★ ()
Ответ на: комментарий от rielter_al

4-й глассфиш по умолчанию использует кодировку ISO8859-1, если выбрать её, то все работает как надо. Содержимое файлика, которое я тебе скидывал, помогало пофиксить кодировку на 3-м глассфише, но тут, видимо, это делается как-то иначе. Надо гуглить, я хз. Как временный вариант могу предложить настроить везде кодировку на ISO8859-1, чтобы браузер её безошибочно распознавал.

f1xmAn ★★★★★ ()
Ответ на: комментарий от anonymous

Но вообще забавно, как шалтая болтая не могут собрать и советуют рецепты уровня «переустанови офтопик».

anonymous ()
Ответ на: комментарий от anonymous

исходя из твоих комментариев и оказанной помощи, можно сделать аналогичные выводы. заголовки показаны выше.

rielter_al ()
Ответ на: комментарий от rielter_al

заголовки показаны выше.

В упор не вижу. Ты точно прочитал статью?

anonymous ()
Ответ на: комментарий от f1xmAn

решил проблему переустановкой glassfish с 4 на 3.1.2.2 - и все работает!!! всем спасибо!

rielter_al ()
Ответ на: комментарий от rielter_al

исходя из твоих комментариев и оказанной помощи

Увы, я телепатом не каждый день бываю. Мне нужна некоторая инфа, а ты начинаешь нос задирать.

anonymous ()
Ответ на: комментарий от rielter_al

ну там где показан текст index.jsp и second.jsp

omg. Это не HTTP заголовки. Удачи, тебе придется нелегко.

anonymous ()
Ответ на: комментарий от anonymous

да... провтыкал, спасибо, впредь буду внимательней! но все равно проблема решена. а не подскажешь как glassfish 4 подружить с UTF-8?

rielter_al ()
Ответ на: комментарий от php-coder

php-coder, спасибо! указанная вами статья помогла справиться с кодировкой в glassfish 4!

rielter_al ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.