使用Spring 4 + Tiles模板+ Freemarker进行utf8编码

时间:2017-02-16 20:01:24

标签: spring spring-mvc freemarker tiles

我尝试将Spring 4(4.3.0。),tiles 3(3.0.7)和FreeMarker 2(2.3.25-incubating)集成到模板定义文件中:

<definition name="base-definition" template="/WEB-INF/views/tiles/layouts/layout.ftl" templateType="freemarker">
    <put-attribute name="title" value="" />
    <put-attribute name="body" value="" />
</definition>

<!-- Home Page -->
<definition name="home" extends="base-definition">
   <put-attribute name="title" value="Welcome" />
   <put-attribute name="body" value="/WEB-INF/views/jsp/home.jsp" />
</definition>

针对home.jsp:

<%@ page errorPage="error.jsp" contentType="text/html; charset=utf-8"%>
....

layouts.ftl:

<!DOCTYPE html>
<html lang="sk">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
....
<title><@tiles.insertAttribute name="title" /></title>
</head>
<body>
<section id="site-content">
<@tiles.insertAttribute name="body" />
</section>
ľščťžýáíéúä
</body>
</html>

我有CustomTilesContainerFactory(使用registerAttributeRenderers函数扩展BasicTilesContainerFactory):

@Override
protected void registerAttributeRenderers(final BasicRendererFactory rendererFactory,
        final ApplicationContext applicationContext, final TilesContainer container,
        final AttributeEvaluatorFactory attributeEvaluatorFactory) {
    super.registerAttributeRenderers(rendererFactory, applicationContext, container, attributeEvaluatorFactory);

    FreemarkerRenderer freemarkerRenderer = FreemarkerRendererBuilder.createInstance()
            .setApplicationContext(applicationContext).setParameter("TemplatePath", "/")
            .setParameter("NoCache", "true").setParameter("ContentType", "text/html")
            .setParameter("template_update_delay", "0").setParameter("default_encoding", "UTF-8")
            .setParameter("number_format", "0.##########")
            .setParameter(SharedVariableLoaderFreemarkerServlet.CUSTOM_SHARED_VARIABLE_FACTORIES_INIT_PARAM,
                    "tiles," + TilesSharedVariableFactory.class.getName())
            .build();
    rendererFactory.registerRenderer(FREEMARKER_RENDERER_NAME, freemarkerRenderer);
}

我有使用createContainerFactory函数的CustomTilesInitializer(扩展DefaultTilesInitializer):

@Override
protected AbstractTilesContainerFactory createContainerFactory(ApplicationContext context) {
    return new CustomTilesContainerFactory();
}

但在网络浏览器中,HTTP响应标题是可以的:

text/html; charset=utf-8

但是当我检查网页的属性(鼠标右键单击)时,请编码“windows-1252”,请问,哪里有问题,为什么没有utf-8?当然,特殊字符存在问题,在layouts.ftl中有“ľščťžýáíéúä”但在web-bowser中是?????ýáíéúä。

谢谢!

1 个答案:

答案 0 :(得分:0)

溶液:

@RequestMapping(value = { "/index" }, method = RequestMethod.GET)
public String homePage(ModelMap model, HttpServletResponse response) {
        response.setContentType("text/html;charset=UTF-8");
        return "home";
}

但是,它不是很好的解决方案:-(在ALL请求映射函数中设置内容类型是否必要?: - (