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";
    }

}

Reply via email to