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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Content Type по умолчанию для JSP, как поменять? 
V
    Опции темы
3,14
Дата 21.8.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Если в JSP странице не указан тэг
Код

<%@ page contentType="..." pageEncoding="..."%>


то по умолчанию используется text/html;charset=ISO-8859-1 (charset вроде из настроек локали берётся). Можно ли как то в настройках веб приложения указать чтоб вместо "text/html;..." иопльзовался, например, "application/vnd.wap.xhtml+xml;UTF-8"

Ну или вообще не выставлял. Второй вариант даже лучше smile


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ivg
Дата 21.8.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



Фильтр поставьте.
PM MAIL   Вверх
mbasil
Дата 21.8.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это лишь пример, который можно взять за основу, добавляя что желаете типа
    <param-name>CONTENT_TYPE</param-name>
    <param-value>text/html; charset=windows-1251</param-value>
а потом
     response.setContentType( ContentType );

В web.xml:
Код

    <!-- Filter to set character encoding on each request.
    -->
      <filter>
        <filter-name>setCharacterEncoding</filter-name>
        <filter-class>filters.SetCharEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF8</param-value>
          <param-name>ignore</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
    <!-- Filter mapping to apply the "setCharacterEncoding"
         filter to *all* requests processed by this web application
    -->
      <filter-mapping>
        <filter-name>setCharacterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>


Фильтр:
Код

    package filters;
    
    import java.io.IOException;
    import javax.servlet.*;
    
    public class SetCharEncodingFilter implements Filter
    {
     protected String encoding = null;
     private FilterConfig fConfig = null;
     /**
      * Должна ли игнорироваться кодировка установленная клиентом
      */
     protected boolean ignore = true;
    //-------------------------------------------
    public void init( FilterConfig filterConfig )
        throws ServletException
    {
       fConfig = filterConfig;
       encoding = filterConfig.getInitParameter("encoding");
       String value = filterConfig.getInitParameter("ignore");
       if( value == null )                      ignore = true;
       else if( value.equalsIgnoreCase("true")) ignore = true;
       else if( value.equalsIgnoreCase("yes") ) ignore = true;
       else                                     ignore = false;
    }
    /**
     * Извлекает и устанавливает кодировку символов (если задана)
     *
     * @param request Обрабатываемый запрос
     * @param response Ссылка на создаваемый ответ
     * @param chain Цепочка фильтров
     *
     * @exception IOException если происходит ошибка ввода/вывода
     * @exception ServletException в случае ошибки сервлета
     */
    public void doFilter( ServletRequest request,
                          ServletResponse response,
                          FilterChain chain )
        throws IOException, ServletException
    {
     if( encoding != null && 
        ( ignore || request.getCharacterEncoding() == null ) )
      {
         request.setCharacterEncoding( encoding );
      }
     // передает контроль на следующий фильтр
       chain.doFilter( request, response );
    }
    //-------------------
    public void destroy()
    {
       encoding = null;
       fConfig = null;
}



Это сообщение отредактировал(а) mbasil - 21.8.2008, 19:49
PM MAIL   Вверх
3,14
Дата 21.8.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Фильтр и так есть. Как раз в том и проблема, что значение, выставленное фильтром, перебивается при создании jsp.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ivg
Дата 21.8.2008, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



А покажите код фильтра и конфиг его.
PM MAIL   Вверх
ivg
Дата 21.8.2008, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



Цитата(3 @ 14, 21.8.2008,  23:48 Найти цитируемый пост)
Фильтр и так есть. Как раз в том и проблема, что значение, выставленное фильтром, перебивается при создании jsp.

Ну не знаю, у меня работает. Tomcat 6.0.13 
Код

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {
        chain.doFilter(request, response);
        response.setContentType(null);
        //response.setContentType("application/vnd.wap.xhtml+xml");
    }

PM MAIL   Вверх
3,14
Дата 22.8.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ivg @  21.8.2008,  21:22 Найти цитируемый пост)
А покажите код фильтра и конфиг его. 


Код

package com.nw.ims.cap.web.mobile;

import java.io.IOException;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MobileFilter implements Filter {

    public static final String MPA_REDIRECT_FLAG_KEY = "MPA_REDIRECT_FLAG_KEY";
    public static final String MPA_URL_REWRITING_KEY = "MPA_URL_REWRITING_KEY";
    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest  httpRequest  = new MobileHttpServletRequest((HttpServletRequest) request);
        HttpServletResponse httpResponse = new MobileHttpServletResponse((HttpServletResponse) response);
        httpRequest.setAttribute(MPA_REDIRECT_FLAG_KEY, new Boolean (true));
        
        if (httpRequest.getCookies() == null && 
                httpRequest.getSession().getId() != null) {
            httpRequest.setAttribute(MPA_URL_REWRITING_KEY, new Boolean (true));
        }
        
        String encType = MobileRouter.encType(httpRequest.getHeaders("accept"));
        if (encType != null) httpResponse.setContentType(encType);
        chain.doFilter( httpRequest, httpResponse );
    }

    public void init(FilterConfig arg0) throws ServletException {
    }

}


Говорю сразу, encType возвращается не null, дебажил smile

Код

        <filter>
                <filter-name>MobileFilter</filter-name>
                <filter-class>com.nw.ims.cap.web.mobile.MobileFilter</filter-class>
        </filter>
        ...
        <filter-mapping>
                <filter-name>MobileFilter</filter-name>
                <url-pattern>/*</url-pattern>
        </filter-mapping>


Добавлено через 5 минут и 32 секунды
Собственно что пораждает эту проблему. Вот кусок сгенерированного из jsp java кода:
Код

    public void _jspService(HttpServletRequest request, HttpServletResponse  response)
        throws java.io.IOException, ServletException {

        JspFactory _jspxFactory = null;
        PageContext pageContext = null;
        HttpSession session = null;
        ServletContext application = null;
        ServletConfig config = null;
        JspWriter out = null;
        Object page = this;
        String  _value = null;
        javax.servlet.jsp.tagext.Tag _jspx_curTag = null;

        try {

            if (_jspx_inited == false) {
                synchronized (this) {
                    if (_jspx_inited == false) {
                        _jspx_init();
                        _jspx_inited = true;
                    }
                }
            }
            _jspxFactory = JspFactory.getDefaultFactory();
            response.setContentType("text/html;charset=ISO-8859-1");


Собственно вот этот setContentType и перебивает тот, что был выставлен в фильтре. В этом и проблема :( То, что перебивается именно в этом месте проверял опять же debug-ом...

Сам jsp ни где content type не выставлял...
Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//OPENWAVE//DTD XHTML Mobile 1.0//EN"
      "http://www.openwave.com/dtd/xhtml-mobile10.dtd">

<%@ taglib uri="/imstags" prefix="ims" %>
<%@ page import="com.nw.ims.cap.web.mobile.*" %>
<%@ page import="com.nw.ims.cap.web.util.*" %>
<%@ page import="com.nw.ims.cap.web.uif.mpa.servlet.LoginServlet" %>

<ims:page prefix="pages.login">
<%
    WebBundle wb = new WebBundle(pageContext);
  
    String message = (String) request.getAttribute(LoginServlet.MESSAGE);
  
    if (message == null) {
        message = request.getParameter(LoginServlet.MESSAGE);
    }
    if (message!=null) {
        message = wb.getString(message,false);
    }
%>

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <title><%= wb.getString("pages.common.mpaTitle",false) %></title>
        <meta http-equiv="Cache-Control" content="no-cache"/>
    </head>
    <body>
            <%
                if (message!=null) {
            %>
            <b><%= message %></b>
            <%
                }
            
                String encURL;
                if (request.getAttribute("MPA_URL_REWRITING_KEY") != null) {
                    encURL = response.encodeURL("/mpa/direct/loginServlet");
                } else {
                    encURL = "/mpa/direct/loginServlet";
                }
            %>
            <form action="<%= encURL %>" method="post">
                <%
                    String userName = "";
                    Cookie [] cookies = request.getCookies();
                    if (cookies != null) {
                        for(int i = 0; i < cookies.length; i++) {
                            if (cookies[i].getName().equals("PA.USERNAME")) {
                                userName = cookies[i].getValue();
                                break;
                            }
                        }
                    }
                %>
                <div>
                    <ims:string name="usernamelabel" /><br/>
                    <input type="text" name="userName" size="10" value="<%= userName %>"/><br/>
                </div>
                <div>
                    <ims:string name="passwordlabel" /><br/>
                    <input type="password" name="passwd" size="10" /><br/>
                </div>
                <div>
                    <input type="submit" value="<%= wb.getString("submitlabel") %>" />
                </div>
            </form>
    </body>
</html>
</ims:page>



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
ivg
Дата 22.8.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



3,14, я думал из приведённого мной кода, ключевой момент вы увидите. Установка ContentType должна идти после chain.doFilter( httpRequest, httpResponse );. Вобщем в коде вашего MobileFilter поменяйте местами строки 32 и 33.

Это сообщение отредактировал(а) ivg - 22.8.2008, 14:46
PM MAIL   Вверх
3,14
Дата 22.8.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ivg, извини, не заметил... 
Теперь всё  smile 


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0506 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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