как отобразить PDF через xhtml - PullRequest
       11

как отобразить PDF через xhtml

0 голосов
/ 31 декабря 2011

Я пытаюсь отобразить отчет в формате PDF в веб-приложении, я следую этому уроку здесь , и он прекрасно создает файл PDF, но у меня возникают проблемы при попытке отобразить его вбраузер.В моем xhtml у меня есть кнопка, при нажатии на которую вызывается функция, вызывающая сервлет.он идет в сервлет и создал штраф в формате PDF.но я не могу понять, как отобразить его на экране.Есть ли способ показать документ в новом окне браузера или новой вкладке?или даже тот же.

Я работаю с лицами Java Server 2.0 в Eclipse.и у меня есть сервер 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>

, и мой сервлет выглядит примерно так (почти так же, как в примере):

@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);
}

}

HTML-файл, из которого я вызываю сервлет, выглядит следующим образом:

....
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 в своем браузере, нажимаю на кнопку, и он попадает в сервлет, проходит через код, а затем вот и все.Мой браузер просто перезагружает экран, и больше ничего не происходит.поэтому мне нужно показать PDF, который я только что создал.Заранее благодарим за помощь!

// ************************************************************************************ РЕДАКТИРОВАТЬ01.02.12:

после прочтения этого и этого

Я вижу, что действие в команде Button приведет меня к "response ".xhtml, где" response "- это строка, в которой я либо жестко прописал код, либо возвращается действием в управляемом компоненте.этот ответ (если он не помещен в мой файлface-config) перенесет меня на страницу, если она находится в той же папке, что и моя текущая страница.

, поэтому я считаю, что когда я помещаю "miloWeb / PdfServlet"в ответ на действие, он ищет страницу в той же папке (чего нет) и, поскольку ничего не находит, просто перезагружает страницу.И так как у меня есть точка останова в сервлете, я на 100% уверен, что он его не задевает.

, поэтому мой вопрос: как мне перенаправить мою страницу в miloWeb / PdfServlet ?? чтобы уточнить, это работает нормально, если я помещаю имя другого xhtml в ту же папку.поэтому он работает таким образом.

// Это то, что я пытался просто для справки: вместо того, чтобы выполнять вызов ajax, я изменил кнопку на

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

, но это простоперезагружает страницу и не возвращает меня к сервлету.

поэтому еще одну вещь, которую я попробовал, попытались выполнить, хотя действие кнопки, вызывающей управляемый компонент:

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

снова, то же самое, функция возвращает строку, но она все еще нене отведи меня к сервлету.

Ответы [ 2 ]

1 голос
/ 06 января 2012

в действии 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

1 голос
/ 31 декабря 2011

Просто отправьте обычную форму вместо публикации в AJAX, и браузер загрузит ответ из вашего PDF-сервлета на страницу, а не загрузит его из JavaScript и полностью его проигнорирует:

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