2010-05-26 9 views
2

Lors de l'utilisation de FreemarkerServlet, il est possible d'inclure des pages JSP avec du contenu Freemarker. Cependant, j'utilise Freemarker comme un résolveur de vue dans mon application Spring MVC et n'utilise donc pas le FreemarkerServlet. Est-il possible de toujours utiliser @include_page dans mes modèles Freemarker lorsque je n'utilise pas FreemarkerServlet?Résolution de vues dans Spring MVC avec Freemarker - y compris jsp page

Merci,

Andrew

Répondre

1

Je trouve la solution. Vous avez besoin de sous-classe le FreemarkerView pour ajouter le comprennent comportement:

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()); 
     } 
    } 

} 

La ligne clé:

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

puis sous-classe résolveur vue d'utiliser la vue personnalisée:

public class CustomFreeMarkerViewResolver extends FreeMarkerViewResolver 
{ 

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

    /** 
    * Requires {@link FreeMarkerView}. 
    */ 
    @Override 
    protected Class requiredViewClass() 
    { 
     return CustomFreeMarkerView.class; 
    } 
} 
0

La réponse de drewzilla est presque travaillée pour moi. mais je devais utiliser getTemplate(locale).process(model, response.getWriter());
au lieu de processTemplate(getTemplate(locale), new SimpleHash(model), response); avec ressort

2

Ce poste a été très utile. Je ne sais pas si cela vous aidera, mais voici ma solution:

Voici ma méthode de 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); 
    }