我試圖在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:
我可以看到,在命令按鈕的動作會帶我去與「反應」是一個字符串,我要麼在硬編碼,或者通過在操作返回的「響應」 .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。
任何其他想法和/或答案都超過歡迎! – Myy 2012-01-03 07:28:05
這個解釋是不是太混亂了?我應該以更簡潔的形式重新發布嗎?已經過了3天沒有真正的答案。 – Myy 2012-01-03 23:46:37