任务
今天(准确的说是昨天)的任务之一是做一个PDF文件的下载/显示按钮。用户在前台下一个订单,并完成支付之后,我们需要把这个order的详细信息显示给用户,包括用页面把这些信息显示出来和用PDF文件记录下来。在这个详细信息页面,我们有一个按钮,当用户点击它的时候,服务器程序就会去生成PDF文件,并弹出提示框,问用户是要保存到本地还是只在本地显示。其中生成PDF的代码已经写好了。现在的任务有两个:1.弹出提示框,2.实现下载和本地显示功能。
该怎么做
1.在页面添加按钮,代码如下:
<h:commandLink action="#{orderBean.generatePDF}">
<img src="images/button_printableversion.gif" width="129" height="24" border="0" align="top" />
</h:commandLink>
为了让页面更漂亮,我们为这个按钮加了一张图片。
2.写一个方法来实现功能1和2.并让generatePDF()方法来调用。代码如下:
public void downloadFile(String strfileName) {
try {
FacesContext context = FacesContext.getCurrentInstance();
ServletContext servletContext = (ServletContext) context
.getExternalContext().getContext();
String excelName = servletContext.getRealPath("/uploadExcel") + "/"+ strfileName;
File exportFile = new File(excelName);
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
.getCurrentInstance().getExternalContext().getResponse();
ServletOutputStream servletOutputStream = httpServletResponse
.getOutputStream();
httpServletResponse.setHeader("Content-disposition",
"attachment; filename=" + strfileName);
httpServletResponse.setContentLength((int) exportFile.length());
httpServletResponse.setContentType("application/x-download");
byte[] b = new byte[1024];
int i = 0;
FileInputStream fis = new java.io.FileInputStream(exportFile);
while ((i = fis.read(b)) > 0) {
servletOutputStream.write(b, 0, i);
}
} catch (IOException e) {
e.printStackTrace();
}
FacesContext.getCurrentInstance().responseComplete();
}
我们的问题
我们走的弯路