Как установить тип контента в представлениях Freemarker при использовании Spring MVC? - PullRequest
6 голосов
/ 05 сентября 2011

Я использую Sping MVC с представлениями свободного маркера.Я установил FreeMarkerViewResolver для разрешения представлений, и пока он работает, но теперь у меня проблемы с кодированием.Все мои представления - это страницы HTML 5 в кодировке UTF-8, и я также добавил <meta charset="UTF-8" /> на страницу HTML, но символы по-прежнему печатаются в неправильной кодировке.Я проверил заголовки HTTP с помощью curl и обнаружил следующее:

k@jules:~$ curl -I http://localhost:8080/testweb/test.view
HTTP/1.1 200 OK
Content-Type: */*;charset=ISO-8859-1

Но когда я запрашиваю какой-то несуществующий ресурс (который генерирует ошибку Tomcat), я получаю это:

k@jules:~$ curl -I http://localhost:8080/testweb/nothere.html
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8

Таким образом, Tomcat сам возвращает правильный тип содержимого, а представления Spring MVC Freemarker - нет.

Для JSP я могу установить Content-Type в заголовке JSP, но где я могу установитьэто для шаблона freemarker?Я думаю, мне нужно сделать это где-нибудь в конфигурации bean-компонента Spring, но я не могу найти правильное место.

Ответы [ 2 ]

9 голосов
/ 05 сентября 2011

Средство разрешения вида (должно быть в вашем dispatcher-servlet.xml) имеет свойство contentType для этого:

<bean id="viewResolver"
   class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="prefix" value=""/>
    <property name="suffix" value=".ftl"/>
    <property name="contentType" value="text/html;charset=UTF-8"/>
</bean>
6 голосов
/ 18 октября 2013

У меня также возникла проблема с отображением символов UTF-8 (специальных символов, таких как æ. Ø и å и т. Д.), При использовании Spring Framework и шаблона Freemarker.

То, что я сделал, было.

1. Убедитесь, что ваша страница .ftl имеет кодировку utf-8 Это важно для того, чтобы страница, не закодированная в кодировке UTF-8, могла показывать неправильные числа, даже если у вас установлены все другие требования. Проверьте настройки IDE, чтобы узнать, какой кодировке по умолчанию она устанавливает ваши файлы. Однако сегодня я думаю, что Eclipse и NetBeans устанавливают все файлы с кодировкой UTF-8 в качестве стандарта. Вы должны убедиться, что это кодировка UTF-8 без спецификации.

2. Включите метатег в файл шаблона, чтобы установить кодировку В файле шаблона (.ftl), в котором содержится тэг <head>, установите <meta> с атрибутом charset="UTF-8". Это если вы используете HTML 5. Если вы используете xhtml или HTML 4, ваш метатег должен выглядеть следующим образом

  • HTML 5 <meta charset="UTF-8" />
  • HTML 4 / XHTML <meta http-equiv="content-type" content="text/html; charset=utf-8"/>

3. Убедитесь, что вы установили фильтр кодировки символов в файле дескриптора развертывания Вы должны отфильтровать все входящие / исходящие запросы через фильтр кодировки символов. Этот фильтр устанавливается в дескрипторе развертывания (web.xml / или Java-эквивалент WebApplicationInitializer).

WebApplicationInitializer (файл Java)

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    registerCharacterEncodingFilter(servletContext);
}

/**
 * Filter all incoming requests with character encoding UTF-8
 * @param servletContext 
 */
private void registerCharacterEncodingFilter(ServletContext servletContext) {
    CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
    encodingFilter.setEncoding("UTF-8");
    encodingFilter.setForceEncoding(true);
    FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("characterEncodingFilter", encodingFilter);
    characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
}

web.xml

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

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

4. Установите кодировку символов FreeMarker в конфигураторе и просмотрите распознаватель Вам также необходимо сделать так, чтобы все ваши файлы FreeMarker были стандартно закодированы с помощью UTF-8, это делается путем установки их свойств в UTF-8 в FreeMarkerConfigurer и FreeMarkerViewResolver. Это установлено в вашем файле контекста приложения Spring (я покажу только эквивалент Java, так как он совпадает с файлом XML).

/**
 * FreeMarker Configurer will help configure different settings of
 * the FreeMarker template engine.
 * 
 * @return an object of the FreeMarkerConfigurer class.
 */
@Bean
public FreeMarkerConfigurer freemarkerConfig() {
    FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
    freeMarkerConfigurer.setTemplateLoaderPath("/templates/");
    freeMarkerConfigurer.setDefaultEncoding("UTF-8");
    return freeMarkerConfigurer;
}

/**
 * The View resolver to use when resolving FreeMarker views.
 * 
 * @return the View Resolver Object used to resolve FreeMarker views.
 */
@Bean
public FreeMarkerViewResolver viewResolver() {
    FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
    viewResolver.setPrefix("");
    viewResolver.setSuffix(".ftl");
    viewResolver.setCache(false);   //Set to true during production
    viewResolver.setContentType("text/html;charset=UTF-8");
    return viewResolver;
}

Надеюсь, это поможет вам:)

...