JSF : générer un fichier à partir d’un managed bean

Dans cet exemple, je vais générer un fichier Excel à partir d’un managed bean.
L’idée de base est de récupérer le context de la servlet pour créer une réponse et rediriger l’utilisateur vers cette dernière. Voici à quoi ressemble mon bean :
@Model public class MonBean { public String execute() throws IOException { // Création du fichier excel : String fileName = "azerty.xls"; HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(fileName); HSSFHeader header = sheet.getHeader(); header.setCenter(fileName); // Récupération de la réponse HTTP ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment; filename="+ fileName); // Ecriture de la réponse ServletOutputStream out = response.getOutputStream(); wb.write(out); out.close(); FacesContext.getCurrentInstance().responseComplete(); return null; } }
Ensuite, il suffit de demander la méthode execute() du bean.
<h:form> <h:commandButton action="#{monBean.execute}" value="download" /> </h:form>
Vous pouvez trouver le code source de cet exemple ici. Pour exécuter l’exemple il faut lancer la commande mvn compile tomcat:run et se diriger vers l’adresse http://localhost:9090/home.jsf