2010-05-26 62 views
2

使用FreemarkerServlet時,可以將JSP頁面包含在Freemarker內容中。但是,我在我的Spring MVC應用程序中將Freemarker用作視圖解析器,因此不要使用FreemarkerServlet。當我不使用FreemarkerServlet時,有什麼方法可以在Freemarker模板中使用@include_page?使用Freemarker解決Spring MVC中的視圖 - 包括jsp頁面

感謝,

安德魯

回答

1

我找到了解決辦法。您需要子類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

drewzilla的答案几乎爲我工作。但我不得不使用 getTemplate(locale).process(model, response.getWriter());
而不是 processTemplate(getTemplate(locale), new SimpleHash(model), response); 彈簧

2

這個職位是非常有益的。我不知道這是否會幫助,但這裏是我的解決方案:

這裏是我的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); 
    } 
相關問題