今天我一直在努力从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); HashMapmap = 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); }
但是这个解决方案有点臭 - 如果我在我的业务控制器中向模型中添加一些东西,我必须在这里添加它.
我的问题有一个优雅的解决方案吗?