我有一个使用freemarker作为模板语言的Spring MVC Web应用程序。我目前正在进行更改以刷新html头部分而不是缓冲整个html并在最后进行刷新。我尝试将auto_flush freemarker setting设置为false并使用了freemarker的内置< #flush>指令如下,但似乎不起作用。
common-header.ftl
<head>
.......
</head>
<#flush>
page.ftl
<#include "common-header.ftl" />
<body>
.......
</body>
感谢您对此的帮助。此外,根据API documentation,autoFlush()似乎仅适用于不包含#include语句且需要多个Template.process()方法的页面。如果这是正确的,我应该编写一个自定义模板处理器来处理我页面中的头部和身体部分吗?任何指针都会有所帮助。
更新
尝试使用FreeMarkerView.java作为视图类,因为它使用HttpServletResponse的默认编写器(PrinterWriter)来处理编写器。尽管PrinterWriter支持flush()和&lt; #flush&gt;,但这并不起作用。我的模板中的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>
我很感激任何帮助。
答案 0 :(得分:2)
<#flush>
只需拨打Writer.flush()
Writer
上的Template.process
即可。例如,如果Writer
是StringWriter
,则flush()
来电当然不会做任何事情。将Writer
传递给FreeMarker的事情必须确保Writer
在调用flush()
方法时做出正确的事情。
auto_flush
与您的问题无关。 (但您误解了API文档。auto_flush
始终受到支持。文档描述了您希望将其设置为false
时的情况。)
答案 1 :(得分:1)
不是原始问题的答案,而是@soontobeared评论。我从未收到有关您的评论的通知,对于迟到的回复感到抱歉。
我在开发期间使用缓冲视图,因此我可以捕获各种异常并输出调试等。这将提供对Writer的访问。我使用的是Spring 3.2和FreeMarker 2.3。
BufferedFreeMarkerView.java
package com.example.web;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.view.freemarker.FreeMarkerView;
import freemarker.core.InvalidReferenceException;
import freemarker.template.SimpleHash;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class BufferedFreeMarkerView extends FreeMarkerView {
@Override
protected void processTemplate(Template template, SimpleHash model,
HttpServletResponse response) throws IOException, TemplateException {
StringWriter buffer = new StringWriter(50000);
try {
template.process(model, buffer);
} catch (TemplateException e) {
logger.warn(e.getMessage() + "\n" + e.getFTLInstructionStack(), e);
throw new RuntimeException(e.getMessage() + "\n"
+ e.getFTLInstructionStack(), e);
} // ommited more catches
try (Writer out = response.getWriter()) {
out.write(buffer.toString());
}
}
}
BufferedFreeMarkerViewResolver.java
package com.example.web;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
public class BufferedFreeMarkerViewResolver extends FreeMarkerViewResolver {
/**
*
*/
public BufferedFreeMarkerViewResolver() {
setViewClass(requiredViewClass());
}
@SuppressWarnings("rawtypes")
@Override
protected Class requiredViewClass() {
return BufferedFreeMarkerView.class;
}
}
从春季调度员背景
<bean id="viewResolver" class="com.example.web.BufferedFreeMarkerViewResolver">
<property name="cache" value="true"/>
<property name="prefix" value=""/>
<property name="suffix" value=".ftl"/>
<property name="allowSessionOverride" value="true"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="exposeRequestAttributes" value="true"/>
<property name="exposeSessionAttributes" value="true"/>
<property name="requestContextAttribute" value="rc"/>
</bean>