如何通过xhtml显示PDF

时间:2011-12-30 23:06:44

标签: java servlets xhtml itext

我正在尝试在webApp上显示PDF报告,我一直在关注本教程here 它创建了pdf文件,但是我在浏览器中尝试显示它时遇到了麻烦。在我的xhtml中,我有一个按钮,一旦单击该按钮,就会调用一个调用servlet的函数。它进入servlet并创建了一个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

我可以看到commandButton中的操作会将我带到“响应”.xhtml,其中“response”是我要么硬编码的字符串,要么是由Managed 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。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

在commandButton的操作中,我必须输入:

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