【问题标题】:Generate HTML from JSP从 JSP 生成 HTML
【发布时间】:2011-03-21 07:56:56
【问题描述】:

我熟悉的基本 servlet jsp 设置 ....

RequestDispatcher dispatcher = request.getRequestDispatcher(resourceA.jsp);

dispatcher.forward(request, response);

问题是,除了将回复发送回浏览器(resourceA.jsp)之外,我还需要创建 resourceB.jsp 的第二个 HTML 输出,然后将通过电子邮件发送或用于创建 pdf 文档。

不是每次都这样做,只是在特定条件下通过调用

dispatcher.forward(request, response);

我第二次得到 IllegalArgumentException

我只需要一种从 jsp 生成 HTML 的方法(基本上替换 ${par} 值)和 将html作为String返回,没有状态码或标题,只是html和A与B无关,所以过滤器不起作用。

------重播到第一个答案-----评论小---无格式

我不明白为什么会如此困难......

所有的镁合金都可以将数据与 HTML 内容合并到

${par}
${par['key']}
<c:if test="${patBoolean}" >
<c:forEach var="pvar" varStatus="s_pvar" items="${parList}">

我什至创建了一个包装器来屏蔽 getOutputStream() 和 getWriter(),创建我自己的 PrintWriter

public class ResponseWrapper extends HttpServletResponseWrapper{
  private PrintWriter printWriter;

  public ResponseWrapper(HttpServletResponse response){
       super(response);
  }

  public ServletOutputStream getOutputStream() throws java.io.IOException{....}

  public PrintWriter getWriter() throws java.io.IOException {....}

}

在获取resourceB.jsp的结果,但问题是dispatcher.forward(request, response) 在原始 HttpServletResponse 中设置 isCommitted。

【问题讨论】:

  • 您是在使用第二个 JSP 从客户端还是从服务器创建 PDF 或发送电子邮件?如果您尝试从服务器执行此操作,我必须承认 JSP 不是正确的解决方案,模板引擎将更适合此任务。
  • 我刚看了 Velocity... 看看代码:#foreach( $criterion in $criteria ) .... 它模仿 jsp,我需要学习另一种带有单独页面的脚本方法,没有重复使用代码...它是如此简单的jsp,属性,html...我已经在做它了,它适用于电子邮件和PDF,但是第二个dispatcher.forward回到浏览器,现在是唯一的问题....必须离开,是的,我是从服务器端做的
  • 我认为您需要考虑发出两个 HTTP 请求,而不是一个,尤其是在您设法使电子邮件/PDF 部分正常工作的情况下。对于同一个请求,服务器根本无法使用两种不同类型的内容进行响应。如果你能详细说明你的用例,这也可能会有所帮助,因为我有点难以理解电子邮件是由服务器生成并发送到客户端的事实。
  • 用例:互联网用户注册/更新详细信息,请求发送到服务器,这将发送返回并继续其余事务,但如果出现特定情况,服务器需要提醒某人或记录(超过数据库)。这总是通过简单的硬编码消息(自定义字段合并)来完成,但是通过使用 JSP 概念,该电子邮件可以与 JSP 驱动的响应一样好……这只是其中之一。所有后端代码都是 +500 命令模式、bean、数据库......完整的交易网站......由 JSP 和 JSON (ajax) 响应驱动......
  • 鉴于您的用例,我坚信您应该避免使用 JSP 发送电子邮件和生成 PDF。简单地说,它是一种反模式; JSP 旨在生成显示在浏览器上的 HTML,而其余的(尤其是 PDF)或多或少是二进制数据,通过不同的协议传递给实际用户。仅仅因为 JSP 看起来在做这项工作而使用 JSP 是很奇怪的。应用程序服务器(尤其是 JSP 编译器)不应该以这种方式使用。在最坏的情况下,您将无法获得对生产问题的支持。

标签: java html jsp servlets


【解决方案1】:

很有可能。
是的,也许这不是正确的用例,也许只是一种解决方法,但它简单。谁在乎。

一旦有了HttpServletRequest 实例,您就可以轻松地构造一个模拟HttpServletResponse 来将jsp 输出重定向到一个字符串。

你需要一个 StringWriter
为了获得 JSP 输出,您需要一个 StringWriter

StringWriter sw=new StringWriter();

包装一下
JSP 解析器什么的需要PrintWriter

PrintWriter pw=new PrintWriter(sw);

构建一个模拟响应
您不能轻松地重用现有的HttpServletResponse,因此请自己构建。

HttpServletResponse res=new HttpServletResponse() {

        @Override
        public PrintWriter getWriter() throws IOException {
            // return your own writer!
            return pw;
        }

}

您还必须实现其他方法,但只需使用 IDE 的快速修复并将它们保留为默认值。
生成它
something.jsp 应该是现有的。

request.getRequestDispatcher("/something.jsp").forward(request,res);

获取输出
这会将 JSP 输出打印到服务器控制台。

System.out.printf("{%s}",sw.toString());

继续真正的回应
使用 servlet,您应该继续处理真正的HttpServletResponse,就像您以前没有生成 JSP 一样。在春天,没有真正的Response 需要关心。

到目前为止,我仍然无法模拟有效的请求和响应。但是使用模拟响应已经足以解决这个问题。

【讨论】:

    【解决方案2】:

    JSP 不是这里要做的事情。有一个单独的过程来填写 Velocity 模板(用于电子邮件)或使用 XSL-FO 或 iText 生成 PDF 并将 JSP 排除在外。这是一个与发回 HTTP 响应完全不同的用例。

    【讨论】:

    • 我不明白为什么会如此困难......
    • @nico,这很困难,因为服务器已经将原始请求的响应提交给客户端;提交响应后,您将无法编写另一个响应或修改原始响应。你不能改变服务器的这种行为——这就是互联网的工作方式。
    • (+1) 用于 Velocity 建议。
    • 我不想改变服务器(Tomcat),我需要的只是重新使用 BIG-BIG 代码集来动态合并数据和文本(在本例中为 html)。它就在那里,为什么要重新发明轮子。我根本不想操纵对浏览器的响应...如果我可以克隆 HttpServletResponse 并将其与回复断开连接,它也可以工作。
    猜你喜欢
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多