2011-12-30 96 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