2010-03-02 81 views
0

我用jsf-portlet使用liferay 5.2。從我的JSF Portlet的Liferay顯示pdf的問題

從頁面我想按一個按鈕來生成一個PDF。 在managedbean我建立pdf,我想在迴應中顯示它。

ByteArrayOutputStream名爲outputStream我有我的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 ....

什麼是錯?

LOG

 11:03:19,716 INFO [STDOUT] 11:03:19,716 ERROR [IncludeTag] Current URL /web/organo-di-governo/datawarehouse?p_p_id=1_WAR_Portlet_Datawarehouse_INSTANCE_D7s7&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-2&p_p_col_count=1&_1_WAR_Portlet_Datawarehouse_INSTANCE_D7s7_com.sun.faces.portlet.VIEW_ID=%2Fview.xhtml&_1_WAR_Portlet_Datawarehouse_INSTANCE_D7s7_com.sun.faces.portlet.NAME_SPACE=_1_WAR_Portlet_Datawarehouse_INSTANCE_D7s7_ generates exception: null 
       11:03:19,717 INFO [STDOUT] 11:03:19,717 ERROR [IncludeTag] java.lang.IllegalStateException 
        at com.liferay.portal.servlet.filters.strip.StripResponse.getWriter(StripResponse.java:85) 
        at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) 
        at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118) 
        at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:326) 
        at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:342) 
        at org.apache.jasper.runtime.JspWriterImpl.print(JspWriterImpl.java:468) 
        at com.liferay.taglib.util.ThemeUtil.includeVM(ThemeUtil.java:208) 
        at com.liferay.taglib.util.ThemeUtil.include(ThemeUtil.java:68) 
        at com.liferay.taglib.util.IncludeTag.doEndTag(IncludeTag.java:59) 
        at org.apache.jsp.html.common.themes.portal_jsp._jspx_meth_liferay_002dtheme_005finclude_005f1(portal_jsp.java:816) 
        at org.apache.jsp.html.common.themes.portal_jsp._jspx_meth_c_005fotherwise_005f0(portal_jsp.java:788) 
        at org.apache.jsp.html.common.themes.portal_jsp._jspService(portal_jsp.java:724) 
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373) 
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336) 
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) 
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
       11:03:19,718 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception 
       java.lang.IllegalStateException 



     11:03:19,719 ERROR [[Main Servlet]] Servlet.service() for servlet Main Servlet threw exception 
     java.lang.IllegalStateException 
      at com.liferay.portal.servlet.filters.strip.StripResponse.getWriter(StripResponse.java:85) 
      at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) 
      at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118) 



     11:03:19,722 INFO [STDOUT] 11:03:19,720 ERROR [OpenSSOFilter] org.apache.jasper.JasperException: java.lang.IllegalStateException 
     org.apache.jasper.JasperException: java.lang.IllegalStateException 
      at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:521) 
      at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:409) 
      at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336) 
      at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) 




     11:03:19,722 INFO [STDOUT] n.internalDoFilter(ApplicationFilterChain.java:235) 
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
      at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 


     Caused by: java.lang.IllegalStateException 
      at com.liferay.portal.servlet.filters.strip.StripResponse.getWriter(StripResponse.java:85) 
      at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) 
      at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118) 
+0

我們需要異常的堆棧跟蹤,而不僅僅是類名 – skaffman 2010-03-02 08:44:13

+0

我說我的堆棧跟蹤 – Stefano 2010-03-02 10:08:16

+0

我的另一種解決方案是一個外部的servlet ... 我tryed使用Servlet ...做工精細...... 我把會話我的ByteArrayOutputStream和後externalCtx.redirect(externalCtx.getRequestContextPath()+「/下載」); 但不是一個好的解決方案... – Stefano 2010-03-02 10:12:29

回答

3

的唯一合適的方式來做到這一點是通過使用JSR-286規範的「資源」階段。目前在你的代碼中,你處於「RENDER」階段,它強制只允許「text/html」編碼。

在純JSP,標籤看起來是這樣的:

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

然後在您的portlet類需要實現的serveResource(ResourceRequest REQ,ResourceResponse水庫)方法和讀取調用的req.getResourceId()方法ResourceRequest並行爲調用您的業務邏輯(創建您的PDF),然後將其寫入輸出流。

在JSF中,我不完全確定它是否被支持,這意味着唯一的方法是將任務委託給servlet調用。在JSF中查看是否實現了JSR-286資源處理。

+0

感謝雷, 但我不能相信......從Liferay的JSF的portlet沒有采取PDF的可能性.. 這是同樣的問題,如果我想要下載...任何一個zip文件或文本... 必須有一個解決方案! – Stefano 2010-03-02 14:57:27

+0

Ray爲您的問題提供了絕對正確的答案 - 無論您是否相信。您無法「僅」從portlet上下文獲取servlet輸出流。這將導致(猜...)IllegalStateException。想象一下:當您的portlet呈現一半HTML頁面可能已經傳輸到客戶端時,所以您不能突然將內容類型更改爲pdf。使用RESOURCE階段 - 這正是它創建的目的。誠實。 – 2011-04-29 19:21:02

+0

如何在我的xhtml頁面中使用 muneebShabbir 2012-07-13 05:53:23