使用Freemarker解析Spring MVC中的视图-包括jsp页面
使用FreemarkerServlet时,可以在Freemarker内容旁边包含JSP页面。但是,我在SpringMVC应用程序中使用Freemarker作为视图解析器,因此不要使用FreemarkerServlet。当我不使用FreemarkerServlet时,有没有办法在我的Freemarker模板中仍然使用@include_页面 谢谢使用Freemarker解析Spring MVC中的视图-包括jsp页面,spring,spring-mvc,freemarker,Spring,Spring Mvc,Freemarker,使用FreemarkerServlet时,可以在Freemarker内容旁边包含JSP页面。但是,我在SpringMVC应用程序中使用Freemarker作为视图解析器,因此不要使用FreemarkerServlet。当我不使用FreemarkerServlet时,有没有办法在我的Freemarker模板中仍然使用@include_页面 谢谢 安德鲁我找到了解决办法。您需要对FreemarkerView进行子类化,以添加include行为: public class CustomFreeMark
安德鲁我找到了解决办法。您需要对FreemarkerView进行子类化,以添加include行为:
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() );
}
}
}
然后对视图分解器进行子分类,以使用自定义视图:
public class CustomFreeMarkerViewResolver extends FreeMarkerViewResolver
{
public CustomFreeMarkerViewResolver()
{
setViewClass( requiredViewClass() );
}
/**
* Requires {@link FreeMarkerView}.
*/
@Override
protected Class requiredViewClass()
{
return CustomFreeMarkerView.class;
}
}
德鲁齐拉的回答几乎对我有用。但我不得不使用
getTemplate(locale.process)(model,response.getWriter())代码>
而不是
processTemplate(getTemplate(locale)、新SimpleHash(model)、响应)代码>
对于spring,这篇文章很有帮助。我不确定这是否有帮助,但我的解决方案是:
以下是我的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);
}
@覆盖
受保护的void doRender(地图模型,
HttpServletRequest请求,HttpServletResponse响应)
抛出异常
{
//将模型公开给JSP标记(作为请求属性)。
exposeModelAsRequestAttributes(模型、请求);
//公开所有标准的FreeMarker哈希模型。
SimpleHash fmModel=buildTemplateModel(模型、请求、响应);
//添加include_页面指令
fmModel.put(FreemarkerServlet.KEY_INCLUDE,new IncludePage(请求,响应));
if(logger.isDebugEnabled()){
debug(“呈现FreeMarkerView中的FreeMarker模板[“+getUrl()+””]”+getBeanName()+“””);
}
//获取模板的特定于语言环境的版本。
Locale Locale=RequestContextUtils.getLocale(请求);
processTemplate(getTemplate(locale)、fmModel、response);
}
@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);
}