private void doDown(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        RequestDispatcher rd = null;
        HSSFWorkbook workBook = null;
        try{                workBook = writeToExcelSonotaMH(req, list);
                if (workBook == null) {
                    rd = req.getRequestDispatcher(SontaCommon.DOWNLOAD_JSP);
                    rd.forward(req, res);
                } else {
                    String downloadFileName = Common.XLS;                    res.reset();
                    res.setContentType("application/x-msexcel;charset=Shift_JIS");
                    res.setHeader("Content-Disposition", "attachment; filename=\""
                                  + CommonUtil.toUtf8String(downloadFileName)
                                  + "\""
                                 );
                    workBook.write(res.getOutputStream());          } 
          rd = req.getRequestDispatcher(SontaCommon.DOWNLOAD_JSP);
        }catch (Exception ce)
        {
        } finally
        {
          
          }
    }当文件被保存或者是取消后,当前的DOWLOAD画面可以被跳转到其他的画面么,这么写跳不出去不知道为什么,谢谢各位大虾.

解决方案 »

  1.   

    第二个 rd = req.getRequestDispatcher(SontaCommon.DOWNLOAD_JSP);
    后面是 不是少了个 rd.forward(req, res);
    另外你workBook == null时侯可以转过去吗?如果不行抱啥错?
    SontaCommon.DOWNLOAD_JSP 这个常量的路径写的对吗?
      

  2.   

    呵呵,我写的就是把一打块中主要的摘出来了,就是说在没有任何异常的情况下,JSP弹出文件保存对话框之后,要条转到其他画面.SontaCommon.DOWNLOAD_JSP 这里定义的是一个完整的JSP路径.workBook  是文件的输出流,如果无值就直接掉转错误画面.我问的是下边的,如果不为NULL的情况.保存文件后的跳转.最后确实是忘加上了个  
    rd.forward(req, res);谢谢.
    private void doDown(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            RequestDispatcher rd = null;
            HSSFWorkbook workBook = null;
            try{                workBook = writeToExcelSonotaMH(req, list);
                    if (workBook == null) {
                        rd = req.getRequestDispatcher(SontaCommon.DOWNLOAD_JSP);
                        rd.forward(req, res);
                    } else {
                        String downloadFileName = Common.XLS;                    res.reset();
                        res.setContentType("application/x-msexcel;charset=Shift_JIS");
                        res.setHeader("Content-Disposition", "attachment; filename=\""
                                      + CommonUtil.toUtf8String(downloadFileName)
                                      + "\""
                                     );
                        workBook.write(res.getOutputStream());          } 
              rd = req.getRequestDispatcher(SontaCommon.DOWNLOAD_JSP);
              rd.forward(req, res);// 这里跳不走.        }catch (Exception ce)
            {
            } finally
            {
              
              }
        }
      

  3.   

    那你debug一下,看代码执行到哪里停下的,没有任何提示信息吗,在控制台输出看看? 换一下位置呢,把这个方法里的内容直接放到doGet()和doPost()看管用不,或者再试下response.sendRedirect()呢~~
      

  4.   

    用这个试一下 rd = req.getRequestDispatcher(SontaCommon.DOWNLOAD_JSP).forward(req, res);
      

  5.   

    我试试,程序DEBUG的时候 rd.forward(req, res);// 这里跳不走.
    这句是走了的,但就是跳不出去.
      

  6.   

    那你把该方法代码直接放到doGet()和doPost()里离跳转不?
      

  7.   

    郁闷了,是不是写完文件就不能跳了呢?放doGet里也是一样的.这个方法就是doGet调用的.
      

  8.   

    那你把上面的写文件注释掉或随便写点啥,看能不能跳转呢?
    我刚写了个方法,在doGet()里调用就不跳转,直接放到doGet()就跳转,你呢?
      

  9.   

    res.reset();
                        res.setContentType("application/x-msexcel;charset=Shift_JIS");
                        res.setHeader("Content-Disposition", "attachment; filename=\""
                                      + CommonUtil.toUtf8String(downloadFileName)
                                      + "\""
                                     );
                        workBook.write(res.getOutputStream());这几个不加就可以跳,但是要有文件出来呀...
      

  10.   

    把finally去掉,在catch里加上ce.printStackTrace()再看看
      

  11.   

    刚查了下,说在forward之前如果往缓冲区里写入了内容,只要该内容没有被真正的输出到客户端,forward方法就可以正确执行,缓冲区里的内容会被清空.比如说
    PrintWriter out = response.getWriter();
    out.println("fadafsdfdsa");
    //response.flushBuffer();
     rd = req.getRequestDispatcher(SontaCommon.DOWNLOAD_JSP);
     rd.forward(req, res);这样能转发,但不显示上面的("fadafsdfdsa");但如果你把注释去掉,强制刷新到客户端,就只显示("fadafsdfdsa");而不转发了.你保存了文件就不转发是不是这个原因?
    你用response.sendRedirect()试没?
      

  12.   

    加上catch,看是不是抱java.lang.IllegalStateException:cannot forward after response has been committed的异常.
      

  13.   

    Response 已经被提交了,怎么办那.
      

  14.   

    笨办法,用js
    PrintWriter out = response.getWriter();
    out.print("<script>window.location.href='MyHtml.html'</script>");
      

  15.   

    OutputStream already retrieved  更郁闷了.
      

  16.   

    在forward之前如果往缓冲区里写入了内容,只要该内容没有被真正的输出到客户端遇到这个,一般可以用js来提出跳转功能。
    跟asp里面的redirect一样的毛病
      

  17.   

    你第二个 rd = req.getRequestDispatcher(SontaCommon.DOWNLOAD_JSP);
    注释掉,换成PrintWriter out = response.getWriter();
    out.print("<script>window.location.href='MyHtml.html'</script>"); 不行吗?抱啥错?
      

  18.   

    抱  ::  OutputStream already retrieved  更郁闷了.
      

  19.   

    SontaCommon.DOWNLOAD_JSP 里面有没有用到out?
      

  20.   

    RequestDispatcher本身就跳不出去,可以用request.sendRedirect跳出去
      

  21.   

    用request.sendRedirect的话,就算能跳转到第二页面页接不到相应的变量值。你这段代码似乎写的不是地方,最好不要写在控制层,应该写在业务层,这样能避免一些不必要的麻烦。个人建议你把这段功能代码单独写成一个类放在业务层,留个接口就行,然后在ACTION类调用,这样可以避免控制层跳转发生错误的几率。个人小小建议,没帮什么忙,所以不许给分。呵呵!