Hi, I'm stumped and was hoping someone might be able to point me in the right direction. I have an html page form that contains a series of checkboxes and radio buttons the form directs to a jsp page that processes the user's selections to determine which files to zip up for the user to download. I have written a servlet to do the zipping up of subdirectories according to the user's selections however I think that I am not calling it correctly. When the user hits the submit button - the resulting page is blank and the local_host log says this:
org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: getOutputStream() has already been called for this response The excerpt from the jsp file where the zip servlet is called is pasted below along with the zipservlet - any suggestions? Thanks! from jsp: request.setAttribute("tcases",cases); request.setAttribute("path",testdir); RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/servlet/ZipServlet"); dispatcher.include(request,response); zipservlet.java: public class ZipServlet extends HttpServlet { /** * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. * @param request servlet request * @param response servlet response */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/zip"); response.setHeader("Content-disposition", "attachment; filename=selectedCases.zip"); try { ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream()); Vector<String> cases = findCases(request); String testpath = findPath(request); for(Iterator it = cases.iterator();it.hasNext();) { File tcase = new File(testpath + it.next()); addFilesToZip(tcase, File.separator, zipOutputStream); } zipOutputStream.flush(); zipOutputStream.close(); } catch (Exception e) { } finally { } } protected Vector<String> findCases(HttpServletRequest request) throws IOException { Vector<String> cases = (Vector<String>)request.getAttribute("tcases"); return cases; } protected String findPath(HttpServletRequest request) throws IOException { String path = request.getParameter("path"); return path; } private void addFilesToZip(File path, String pathInZip, ZipOutputStream zipOutputStream) { if (path.exists()) { File[] files = path.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { addFilesToZip(files[i], pathInZip + files[i].getName() + File.separator, zipOutputStream); } else { try { FileInputStream in = new FileInputStream(files[i]); zipOutputStream.putNextEntry(new ZipEntry(pathInZip + files[i].getName())); byte buf[] = new byte[2048]; int len; while ((len = in.read(buf)) > 0) { zipOutputStream.write(buf, 0, len); } zipOutputStream.closeEntry(); in.close(); } catch (IOException e) { } } } } } /** * Handles the HTTP <code>GET</code> method. * @param request servlet request * @param response servlet response */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Handles the HTTP <code>POST</code> method. * @param request servlet request * @param response servlet response */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Returns a short description of the servlet. */ public String getServletInfo() { return "Short description"; } }