使用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);
}