我写了一个jsp 下载程序 正常的话下载没问题  但是当我把文件删除了 就是下载时找不到文件的时候做异常处理
跳转到错误页面,可是页面一出现异常就不跳转怎么回事啊 高手们帮我看看啊 JSP代码 :
download.jsp
<a href="download.jsp?path=img&&name=test.doc">download</a> 
<% 
String root = getServletContext().getRealPath("/"); 
String path = request.getParameter("path")+"\\"; 
String name = request.getParameter("name"); 
System.out.println(name);
//System.out.println(root);
response.setContentType("unknown"); 
response.setHeader("Content-Disposition","attachment; filename=\"" + new String(name.getBytes("GB2312"),"iso-8859-1") + "\"");
  File file = new File(root + path + name);
  if(!file.canExecute()){
   System.out.println("--------------------------------------------");
   request.setAttribute("error","下载失败!此文件已经不存在!");
response.sendRedirect("OA/error.jsp");
  }
try{java.io.OutputStream os = response.getOutputStream();java.io.FileInputStream fis = new java.io.FileInputStream(root + path + name);
System.out.println(root+path+name);
byte[] b = new byte[1024];int i = 0; while ( (i = fis.read(b)) > 0 ) {os.write(b, 0, i);} fis.close();os.flush();os.close();out.clear();
out = pageContext.pushBody();}
catch (Exception e ){
request.setAttribute("error","下载失败!此文件已经不存在!");
response.sendRedirect("OA/error.jsp");} %>报出的异常是:
java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.coyote.tomcat5.CoyoteResponse.getWriter(CoyoteResponse.java:599)
org.apache.coyote.tomcat5.CoyoteResponseFacade.getWriter(CoyoteResponseFacade.java:163)
org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:122)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:115)
org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:190)
org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:115)
org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
org.apache.jsp.OA.download_jsp._jspService(download_jsp.java:145)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1063)
org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:386)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:229)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
comm.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:38)

解决方案 »

  1.   

    <a   href="download.jsp?path=img&&name=test.doc"> download </a> 去掉这一行试试看
      

  2.   

    检查一下看看有没有流忘记了关闭,用catch (Exception e){}finally {}把所有的流关闭。
      

  3.   

    <a       href="download.jsp?path=img&&name=test.doc">   download   </a>
    这条不是download.jsp的代码 是下载页的链接
      

  4.   

    方法1:
    os.write("<script type='text/javascript'>self.location='OA/error.jsp';</script>".getByte());
    你已经使用了 response.getOutputStream(); 
    以后所有的输出必须用这个了!方法2:
    out.clearBuffer(); // 加上这一句
    response.sendRedirect("OA/error.jsp"); 
      

  5.   

    应该不能跳转了吧,你已经用response响应了请求(下载文件到客户端),再跳转相当于另一次响应,一个请求应该只能相应一次吧。不知这样认为对否!