我正在尝试在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:
后我可以看到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。
答案 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