我有一个使用freemarker作为模板语言的Spring MVC Web应用程序。我目前正在进行更改,以刷新html头部分,而不是缓冲整个html并在末尾刷新。我尝试将auto_flush freemarker setting设置为false,并使用如下所示的freemarker的内置指令,但这似乎不起作用。

common-header.ftl
<head>
 .......
</head>
<#flush>

page.ftl
<#include "common-header.ftl" />
<body>
 .......
</body>

非常感谢您的帮助。此外,对于API documentation来说,autoFlush()似乎仅适用于不包含#include语句且需要多个Template.process()方法的页面。如果是正确的话,我应该编写一个自定义模板处理器来处理页面中的头部和正文部分吗?任何指针都会有所帮助。

更新:

尝试使用FreeMarkerView.java作为 View 类,因为它使用HttpServletResponse的默认编写器(PrinterWriter)来处理编写器。尽管PrinterWriter确实支持flush()而且模板中的 freemarker指令似乎都没有调用此方法,但这也不起作用。

尝试扩展FreeMarkerView类,以将PrinterWriter包装在BufferedWriter中,但效果不佳。
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="suffix"><value>.ftl</value></property>
    <property name="contentType"><value>text/html; charset=utf-8</value></property>
    <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
    <property name="exposeSpringMacroHelpers"><value>true</value></property>
</bean>

我将不胜感激。

最佳答案

<#flush>只是在给Writer.flush()Writer上调用Template.process。例如,如果WriterStringWriter,那么flush()调用当然不会做任何事情。将Writer传递给FreeMarker的东西必须确保在调用Writer方法的flush()时做正确的事情。
auto_flush与您的问题无关。 (但您会误解API文档。始终支持auto_flush。文档描述了您要将其设置为false的情况。)

关于带有Freemarker的HTML头冲洗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23661321/

10-10 13:09