Hello All
This post is about using
af:fileDownloadActionListener to generate file on run-time, suppose i have a viewObject and i want to export it's data in CSV or plain text so for this requirement we can generate file at run-time and send it to client UI to download
What is af:fileDownloadActionListener-
as per oracle docs-
The fileDownloadActionListener tag is a declarative way to allow an
action source (<commandButton>, <commandLink>, etc.) to
programatically send the contents of a file to the user, optionally with
a specific content type and filename. Since file downloads must be
processed with an ordinary request - not XMLHttp AJAX requests - this
tag forces partialSubmit to be false on the parent component, if it
supports that attribute.
The fileDownloadActionListener uses the native (browser built-in) filedownload popup, so this popup cannot be configured.
In this post i am using Departments table of HR schema
- Prepare model part using Departments table and drop it on page as a table and add a button to UI for downloading
- drop af:fileDownloadActionListener as child of button and set it's property as contentType, method , fileName
- Now see code written in download Listener-
/**Method to get BindingsContainer for current page
* @return
*/
public BindingContainer getBindingsCont() {
return BindingContext.getCurrent().getCurrentBindingsEntry();
}
/**Method to download ViewObject's data in plain text file
* @param facesContext
* @param outputStream
* @throws UnsupportedEncodingException
* @throws IOException
*/
public void fileDownloadListener(FacesContext facesContext,
OutputStream outputStream) throws UnsupportedEncodingException, IOException {
OutputStreamWriter w = new OutputStreamWriter(outputStream, "UTF-8");
//Get itertaor from bindings
DCIteratorBinding deptIter = (DCIteratorBinding) getBindingsCont().get("Departments1Iterator");
//Get ViewObject from Iterator
ViewObjectImpl vo = (ViewObjectImpl) deptIter.getViewObject();
ViewAttributeDefImpl[] attrDefs = vo.getViewAttributeDefImpls();
int count = 0;
RowSetIterator rsi = vo.createRowSetIterator(null);
while (rsi.hasNext()) {
Row nextRow = rsi.next();
if (nextRow != null) {
// Code to iterate over ViewObject's column to get all columns value at runtime
for (ViewAttributeDefImpl attrDef : attrDefs) {
byte attrKind =
attrDefs[count].getAttributeKind(); //checks attribute kind for each element in an array of AttributeDefs
if (attrKind != AttributeDef.ATTR_ASSOCIATED_ROW &&
attrKind != AttributeDef.ATTR_ASSOCIATED_ROWITERATOR) {
String columnName = attrDef.getName();
w.write(columnName + " - " + nextRow.getAttribute(columnName) + " ");
}
}
// Code to create new line text line for new Row
w.write(System.getProperty("line.separator"));
}
}
//Flush the writer after wrting file
w.flush();
}
}
- Run this application and click on download button, browser download box appears , open downloaded file and see how your data appears in text file, to export data in a pdf file you have to generate PDF file using some API then you can download it in same way
Cheers:) Happy Learning