For this weeks JSF tip, I’ll show you how to send binary data (such as a file) to the user by way of an action handler or listener.
Say, you want to generate a custom PDF and send it to the user as he clicks a link. You need a JSF page, and a backing bean.
Your JSF page may look like this:
<h:form>
<h:commandLink id="lnkDownload"
actionListener="#{myBean.onDownload}"
target="_blank"
value="Download PDF" />
</h:form>
Your JSF backing bean may look like this:
public MyBean {
public void onDownload(ActionEvent event) {
try {
// here you need to get the byte[] representation of
// the file you want to send
byte[] binary_data = ;
String filename = "generated_file.pdf”;
FacesContext fctx = FacesContext.getCurrentInstance();
ExternalContext ectx = fctx.getExternalContext();
HttpServletResponse response = (HttpServletResponse) ectx.getResponse();
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
response.setHeader("Content-Transfer-Encoding", "Binary");
response.setHeader("Pragma", "private");
response.setHeader("cache-control", "private, must-revalidate");
ServletOutputStream outs = response.getOutputStream();
outs.write(binary_data);
outs.flush();
outs.close();
response.flushBuffer();
fctx.responseComplete();
} catch (IOException ex) {
ex.printStackTrace();
}
}
That’s it for today.
P.S. alternatively you can use this component which is less code intensive: http://kenai.com/projects/scales/pages/Download
2 comments:
You can also use MyFaces Commons Exporter ;).
Please post a link to an example Hazem. Haven't been able to locate it on Google.
Thanks!
Post a Comment