我试图在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