Java 从Liferay的JSF Portlet显示pdf时出现问题
我将liferay 5.2与jsf portlet结合使用 从页面中,我想按一个按钮生成一个PDF。 在managedbean中,我构建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
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。使用资源阶段-这正是创建它的目的。老实说,我怎么用这个