Из Веб-формы возвращается неверная кодировка

Рейтинг: 1Ответов: 3Опубликовано: 02.02.2011

С веб-формы после выполнения запроса, строчки на русском языке приходят в испорченном виде. В самом сервлете я напрямую задаю

request.setCharacterEncoding("utf-8");

Веб страница с формой также имеет все необходимые атрибуты:

<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>

В предобработке запроса стоит два фильтра: один на загрузку файлов, второй - на логирование, их влияние на запрос исключено, так как первый прорверяет enctype и срабатывает только в том случае, если он multipart, второй никаких преобразований с данными объекта request не делает.

Web application использует следующее компоненты:

  1. Java(TM) SE Runtime Environment (build 1.6.0_06-b02), Java HotSpot(TM) Client VM (build 10.0-b22, mixed mode, sharing)
  2. Tomcat 6 -server -Xmx1024m -Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8

Добавление

Это обработчик запроса в сервлете

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {           
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
    String folder = getActionName(request);
    Action action = factory.create(folder);
    String url = null;
    try {
        url = action.perform(request, response);
    }
    catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    if (url != null)
        getServletContext().getRequestDispatcher(url).forward(request, response);
}

Далее он передает request & response в соответствующий класс, обработчик которого приведен ниже

public String perform(HttpServletRequest request, HttpServletResponse response)
{
    InputStream iS = MainServlet.context.getResourceAsStream("/WEB-INF/UserManagement/WebForm.xml");
    Properties webform = new Properties();
    try {
        webform.loadFromXML(iS);
    } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
    Integer uGID = null;
    try {

        if(request.getSession().getAttribute("GID")!=null)
            uGID = (Integer)request.getSession().getAttribute("GID");
        else
            uGID = 0;
    } catch (Exception e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
    if (uGID==1) {
        Integer UID = null;
        Integer GID = null;
        String action = request.getParameter("action");
        //Locale usual = Locale.getDefault();
        //Locale.setDefault(new Locale("ru","RU"));
        String Name = request.getParameter("Name");
        String Login = request.getParameter("Login");
        String Password = request.getParameter("Password");
        //Locale.setDefault(usual);            
        String q = "";
        MyDB oracle = new MyDB(MyDB.Oracle);
        CallableStatement cs;
        ResultSet rs;

        try {
            if (request.getParameter("UID")!=null) {
                UID = Integer.parseInt(request.getParameter("UID"));
            }
            if (request.getParameter("GID")!=null) {
                GID = Integer.parseInt(request.getParameter("GID"));
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

        try {
            if(action.equals("remove"))
            {
                cs = oracle.conn.prepareCall("begin deleteusers(:1); end;");
                cs.setString(1,Integer.toString(UID));
                cs.execute();
            }
            else if(action.equals("adduser"))
            {
                q = "begin adduser(:1,:2,:3,:4,:5); end;";
                cs = oracle.conn.prepareCall(q);
                cs.setString(1,Login);
                cs.setString(2,Password);
                cs.setString(3,Integer.toString(GID));
                cs.setString(4,Name);
                cs.registerOutParameter(5, Types.INTEGER);
                cs.execute();
                System.out.println("Login:"+Login+" Password:"+Password+" Name:"+Name);
                if(cs.getInt(5)>0)
                {
                    request.getSession().setAttribute("errorMsg", webform.getProperty("AlreadyExists"));
                }
                else if(cs.getInt(5)==-1)
                {
                    request.getSession().setAttribute("errorMsg", webform.getProperty("Empty"));
                }

            }
            else if(action.equals("edituser"))
            {
                q = "begin ediuser (:1,:2,:3,:4,:5,:6); end;";
                cs = oracle.conn.prepareCall(q);
                cs.setString(1,Integer.toString(UID));
                cs.setString(2,Login);
                cs.setString(3,Password);
                cs.setString(4,Name);
                cs.setString(5,Integer.toString(GID));
                cs.registerOutParameter(6, Types.INTEGER);
                cs.execute();
                if(cs.getInt(6)>0)
                {
                    request.getSession().setAttribute("errorMsg", webform.getProperty("ErrorChanging"));
                }
                else if(cs.getInt(6)==-1)
                {
                    request.getSession().setAttribute("errorMsg", webform.getProperty("Empty"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        //System.out.println(q);

        oracle.close();
    }
    else
    {
        request.getSession().setAttribute("errorMsg", webform.getProperty("AccessDenied"));
    }
    return "/UserManagement.jsp";
}

ну и напоследок сама UserManagement.jsp

<div><h2><%=webform.getProperty("Adding")%></h2></div>
<form action="${urlForm}">
    <table cellpadding="10" cellspacing="10">
        <tr><td><%=webform.getProperty("Name")%></td><td><input type="text" class="text" name="Name"></td></tr>
        <tr><td><%=webform.getProperty("Login")%></td><td><input type="text" class="text" name="Login"></td></tr>
        <tr><td><%=webform.getProperty("Password")%></td><td><input type="password" class="text" name="Password"></td></tr>
        <tr><td><%=webform.getProperty("Group")%></td><td>
            <select name="GID">
                <% for(Integer key: groups.keySet()){%>
                <option value="<%=key%>"><%=groups.get(key)%></option>
                <% } %>
            </select>
        </td></tr>
        <tr><td colspan="2"><input class="button" type="submit" value="<%=webform.getProperty("Add").trim()%>"></td></tr>
    </table>
    <input type="hidden" name="action" value="adduser">
</form>

Ответы

Ответов пока нет.