用freemarker冲洗Html头部

时间:2014-05-14 17:30:09

标签: html spring-mvc freemarker flush

我有一个使用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>

我很感激任何帮助。

2 个答案:

答案 0 :(得分:2)

<#flush>只需拨打Writer.flush() Writer上的Template.process即可。例如,如果WriterStringWriter,则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>