【问题标题】:Resolving views in Spring MVC with Freemarker - including jsp page使用 Freemarker 解析 Spring MVC 中的视图 - 包括 jsp 页面
【发布时间】:2011-02-24 05:00:10
【问题描述】:

使用 FreemarkerServlet 时,可以在 Freemarker 内容旁边包含 JSP 页面。但是,我在 Spring MVC 应用程序中使用 Freemarker 作为视图解析器,因此不要使用 FreemarkerServlet。当我不使用 FreemarkerServlet 时,有什么方法可以在我的 Freemarker 模板中使用 @include_page?

谢谢,

安德鲁

【问题讨论】:

    标签: spring spring-mvc freemarker


    【解决方案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;
       }
    }
    

    【讨论】:

      【解决方案2】:

      drewzilla 的回答几乎对我有用。但我不得不使用 getTemplate(locale).process(model, response.getWriter());
      代替 processTemplate( getTemplate( locale ), new SimpleHash( model ), response ); 带弹簧

      【讨论】:

        【解决方案3】:

        这篇文章很有帮助。我不确定这是否会有所帮助,但这是我的解决方案:

        这是我的 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);
           }
        

        【讨论】:

          猜你喜欢
          • 2020-06-27
          • 2012-04-15
          • 2017-07-08
          • 1970-01-01
          • 2011-01-14
          • 1970-01-01
          • 1970-01-01
          • 2015-12-07
          • 1970-01-01
          相关资源
          最近更新 更多