Se è vero che è più usuale per scrivere un allegato binario utilizzando un servlet piuttosto che una jsp, è certamente possibile scrivere un allegato binario da una jsp. E il vantaggio di farlo è che non devi preoccuparti di configurare web.xml o ricaricare la tua applicazione. Questa può essere una considerazione importante, a seconda dell'ambiente del server web.
Ecco un esempio di jsp che utilizza poi per inviare un allegato binario a un browser.
<%@page import="org.apache.poi.hssf.usermodel.*" %><%@page import="java.io.*" %><%
// create a small spreadsheet
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
cell.setCellValue("Some text");
// write it as an excel attachment
ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
wb.write(outByteStream);
byte [] outArray = outByteStream.toByteArray();
response.setContentType("application/ms-excel");
response.setContentLength(outArray.length);
response.setHeader("Expires:", "0"); // eliminates browser caching
response.setHeader("Content-Disposition", "attachment; filename=testxls.xls");
OutputStream outStream = response.getOutputStream();
outStream.write(outArray);
outStream.flush();
%>
Il trucco importante è assicurarsi che ci sia una sola riga con tutti i vostri le importazioni e le altre direttive prima della "<%" che inizia il codice. In caso contrario, jsp potrebbe emettere alcune nuove righe iniziali e corrompere l'output.
Inoltre, suggerisco di impostare sempre la lunghezza del contenuto. Alcuni browser non funzioneranno correttamente se non sono impostati. Questo è il motivo per cui prima ho inviato il mio foglio di calcolo a un array di byte, quindi ho potuto impostare la lunghezza prima di inviare effettivamente i dati.
fonte
2012-06-28 16:31:53
writableworkbook è parte di il jexcel api giusto? questo dovrebbe funzionare anche se im usando poi giusto? – user571099
@ user571099 la cartella di lavoro è un 'HSSFWorkbook' qui, non un' WritableWorkbook'. –
Questo era esattamente quello che stavo cercando! Presumo che questo possa essere fatto in modo simile con il servizio web Jersey RESTful? – Brian