2011-09-04 39 views
4

我正在使用Sping MVC with freemarker views。我建立了一个FreeMarkerViewResolver来解析视图,它到目前为止工作,但现在我有编码问题。我的所有视图都是UTF-8编码的HTML 5页面,我还在HTML页面上添加了<meta charset="UTF-8" />,但字符仍然以错误的编码打印。我检查HTTP头,卷曲,发现这个:如何在使用Spring MVC时在Freemarker视图中设置内容类型?

[email protected]:~$ curl -I http://localhost:8080/testweb/test.view 
HTTP/1.1 200 OK 
Content-Type: */*;charset=ISO-8859-1 

但是,当我要求的一些不存在的资源(它生成一个Tomcat错误),那么我得到这样的:

[email protected]:~$ 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,我可以在JSP标头中设置Content-Type,但是我可以在哪里为Freemarker模板设置它?我想我必须在Spring bean配置的某个地方执行此操作,但我无法找到正确的位置。

回答

8

视图解析器(应该在你的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> 
5

我也遇到过与显示UTF-8字符(特殊字符,如æ问题O和a等。 ),当使用spring框架和freemarker模板时。

我做的是。

1.确保.ftl页面编码使用UTF-8 这是为了确保一个重要的事情,那不是UTF-8字符集编码的页面,可能会显示错误的号码,即使你拥有所有其他要求设置。检查你的IDE设置,找出它设置文件的默认编码。不过今天我认为Eclipse和NetBeans都将UTF-8编码的所有文件设置为标准。您必须确保它在没有BOM的情况下编码UTF-8。

2.包括Meta标记在模板文件中设置的字符集 在模板(.ftl)文件,其中包含你的<head>标签,设置<meta>,与属性charset="UTF-8"。这是如果你如果你使用XHTML或HTML 4使用HTML 5,你的meta标签需要像这样

  • 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, "/*"); 
} 

网络。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,这是由它们的属性设置为完成FreeMarkerConfigurer中的UTF-8和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; 
} 

希望这可以帮助你:)

相关问题