restful jax example java rest header jax-rs glassfish-3

jax - restful java



¿Cómo configurar el encabezado de respuesta en JAX-RS para que el usuario vea la ventana emergente de descarga para Excel? (3)

Escribí un código que generaba un archivo Excel usando REST JAX-RS y confirmé que el archivo Excel generado está en el directorio del servidor GlassFish.

Pero mi objetivo es cuando el usuario haga clic en el botón (que genera Excel .xls), quiero que aparezca la ventana emergente de descarga preguntando al usuario si desea guardar o abrir el archivo .xls como cualquier otro servicio web para descargar cualquier tipo de archivo.

De acuerdo con mi búsqueda, el paso es:

  1. generar Excel .xls (DONE)

  2. escribe el excel para transmitir

  3. en el archivo JAX-RS, configure el encabezado de respuesta a algo así como,

    String fileName = "Blah_Report.xls"; response.setHeader ("Content-Disposition", "attachment; filename =" + fileName);

Mi pregunta es: estoy haciendo todo esto en el archivo JAX-RS y no tengo el objeto HttpServletResponse disponible.

Según la respuesta de Add Response Header to JAX-RS Webservice

Él dice:

Puede insertar una referencia al HttpServletResponse real a través de la anotación @Context en su servicio web y usar addHeader () etc. para agregar su encabezado.

Realmente no puedo entender qué significa exactamente eso sin código de muestra.


No necesita HttpServletResponse para establecer un encabezado en la respuesta. Puedes hacerlo usando javax.ws.rs.core.Response. Simplemente haga que su método devuelva Response en lugar de entity:

return Response.ok(entity).header("Content-Disposition", "attachment; filename=/"" + fileName + "/"").build()

Si aún desea utilizar HttpServletResponse, puede obtenerlo ya sea en uno de los campos de la clase, o usando la propiedad, o en el parámetro del método:

@Path("/resource") class MyResource { // one way to get HttpServletResponse @Context private HttpServletResponse anotherServletResponse; // another way Response myMethod(@Context HttpServletResponse servletResponse) { // ... code } }


Pensé en configurar el encabezado y la secuencia de respuesta HTTP para mostrar la descarga emergente en el navegador a través del servlet estándar. nota: estoy usando Excella, excel output API.

package local.test.servlet; import java.io.IOException; import java.net.URL; import java.net.URLDecoder; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import local.test.jaxrs.ExcellaTestResource; import org.apache.poi.ss.usermodel.Workbook; import org.bbreak.excella.core.BookData; import org.bbreak.excella.core.exception.ExportException; import org.bbreak.excella.reports.exporter.ExcelExporter; import org.bbreak.excella.reports.exporter.ReportBookExporter; import org.bbreak.excella.reports.model.ConvertConfiguration; import org.bbreak.excella.reports.model.ReportBook; import org.bbreak.excella.reports.model.ReportSheet; import org.bbreak.excella.reports.processor.ReportProcessor; @WebServlet(name="ExcelServlet", urlPatterns={"/ExcelServlet"}) public class ExcelServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { URL templateFileUrl = ExcellaTestResource.class.getResource("myTemplate.xls"); // /C:/Users/m-hugohugo/Documents/NetBeansProjects/KogaAlpha/build/web/WEB-INF/classes/local/test/jaxrs/myTemplate.xls System.out.println(templateFileUrl.getPath()); String templateFilePath = URLDecoder.decode(templateFileUrl.getPath(), "UTF-8"); String outputFileDir = "MasatoExcelHorizontalOutput"; ReportProcessor reportProcessor = new ReportProcessor(); ReportBook outputBook = new ReportBook(templateFilePath, outputFileDir, ExcelExporter.FORMAT_TYPE); ReportSheet outputSheet = new ReportSheet("MySheet"); outputBook.addReportSheet(outputSheet); reportProcessor.addReportBookExporter(new OutputStreamExporter(response)); System.out.println("wtf???"); reportProcessor.process(outputBook); System.out.println("done!!"); } catch(Exception e) { System.out.println(e); } } //end doGet() @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }//end class class OutputStreamExporter extends ReportBookExporter { private HttpServletResponse response; public OutputStreamExporter(HttpServletResponse response) { this.response = response; } @Override public String getExtention() { return null; } @Override public String getFormatType() { return ExcelExporter.FORMAT_TYPE; } @Override public void output(Workbook book, BookData bookdata, ConvertConfiguration configuration) throws ExportException { System.out.println(book.getFirstVisibleTab()); System.out.println(book.getSheetName(0)); //TODO write to stream try { response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename=masatoExample.xls"); book.write(response.getOutputStream()); response.getOutputStream().close(); System.out.println("booya!!"); } catch(Exception e) { System.out.println(e); } } }//end class


@Context ServletContext ctx; @Context private HttpServletResponse response; @GET @Produces(MediaType.APPLICATION_OCTET_STREAM) @Path("/download/{filename}") public StreamingOutput download(@PathParam("filename") String fileName) throws Exception { final File file = new File(ctx.getInitParameter("file_save_directory") + "/", fileName); response.setHeader("Content-Length", String.valueOf(file.length())); response.setHeader("Content-Disposition", "attachment; filename=/""+ file.getName() + "/""); return new StreamingOutput() { @Override public void write(OutputStream output) throws IOException, WebApplicationException { Utils.writeBuffer(new BufferedInputStream(new FileInputStream(file)), new BufferedOutputStream(output)); } }; }