2011-01-07 3 views
0

Когда я пытаюсь использовать standard servlet approach, в моем браузере появляется всплывающее окно с вопросом, следует ли открыть файл .xls или сохранить его.Зачем загружать всплывающее окно в браузере, не отображающееся при использовании JAX-RS v.s. стандартный сервлет?

Я пробовал точно такой же код через JAX-RS и всплывающее окно браузера не появится. Кто-нибудь сталкивался с этим?

JAX-RS способ, который не будет отображаться всплывающее окно:

@Path("excellaTest") 
public class ExcellaTestResource { 
    @Context 
    private UriInfo context; 
    @Context 
    private HttpServletResponse response; 
    @Context 
    private HttpServletRequest request; 

    public ExcellaTestResource() { 
    } 


    @Path("horizontalProcess") 
    @GET 
    //@Produces("application/vnd.ms-excel") 
    @Produces("application/vnd.ms-excel") 
    public void getProcessHorizontally() { 
     try { 

      URL templateFileUrl = this.getClass().getResource("myExcelTemplate.xls"); 
      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("myExcelSheet"); 
      outputBook.addReportSheet(outputSheet); 

      reportProcessor.addReportBookExporter(new OutputStreamExporter(response)); 
      reportProcessor.process(outputBook); 

      System.out.println("done!!"); 
     } 
     catch(Exception e) { 
      System.out.println(e); 
     } 

     return; 
    } 


}//end class 


class OutputStreamExporter extends ReportBookExporter { 

    private HttpServletResponse response; 

    public OutputStreamExporter(HttpServletResponse response) { 
     this.response = response; 
    } 

    //ReportProcessor output() 
    //This method is call when ReportProcessor process() is invoked. 
    //The Workbook from POI API can be used to write to stream 

    @Override 
    public void output(Workbook book, BookData bookdata, ConvertConfiguration configuration) throws ExportException { 

     //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 

ответ

1

Какая структура JAX-RS вы используете?

Я предполагаю, что ваш код не работает, потому что вы возвращаетесь в пустоту. Используемая вами структура, вероятно, распознает void как HTTP 204 No Content. Это приводит к тому, что браузер пропускает фактическое тело ответа и игнорирует заголовок conntent-disposition.

Как я уже писал вам в параллельном потоке: попробуйте вернуть объект Response. Вы можете поместить либо OutputStream, либо byte [] в качестве объекта, который задает заголовок содержимого.

+0

Я не знал, что существует более чем одна инфраструктура JAX-RS. Я использую тот, который поставляется с пакетом NetBean 6.9 + GlassFish v3. Поэтому я создаю файл службы JAX-RS, используя NetBean. –

+0

Хорошо, просто fyi: вы используете Джерси. Существует больше фреймворков, поддерживающих JAX-RS: Apache Wink, CXF, RestEasy и Restlet. – Tarlog

1

Я никогда не использовали инъекции уровня класса для обслуживания JAX-RS. Я предлагаю одно из двух решений.

1) Попробуйте ввести запрос и ответ в качестве аргументов метода.

2) Выведите файл в выходной поток массива байтов и верните массив байтов из вашего метода вместо void.