Java 从Liferay的JSF Portlet显示pdf时出现问题

Java 从Liferay的JSF Portlet显示pdf时出现问题,java,pdf,portlet,liferay,Java,Pdf,Portlet,Liferay,我将liferay 5.2与jsf portlet结合使用 从页面中,我想按一个按钮生成一个PDF。 在managedbean中,我构建pdf,并希望在响应中显示它 在名为outputStream的ByteArrayOutputStream中,我用JasperReport构建了我的pdf 我写道: PortletResponse portletResponse = (PortletResponse)externalCtx.getResponse(); HttpServletResp

我将liferay 5.2与jsf portlet结合使用

从页面中,我想按一个按钮生成一个PDF。 在managedbean中,我构建pdf,并希望在响应中显示它

在名为
outputStream
ByteArrayOutputStream
中,我用JasperReport构建了我的pdf

我写道:

   PortletResponse portletResponse = (PortletResponse)externalCtx.getResponse(); 
   HttpServletResponse httpResponse = PortalUtil.getHttpServletResponse(portletResponse);

   ServletOutputStream out = httpResponse.getOutputStream();
   String filename="Pdf" + System.currentTimeMillis()+".pdf";
   httpResponse.reset();

   httpResponse.setContentType("application/pdf");
   httpResponse.setHeader("Content-Disposition", "attachment; filename=\""+ filename + "\"");
   httpResponse.setContentLength(outputStream.size());

   outputStream.writeTo(out);

   out.flush();
   out.close();
我没有看到任何输出!在jboss日志中,我读到:
IllegaStateException

怎么了

日志


唯一合适的方法是使用JSR-286规范的“资源”阶段。目前在代码中,您处于“呈现”阶段,该阶段强制只允许“文本/html”编码

在普通JSP中,标记看起来像:

<portlet:resourceURL id="/super-cool.pdf" />

然后在portlet类中实现ServerResource(ResourceRequest req,ResourceResponse res)方法,读取并调用ResourceRequest的req.getResourceId()方法,调用业务逻辑(创建PDF),然后将其写入输出流


在JSF中,我不完全确定这是否得到支持,这意味着唯一的方法是将任务委托给servlet调用。查看JSF,看看是否实现了JSR-286资源处理。

唯一合适的方法是使用JSR-286规范的“资源”阶段。目前在代码中,您处于“呈现”阶段,该阶段强制只允许“文本/html”编码

在普通JSP中,标记看起来像:

<portlet:resourceURL id="/super-cool.pdf" />

然后在portlet类中实现ServerResource(ResourceRequest req,ResourceResponse res)方法,读取并调用ResourceRequest的req.getResourceId()方法,调用业务逻辑(创建PDF),然后将其写入输出流


在JSF中,我不完全确定这是否得到支持,这意味着唯一的方法是将任务委托给servlet调用。查看JSF以查看是否实现了JSR-286资源处理。

我们需要异常的堆栈跟踪,而不仅仅是ClassName我的替代解决方案是一个外部servlet。。。我试着用servlet。。。工作很好。。。我将ByteArrayOutputStream和externalCtx.redirect(externalCtx.getRequestContextPath()+“/Download”)放在会话中;但这不是一个好的解决方案…可能重复我们需要异常的堆栈跟踪,而不仅仅是类名我的替代解决方案是一个外部servlet。。。我试着用servlet。。。工作很好。。。我将ByteArrayOutputStream和externalCtx.redirect(externalCtx.getRequestContextPath()+“/Download”)放在会话中;但这不是一个好的解决方案…可能是Thank Ray的副本,但我不敢相信…从Liferay中的JSF portlet中不可能获取pdf。。如果我想下载的话也是一样的问题。。。任何一个zip文件或文本。。。一定有解决办法!雷为你的问题提供了绝对正确的答案——不管你信不信。您无法“仅仅”从portlet上下文获取servlet输出流。这将导致(猜测…)非法状态例外。想象一下:在呈现portlet时,HTML页面的一半可能已经传输到客户端,因此您不能突然将内容类型更改为pdf。使用资源阶段-这正是创建它的目的。老实说,我怎么能用这个谢谢Ray,但我不敢相信…从Liferay中的JSFPortlet中不可能获取pdf。。如果我想下载的话也是一样的问题。。。任何一个zip文件或文本。。。一定有解决办法!雷为你的问题提供了绝对正确的答案——不管你信不信。您无法“仅仅”从portlet上下文获取servlet输出流。这将导致(猜测…)非法状态例外。想象一下:在呈现portlet时,HTML页面的一半可能已经传输到客户端,因此您不能突然将内容类型更改为pdf。使用资源阶段-这正是创建它的目的。老实说,我怎么用这个