使用FreemarkerServlet時,可以將JSP頁面包含在Freemarker內容中。但是,我在我的Spring MVC應用程序中將Freemarker用作視圖解析器,因此不要使用FreemarkerServlet。當我不使用FreemarkerServlet時,有什麼方法可以在Freemarker模板中使用@include_page?使用Freemarker解決Spring MVC中的視圖 - 包括jsp頁面
感謝,
安德魯
使用FreemarkerServlet時,可以將JSP頁面包含在Freemarker內容中。但是,我在我的Spring MVC應用程序中將Freemarker用作視圖解析器,因此不要使用FreemarkerServlet。當我不使用FreemarkerServlet時,有什麼方法可以在Freemarker模板中使用@include_page?使用Freemarker解決Spring MVC中的視圖 - 包括jsp頁面
感謝,
安德魯
我找到了解決辦法。您需要子類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;
}
}
drewzilla的答案几乎爲我工作。但我不得不使用 getTemplate(locale).process(model, response.getWriter());
而不是 processTemplate(getTemplate(locale), new SimpleHash(model), response);
彈簧
這個職位是非常有益的。我不知道這是否會幫助,但這裏是我的解決方案:
這裏是我的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);
}