我今天正在努力从 Freemarker 迁移到 Tiles2 + Freemarker。
我的 freemarker 模板使用来自 spring.ftl 的宏。
如果我在 web.xml 中提供一个 fremarker servlet,我的模型对 freemarker 是可见的,但特定的 spring 变量(自然)不会填充到模型中,因为 springs FreemarkerView 对此负责。
如果我为特定的 url(比如“/tpl/*”)配置一个单独的 DispatcherServlet,并将 freemarker 解析器配置为该 servlet 的默认视图解析器,并提供 UrlFilenameViewController 作为默认控制器,则特殊的 spring 变量确实会填充到模型中,但我自己的模型是不可见:它被绑定为请求属性。我可以通过 ${Request.mymodel.myvar} 访问我的模型,但这样我必须更改我所有的 freemarker 模板,并且我发现这个想法有些异味。
现在我的解决方案是扩展 UrlFilenameViewController 并将我的模型从请求添加到 ModelAndView:
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mav = super.handleRequestInternal(request, response);
HashMap<String, Object> map = new HashMap<String, Object>();
Enumeration<String> 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);
}
但是这个解决方案也有点臭——如果我在我的业务控制器的模型中添加一些东西,我必须在这里添加它。
我的问题有优雅的解决方案吗?