我正在使用带有freemarker视图的Sping MVC。我设置了一个FreeMarkerViewResolver来解析视图,它到目前为止工作但现在我有编码问题。我的所有视图都是UTF-8编码的HTML 5页面,我还在HTML页面中添加了<meta charset="UTF-8" />
,但字符仍然以错误的编码方式打印。我用 curl 检查了HTTP标头,发现了这个:
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,我可以在JSP标头中设置Content-Type,但是在哪里可以为freemarker模板设置它?我想我必须在Spring bean配置中的某个地方执行此操作,但我找不到合适的位置。
答案 0 :(得分: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>
答案 1 :(得分:6)
使用spring framework和freemarker模板时,我也遇到了显示UTF-8字符(æ.ø和å等特殊字符)的问题。
我做的是。
<强> 1。确保您的.ftl页面使用utf-8 进行编码 这是一个重要的事情要确保,即使您已设置了所有其他要求,未使用UTF-8字符集编码的页面也可能显示错误的数字。检查IDE设置,找出它将文件设置为的默认编码。我想今天Eclipse和NetBeans都将UTF-8编码的所有文件设置为标准。您必须确保它没有BOM编码UTF-8。
<强> 2。在模板文件中包含Meta标记以设置字符集
在包含<head>
标记的模板(.ftl)文件中,设置<meta>
,其属性为charset="UTF-8"
。这是因为您使用HTML 5.如果您使用xhtml或HTML 4,您的元标记需要看起来像这样
<meta charset="UTF-8" />
<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字符编码 您还需要使用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;
}
希望这可以帮助你:)