2011-09-04 70 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; 
} 

希望這可以幫助你:)

相關問題