Pregunta sobre jsf, java, download, csv – Descargando un archivo CSV usando JSF

5

No sé cómo descargar un archivo CSV. El CSV será generado en tiempo de ejecución. ¿Debo guardar primero el archivo en el directorio WEB-INF de Tomcat? Estoy usando JSF 1.2.

Por cierto, ¿cuál es el componente JSF favorito para este tipo de tarea?

Editar (05.05.2012 - 15:53)

Probé la soluciónBalusC declarado en su primeraenlazar, pero si hago clic en el botón de comando, el contenido del archivo se muestra en la página web. Tal vez hay un problema con elmimetype?

archivo xhtml:

<code><a4j:form>
    <a4j:commandButton action="#{surveyEvaluationBean.doDataExport}" value="#{msg.srvExportButton}" />
</a4j:form>
</code>

frijol principal

<code>    public String doDataExport() {

    try {
        export.downloadFile();  
    } catch (SurveyException e) {
        hasErrors = true;
    }
    return "";
}
</code>

haba de exportación

<code>public void downloadFile() throws SurveyException {

    try {

        String filename = "analysis.csv";

        FacesContext fc = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();

        response.reset();
        response.setContentType("text/comma-separated-values");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

        OutputStream output = response.getOutputStream();

        // writing just sample data
        List<String> strings = new ArrayList<String>();

        strings.add("filename" + ";" + "description" + "\n");
        strings.add(filename + ";" + "this is just a test" + "\n");

        for (String s : strings) {
            output.write(s.getBytes());
        }

        output.flush();
        output.close();

        fc.responseComplete();

    } catch (IOException e) {
        throw new SurveyException("an error occurred");
    }
}
</code>

Editar (05.05.2012 - 16:27)

Resolví mi problema. Tengo que usar<h:commandButton> en lugar de<a4j:commandButton> y ahora funciona!

Tu respuesta

2   la respuesta
0


Puedes echar un vistazo a esoenlazar.

Si no lo puedes hacer así:

<code>List<Object> report = new ArrayList<Object>(); // fill your arraylist with relevant data 
String filename = "report.csv";    
File file = new File(filename);
Writer output = new BufferedWriter(new FileWriter(file));
output.append("Column1");
output.append(",");
output.append("Column2");
output.append("\n");
//your data goes here, Replcae Object with your bean
for (Object row:report){
    output.append(row.field1);
    output.append(",");
    output.append(row.field2);
    output.append("\n");
}
output.flush();
output.close();
</code>
4

¿Debo guardar primero el archivo en el directorio WEB-INF de Tomcat?

No, solo escríbelo directamente al cuerpo de la respuesta HTTP a medida que lo obtieneExternalContext#getResponseOutputStream() después de haber establecido los encabezados de respuesta adecuados que le indican al navegador lo que va a recuperar.

Haga los cálculos basados ​​en los ejemplos concretos que se encuentran en las siguientes respuestas:

¿Cómo proporcionar una descarga de archivos desde un bean de respaldo JSF?JSP generando hoja de cálculo Excel (XLS) para descargar

Básicamente:

<code>List<List<Object>> csv = createItSomehow();
writeCsv(csv, ';', ec.getResponseOutputStream());
</code>

Por cierto, ¿cuál es el componente jsf favorito para este tipo de tareas?

Esto es subjetivo. Pero de todos modos, estamos usando<p:dataExporter> a plena satisfacción.

Eso es correcto, el antiguo JSF 1.x está cerca del final de su vida útil, por lo que no debe esperar un nuevo soporte de biblioteca de componentes para él. Simplemente siga adelante con la transmisión de forma manual. Solo deberías agarrar lo crudoHttpServletResponse porExternalContext#getResponse() y luego llamando a sugetOutputStream() en su lugar, pero eso ya se describe en el primer enlace. O, por supuesto, actualice a JSF 2. Ofrece tantas ventajas sobre JSF 1.2. BalusC
De nada. De hecho, no puedes descargar archivos por ajax. Eso también se menciona en el primer enlace. BalusC
Si yo usoa4j:components entonces no funcionará, pero ahora cambié a<h:commandButton> y funciona correctamente. Gracias BalusC por otra gran respuesta! yves.beutler
No creo que pueda usarPrimeFaces, porque no soportan JSF 1.2 desdePrimeFaces 2.0 cuando tengo razon yves.beutler
Conozco las desventajas de jsf 1.2, pero en este momento no podemos actualizar a un nivel superior. Intenté entender tu primer enlace, pero no funciona. Utilicé el mimetypetext/comma-separated-values Lo encontré en la web, pero los navegadores (IE, FF, Chrome) no lo interpretan correctamente. yves.beutler

Preguntas relacionadas