当前位置:  开发笔记 > 编程语言 > 正文

Spring + Tiles2 + Freemarker - 通过Freemarker Servlet或Spring的FreeMarkerViewResolver集成?

如何解决《Spring+Tiles2+Freemarker-通过FreemarkerServlet或Spring的FreeMarkerViewResolver集成?》经验,为你挑选了0个好方法。

今天我一直在努力从Freemarker迁移到Tiles2 + Freemarker.

我的freemarker模板使用来自spring.ftl的宏.

如果我在web.xml中提供fremarker servlet,我的模型对于freemarker是可见的,但是特定的spring变量(自然地)不会填充到模型中,因为FreemarkerView对它负责.

如果我为特定的url配置一个单独的DispatcherServlet(比如"/ tpl/*")并将freemarker解析器配置为该servlet的默认视图解析器并提供UrlFilenameViewController作为默认控制器,那么特殊的spring变量会填充到模型中,但是我自己的模型是不可见:它被绑定为请求属性.我可以通过$ {Request.mymodel.myvar}访问我的模型,但这样我必须更改所有的freemarker模板,我发现这个想法有些臭.

现在我的解决方案是扩展UrlFilenameViewController并将我的模型从请求添加到ModelAndView:

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)  {
        ModelAndView mav = super.handleRequestInternal(request, response);

        HashMap map = new HashMap();

        Enumeration attributes = request.getAttributeNames();

        while(attributes.hasMoreElements()) {
            String attribute = attributes.nextElement();

            if("model".equals(attribute)) {
                logger.debug("FreemarkerViewController.handleRequestInternal: putting attribute to model: " + attribute + "=" + request.getAttribute(attribute));
                map.put(attribute, request.getAttribute(attribute));
            }
        }
        logger.debug("FreemarkerViewController.handleRequestInternal: VIEW: " + mav.getViewName());
        return new ModelAndView(mav.getViewName(), map);
    }

但是这个解决方案有点臭 - 如果我在我的业务控制器中向模型中添加一些东西,我必须在这里添加它.

我的问题有一个优雅的解决方案吗?

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有