Spring + Tiles2 + Freemarker - интегрируется через Сервлет Freemarker или через FreeMarkerViewResolver Spring?

Я боролся сегодня, пытаясь мигрировать от Freemarker до Tiles2 + Freemarker.

Мой freemarker обрабатывает макросы использования по шаблону, которые прибывают из spring.ftl.

Если я обеспечиваю fremarker сервлет в web.xml, моя модель видима к freemarker, но определенные пружинные переменные (естественно) не заполняются в модель как пружины, FreemarkerView ответственен за это.

Если я настраиваю отдельный DispatcherServlet для определенного URL (скажите "/tpl /*"), и настройте freemarker сопоставитель как сопоставитель представления по умолчанию для того сервлета и обеспечьте UrlFilenameViewController как контроллер по умолчанию, специальные пружинные переменные действительно становятся заполненными для моделирования, но моя собственная модель не видима: это связывается как атрибут запроса. Я могу получить доступ к своей модели через $ {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);
    }

Но это решение является несколько вонючим также - если я добавляю что-то к модели в моих бизнес-контроллерах, я должен добавить его здесь.

Существует ли изящное решение для моей проблемы?

7
задан Jack B Nimble 23 August 2011 в 17:06
поделиться