Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用freemarker刷新Html头_Html_Spring Mvc_Freemarker_Flush - Fatal编程技术网

使用freemarker刷新Html头

使用freemarker刷新Html头,html,spring-mvc,freemarker,flush,Html,Spring Mvc,Freemarker,Flush,我有一个SpringMVCWeb应用程序,它使用freemarker作为模板语言。我目前正在处理刷新html头部分的更改,而不是缓冲整个html并在最后刷新。我尝试将设置为false,并使用freemarker的内置指令,如下所示,但这似乎不起作用 common-header.ftl <head> ....... </head> <#flush> page.ftl <#include "common-header.ftl" /> <bod

我有一个SpringMVCWeb应用程序,它使用freemarker作为模板语言。我目前正在处理刷新html头部分的更改,而不是缓冲整个html并在最后刷新。我尝试将设置为false,并使用freemarker的内置指令,如下所示,但这似乎不起作用

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

page.ftl
<#include "common-header.ftl" />
<body>
 .......
</body>
common-header.ftl
.......
page.ftl
.......
我将非常感谢你在这方面的帮助。此外,根据,autoFlush()似乎只适用于不包含#include语句且需要多个Template.process()方法的页面。如果这是正确的,我是否应该编写一个自定义模板处理器来处理页面中的头部和身体部分?任何指示都会有帮助

更新:

尝试使用作为视图类,因为它使用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>

.ftl
text/html;字符集=utf-8
真的
我将非常感谢您的帮助。

只需在
编写器上调用
Writer.flush()
,该编写器是提供给
Template.process
的。例如,如果
Writer
StringWriter
,那么
flush()
调用当然不会什么都不做。将
Writer
传递给FreeMarker的东西必须确保
Writer
在调用其
flush()
方法时做正确的事情


auto_flush
与您的问题无关。(但您误解了API文档。
auto_flush
始终受支持。文档描述了当您想将其设置为
false
时的情况)

不是对原始问题的回答,而是@soon承载的注释。我从未被告知你的评论,所以很抱歉反应太晚

我在开发过程中使用了一个缓冲视图,以便捕获各种异常和输出调试等。。这将授予编写器访问权限。我正在使用Spring3.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());
        }
    }

}
BufferedFreeMarkervewResolver.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;
    }

}
从spring调度程序上下文

<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>


谢谢ddekany@. 你知道斯普林用的是哪位作家吗?而且,如果有一种简单的方法可以将编写器切换到BufferedWriter之类的东西,以便添加指令调用BufferedWriter的flush方法,我对Spring MVC了解不多。但是
freemarkerconfiguer
似乎只处理构建FreeMarker
Configuration
对象,这并不影响
编写器的功能。不同的
Writer
可能会传递给每个
模板.process
调用,因此它不是FreeMarker中的全局设置。我的Writer(通过org.springframework.web.servlet.view.FreeMarker.FreeMarkerView访问)是org.springframework.security.web.context.saveContextOnUpdate或ErrorResponseRapper$SaveContextPrintWriter,它似乎委托给org.apache.catalina.connector.CoyoteWriterGoose@,您是如何通过org.springframework.web.servlet.view.freemarker.FreeMarkerView访问编写器的?我在这个API中没有看到任何接受编写器的方法。如果您能分享这段代码,我将不胜感激。谢谢,你是如何测试这个的?亚历山大,M,你能详细说明一下吗??我通过部署web应用程序并请求使用Freemarker生成的html页面进行了测试。“但这似乎不起作用”你怎么会这么想?Raedwald@,我通过查看Firebug的网络面板确认了这一点。我试图刷新的html仍然以单个响应的形式返回(即一个巨大的紫色条后跟一个绿色条)。有了flush,我希望头会先被送回,身体会在一段时间后被送回。但事实并非如此。