Разрешение просмотров в Spring MVC с помощью Freemarker - включая страницу JSP - PullRequest
2 голосов
/ 26 мая 2010

При использовании FreemarkerServlet можно включать страницы JSP вместе с контентом Freemarker. Тем не менее, я использую Freemarker в качестве средства распознавания в моем приложении Spring MVC и поэтому не использую FreemarkerServlet. Можно ли как-нибудь использовать @include_page в моих шаблонах Freemarker, когда я не использую FreemarkerServlet?

Спасибо

Andrew

Ответы [ 3 ]

2 голосов
/ 22 сентября 2010

Этот пост был очень полезным. Я не уверен, поможет ли это, но вот мое решение:

Вот мой метод doRender:

@Override
   protected void doRender( Map<String, Object> model,
         HttpServletRequest request, HttpServletResponse response )
         throws Exception
   {

     //Expose model to JSP tags (as request attributes).
     exposeModelAsRequestAttributes(model, request);

     // Expose all standard FreeMarker hash models.
     SimpleHash fmModel = buildTemplateModel(model, request, response);
     // add the include_page directive
  fmModel.put( FreemarkerServlet.KEY_INCLUDE, new IncludePage( request, response));

  if (logger.isDebugEnabled()) {
   logger.debug("Rendering FreeMarker template [" + getUrl() + "] in FreeMarkerView '" + getBeanName() + "'");
  }

      // Grab the locale-specific version of the template.
      Locale locale = RequestContextUtils.getLocale( request );
      processTemplate(getTemplate(locale), fmModel, response);
   }
1 голос
/ 23 июля 2010

Я нашел решение. Вам необходимо создать подкласс FreemarkerView для добавления поведения включения:

public class CustomFreeMarkerView extends FreeMarkerView
{

   private TaglibFactory taglibFactory;

   private ServletContextHashModel servletContextHashModel;

   @Override
   protected void doRender( Map<String, Object> model,
         HttpServletRequest request, HttpServletResponse response )
         throws Exception
   {
      // Expose model to JSP tags (as request attributes).
      exposeModelAsRequestAttributes( model, request );

      // Expose all standard FreeMarker hash models.
      model.put( FreemarkerServlet.KEY_JSP_TAGLIBS, this.taglibFactory );
      model.put( FreemarkerServlet.KEY_APPLICATION,
            this.servletContextHashModel );
      model.put( FreemarkerServlet.KEY_SESSION, buildSessionModel( request,
            response ) );
      model.put( FreemarkerServlet.KEY_REQUEST, new HttpRequestHashModel(
            request, response, getObjectWrapper() ) );
      model.put( FreemarkerServlet.KEY_REQUEST_PARAMETERS,
            new HttpRequestParametersHashModel( request ) );
      model.put( FreemarkerServlet.KEY_INCLUDE, new IncludePage( request,
            response ) );

      if ( logger.isDebugEnabled() )
      {
         logger.debug( "Rendering FreeMarker template [" + getUrl()
               + "] in FreeMarkerView '" + getBeanName() + "'" );
      }
      // Grab the locale-specific version of the template.
      Locale locale = RequestContextUtils.getLocale( request );
      processTemplate( getTemplate( locale ), new SimpleHash( model ), response );
   }

   private HttpSessionHashModel buildSessionModel( HttpServletRequest request,
         HttpServletResponse response )
   {
      HttpSession session = request.getSession( false );
      if ( session != null )
      {
         return new HttpSessionHashModel( session, getObjectWrapper() );
      }
      else
      {
         return new HttpSessionHashModel( null, request, response,
               getObjectWrapper() );
      }
   }

}

Ключевая строка:

  model.put( FreemarkerServlet.KEY_INCLUDE, new IncludePage( request,
        response ) );

, а затем подклассифицировать преобразователь представления, чтобы использовать настраиваемое представление:

public class CustomFreeMarkerViewResolver extends FreeMarkerViewResolver
{

   public CustomFreeMarkerViewResolver()
   {
      setViewClass( requiredViewClass() );
   }

   /**
    * Requires {@link FreeMarkerView}.
    */
   @Override
   protected Class requiredViewClass()
   {
      return CustomFreeMarkerView.class;
   }
}
0 голосов
/ 03 сентября 2010

Ответ Дрюзиллы для меня почти сработал. но я должен был использовать getTemplate(locale).process(model, response.getWriter());
вместо processTemplate( getTemplate( locale ), new SimpleHash( model ), response ); с пружиной

...