【发布时间】: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 编译器)不应该以这种方式使用。在最坏的情况下,您将无法获得对生产问题的支持。