Я боролся сегодня, пытаясь перейти с Freemarker на Tiles2 + Freemarker.
В моих шаблонах freemarker используются макросы, которые взяты из spring.ftl.
Если я предоставлю сервлет fremarker в web.xml, моя модель будет видима для freemarker, но конкретные пружинные переменные (естественно) не будут введены в модель, так как за это отвечает источник FreemarkerView.
Если я настрою отдельный DispatcherServlet для определенного URL-адреса (скажем, "/ tpl / *") и сконфигурирую распознаватель freemarker в качестве распознавателя представления по умолчанию для этого сервлета и предоставлю UrlFilenameViewController в качестве контроллера по умолчанию, специальные пружинные переменные заполняются для модели, но мои собственная модель не видна: она связана как атрибут запроса. Я могу получить доступ к своей модели через $ {Request.mymodel.myvar}, но таким образом мне нужно изменить все мои шаблоны свободных маркеров, и я вижу что-то вонючее в идее.
Теперь моим решением было расширить 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);
}
Но и это решение несколько вонючее - если я добавлю что-то к модели в своих бизнес-контроллерах, я должен добавить это сюда.
Есть ли элегантное решение для моей проблемы?