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