Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Freemarker解析Spring MVC中的视图-包括jsp页面_Spring_Spring Mvc_Freemarker - Fatal编程技术网

使用Freemarker解析Spring MVC中的视图-包括jsp页面

使用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

使用FreemarkerServlet时,可以在Freemarker内容旁边包含JSP页面。但是,我在SpringMVC应用程序中使用Freemarker作为视图解析器,因此不要使用FreemarkerServlet。当我不使用FreemarkerServlet时,有没有办法在我的Freemarker模板中仍然使用@include_页面

谢谢


安德鲁我找到了解决办法。您需要对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);
   }