【问题标题】:Render Spring MVC to String or PDF将 Spring MVC 渲染为字符串或 PDF
【发布时间】:2013-01-04 00:26:08
【问题描述】:

我正在尝试将 Spring MVC 控制器呈现为字符串,以使用 iText 创建 PDF。因为应用程序位于 Oracle Access Manager 后面,所以我无法对页面的 URL 进行 URL 请求并将输出保存到字符串,我需要在不发出另一个 HTTP 请求的情况下呈现页面。

我的目标是做以下事情:

MyMvcController controller = new MyMvcController();
ModelAndView modelAndView = new ModelAndView("TemplateName");

...
modelAndView.addObject(someObject);
etc, etc
...

String html = controller.render(modelAndView);
...
render in iText to a PDF
...

我已经可以使用 Flying Saucer + iText 渲染标记,我只是有一段时间将控制器的输出捕获到字符串。有什么想法吗?我愿意先不渲染到字符串,最终结果只需要是我可以附加到电子邮件的 PDF,并且我需要能够动态地将数据添加到我正在渲染的 JSP。

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    正如@Biju Kunjummen 已经说过的那样,渲染是在视图中而不是在控制器中完成的。控制器只准备模型,视图将模型数据添加到静态内容并渲染。

    SpringMVC 中默认的视图技术是 JSP。 PDF 可以被视为另一种视图技术,SpringMVC 已经规定使用 PDF 进行视图。与其转发到 JSP 视图,不如转发到 PDF 视图。

    查看 Spring 的 AbstractPDFView 并查看本教程:http://numberformat.wordpress.com/2009/07/20/spring-mvc-with-pdf-output/。不幸的是,本教程在buildPDFDocument 中手动创建了 PDF,这并不是您想要的。您需要将教程扩展到

    • renderMergedOutputModel 方法中将 JSP 渲染为 HTML
    • 使用飞碟将HTML+CSS在buildPDFDocument方法中制作成PDF。

    正如renderMergedOutputModel 方法的JavaDoc 所述

    第一步是准备请求:在 JSP 案例中,这 意味着将模型对象设置为请求属性。第二 step 将是视图的实际渲染,例如包括 通过 RequestDispatcher 的 JSP。

    代码应如下所示:

    RequestDispatcher rd = request.getRequestDispatcher("some.jsp"); request.setAttribute("anotherString", model.getValue());
    rd.forward(请求,响应);

    不过有一个技巧:我们不想渲染到 servlet 响应,而是使用包装器渲染到单独的 ByteArrayOutputStream。 ByteArrayOutputStream 可以用作飞碟的输入。在此处检查包装器的解决方案: JSP compilation to string or in memory bytearray with Tomcat/Websphere

    buildPDFDocument 方法中,您现在以ByteArrayOutputStream 的形式从Wrapper 获取呈现的HTML,并使用它在飞碟中呈现PDF。

    【讨论】:

      【解决方案2】:

      我假设您使用 jsp 作为视图技术 - 如果是这样,则渲染不受 Spring 控制,而是被分派到要渲染的容器(dispatcher.forward(request, response))。就像您发现的那样,我怀疑是否有办法拦截控制器层中的响应,作为替代方案,让我推荐这种方法:

      1. 使用 FreemarkerStringtemplate 之类的模板引擎生成 html,这样可以独立于 Spring MVC 生成您需要的特定 html。

      2. 使用上面生成的html通过iText/Flying Saucer运行生成pdf。

      编辑

      经过一番思考,另一种可行的方法是简单地编写一个 servlet 过滤器来拦截到您的特定控制器请求映射的请求,该过滤器可以拦截 html 响应,使用 itext 转换为 pdf 并流式传输 pdf。

      【讨论】:

        【解决方案3】:

        我找到了一个教程:http://technologicaloddity.com/2011/10/04/render-and-capture-the-output-of-a-jsp-as-a-string/

        需要spring框架和dwr api。

        我还没有测试它,但如果它有效,我将不再需要速度来呈现 HTML 电子邮件模板。

        【讨论】:

          猜你喜欢
          • 2013-07-07
          • 1970-01-01
          • 2016-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多