1

我目前正在使用 Spring MVC 3.x,并使用 freemarker 视图解析器。

最近我一直想知道在作为响应发回之前将视图转换为 html 所需的执行时间。如果这方面的事情进展缓慢,我想进行调整,这就是我需要一些数字的原因。

在普通的 freemarker 模式下,我实际上可以在它们之间执行简单的 System.currentTimeMillis() 来找出执行时间:

long start = System.currentTimeMillis();
// this could be slow or fast depending on the caching used
Template temp = cfg.getTemplate(ftlName);
...
temp.process(model, myWriter); // depends on the writer
System.out.printf("done in %s ms", System.currentTimeMillis() - start);

但是当使用 spring mvc 的 freemaker 视图渲染时,我该怎么做呢?

4

2 回答 2

5

您可以考虑扩展 org.springframework.web.servlet.view.freemarker.FreeMarkerView 并使用自定义日志视图实现配置 FreeMarkerViewResolver。

日志视图实现可能如下所示:

public class LoggingFreeMarkerView extends FreeMarkerView {

    private static final transient Log log = LogFactory.getLog(LoggingFreeMarkerView.class);

    @Override
    protected void doRender(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
        long start = System.currentTimeMillis();
        super.doRender(model, request, response);
        log.debug("Freemarker rendered " + request.getRequestURI() + " in " + (System.currentTimeMillis() - start) + " ms");
    }
}

并将视图解析器与新类连接:

    <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver" autowire="no">
        <property name="viewClass" value="com.example.LoggingFreeMarkerView" />
        <property name="cache" value="false" /> <!-- cache disabled for performance monitoring -->
        <property name="prefix" value="" />
        <property name="suffix" value=".ftl" />
        <property name="contentType" value="text/html;charset=utf-8" />
        <property name="exposeRequestAttributes" value="true" />
        <property name="requestContextAttribute" value="base" />
    </bean>
于 2013-09-25T12:49:09.293 回答
0

您将仅在服务器端将模板与数据合并计算,主要问题是freemarker在页面上执行时,正如您所知freemarker建立在jsp页面之上,因此您应该将代码带到jsp端来计算执行时间,根据我的经验freemarker 中的数据大小加载时间不同。如果其他条件与jstl相比也太慢了!我可以推荐 thymeleaf for spring,它允许模板在非 xml 样式上工作原型。

于 2013-09-25T12:56:56.263 回答