使用Spring MVC时如何在Freemarker视图中设置内容类型?

kay*_*ahr 6 spring freemarker spring-mvc

我正在使用Sping MVC和freemarker视图.我设置了一个FreeMarkerViewResolver来解析视图,它到目前为止工作但现在我有编码问题.我的所有视图都是UTF-8编码的HTML 5页面,我还在<meta charset="UTF-8" />HTML页面中添加了一个,但字符仍然以错误的编码打印.我用curl检查了HTTP标头,发现了这个:

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

但是,当我请求一些不存在的资源(生成Tomcat错误)时,我得到了这个:

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

因此Tomcat本身返回正确的内容类型,但Spring MVC Freemarker视图不会.

对于JSP,我可以在JSP标头中设置Content-Type,但是在哪里可以为freemarker模板设置它?我想我必须在Spring bean配置中的某个地方做这个,但我找不到合适的地方.

Boz*_*zho 9

视图解析器(应该在您的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>
Run Code Online (Sandbox Code Playgroud)


Roh*_*der 6

当使用spring框架和freemarker模板时,我也遇到了显示UTF-8字符(æ.ø和å等特殊字符)的问题.

我做的是.

1.确保您的.ftl页面使用utf-8进行编码 确保即使您已设置了所有其他要求,未使用UTF-8字符集编码的页面也可能显示错误的数字,这一点非常重要.检查IDE设置,找出它将文件设置为的默认编码.我想今天Eclipse和NetBeans都将UTF-8编码的所有文件设置为标准.您必须确保它在没有BOM的情况下编码UTF-8.

2.在模板文件中包含元标记以设置字符集 在模板(.ftl)文件中,该文件包含您的<head>标记<meta>,使用该属性设置a 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, "/*");
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

4.在配置器和视图解析器中设置FreeMarker字符编码 您还需要使用UTF-8对所有FreeMarker文件进行标准编码,这可以通过在FreeMarkerConfigurer和FreeMarkerViewResolver中将其属性设置为UTF-8来完成.这是在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;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助你 :)

  • 谢谢你!对我来说,关键的缺失部分是在 FreeMarkerViewResolver 上配置内容类型,我使用的是通过调用 ViewResolverRegistry.freeMarker() 设置的默认值。事实上,一旦我设置了这个,大多数其他编码配置就变得多余了。 (2认同)