2011-12-30 82 views
0

我試圖在WebApp上顯示PDF報告,我一直在關注本教程here ,它創建的PDF文件很好,但我無法嘗試顯示它在瀏覽器中。在我的xhtml中,我有一個按鈕,一旦點擊了該按鈕,就會調用一個調用該servlet的函數。它進入servlet並創建一個PDF文檔罰款。但我似乎無法弄清楚如何在屏幕上顯示它。有沒有辦法在新的瀏覽器窗口或新選項卡上顯示文檔?甚至是同一個。如何通過xhtml顯示PDF

我正在Eclipse中使用Java Server faces 2.0。並有一個Tomcat 7.0服務器。

我webxml

我添加的例子指定了以下代碼:

<servlet> 
    <servlet-name>PdfServlet</servlet-name> 
    <servlet-class>com.bravo.servlets.PdfServlet</servlet-class> 
</servlet>  
<servlet-mapping> 
    <servlet-name>PdfServlet</servlet-name> 
    <url-pattern>/PdfServlet</url-pattern> 
</servlet-mapping> 

和我的servlet看起來像這樣(幾乎是一樣的例子):

@WebServlet("/PdfServlet") 
public class PdfServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 
private Font font = new Font(Font.FontFamily.TIMES_ROMAN, 12, 
     Font.NORMAL, BaseColor.RED); 



/** 
* Default constructor. 
*/ 
public PdfServlet() { 
    // TODO Auto-generated constructor stub 
} 

/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    doPost(request, response); 
} 

/** 
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    invokePDFViewer(response); 
    Document document = new Document(); 

    try{ 
      PdfWriter.getInstance(document, response.getOutputStream()); 
     document.open(); 

     addContent(document); 

     document.close(); 
    }catch(DocumentException e){ 
     e.printStackTrace(); 
    } 

} 

private void invokePDFViewer(HttpServletResponse response){ 
    response.setContentType("application/pdf"); 
} 

private void addContent(Document document)throws DocumentException { 
    PdfPTable table = new PdfPTable(2); 


    Paragraph paragraph = new Paragraph ("Este es un parrafo en celda 1", font); 



    table.addCell(paragraph); 
    table.addCell("2"); 
    table.addCell("3"); 
    table.addCell("4"); 
    table.addCell("5"); 
    table.addCell("6");  

    document.add(table); 
} 

}

xhtml我打電話從這個servlet看起來像這樣:

.... 
function callPdfServlet(){ 

      $.ajax({ 
       type: 'POST', 
       cache: 'false', 
       data: 'codeType=notUsed', 
       url: '/miloWeb/PdfServlet', 
       async: false, 
       success: function(data){  
       }, 
       error: function (xhr, ajaxOptions, thrownError){ 
        alert(ajaxOptions); 
       } 
      }); 

     } 

..... 
<h:commandButton id="reportButton" action=" " styleClass="button" value="get Report" onclick="callPdfServlet();"></h:commandButton> 

所以最後,我現在所做的全部工作就是進入瀏覽器中的xhtml,點擊按鈕,然後點擊servlet,瀏覽代碼,然後就是它了。我的瀏覽器只是重新加載屏幕,沒有其他事情發生。所以我需要顯示我剛剛創建的PDF。在此先感謝您的幫助!

// ******************************************** **************************************** 編輯01/02/12:

閱讀thisthis

我可以看到,在命令按鈕的動作會帶我去與「反應」是一個字符串,我要麼在硬編碼,或者通過在操作返回的「響應」 .xhtml一個被管理的Bean。那個響應(如果沒有放在我的faces-config文件中)會把我帶到頁面,如果它與我當前頁面在同一個文件夾中。

所以我相信當我把「miloWeb/PdfServlet」作爲操作的響應時,它會在同一個文件夾中查找頁面(不是),因爲它找不到任何東西只是重新加載頁面。而且由於我有一個斷點在servlet中,我100%確定它沒有觸及它。

所以我的問題是:如何將我的頁面重定向到miloWeb/PdfServlet? 澄清,如果我把另一個xhtml的名稱放在同一個文件夾中,它工作正常。所以它是這樣工作的。

//這是我嘗試過僅供參考: 而不是通過Ajax調用去的我已經改變了按鈕

<h:commandButton id="reportButton" action="/miloWeb/PdfServlet" styleClass="button" value="get Report"></h:commandButton> 

,但它只是重新加載頁面,不帶我去Servlet。

所以我想另一件事是試圖去想過按鈕調用Managed Bean的作用:

public String actionPdf(){ 
    return "/miloWeb/PdfServlet"; 
} 

再次,同樣的事情,該函數返回的字符串,但它仍然沒有考慮我到servlet。

+0

任何其他想法和/或答案都超過歡迎! – Myy 2012-01-03 07:28:05

+0

這個解釋是不是太混亂了?我應該以更簡潔的形式重新發布嗎?已經過了3天沒有真正的答案。 – Myy 2012-01-03 23:46:37

回答

1

命令按鈕,我不得不在鍵入此:

public String doThis(){ 
String url = "url of your servlet"; 
FacesContext context = FacesContext.getCurrentInstance(); 
try { 
    context.getExternalContext().dispatch(url); 
    }catch (Exception e) { 
     e.printStackTrace(); 
} 
finally{ 
    context.responseComplete(); 

return ""; 
    } 

所以用這個,我得到的上下文根並將其重定向到那裏。 url正在/ PdfServlet

1

僅發佈一個正規形式,而不是在AJAX發佈,瀏覽器將加載在頁面的PDF的servlet的響應,而不是從JavaScript加載它,完全無視它:在動作

<form method="post" action="/miloWeb/PdfServlet"> 
    <input type="hidden" name="codeTyped" value="notUsed"/> 
    <input type="submit" value="Show PDF"/> 
</form> 
+0

所以我繼續並將該代碼發佈到我的xhtml中,但它不調用該servlet。我已經在其中放了一個斷點,並沒有觸及代碼。 – Myy 2011-12-30 23:44:32

+0

我剛剛從您自己的JavaScript代碼中選取了網址。比較表單發送的請求的URL和servlet的路徑,並修改代碼。 – 2011-12-30 23:48:55

+0

嗯,我不知道什麼錯,因爲它通過AJAx調用調用URl就好了。但沒有直接想到按鈕。 – Myy 2011-12-31 00:20:43