Cannot forward after response has been committed報錯怎麼解決

maven項目中Cannot forward after response has been committed報錯怎麼解決

今天在做項目的過程當中,報了以下錯誤
在這裏插入圖片描述
發生這個問題的原因很簡單,但是卻很難去發掘,原代碼如下:

  case "register":


                req.getRequestDispatcher("/WEB-INF/admin/register.jsp").forward(req, res);

        
            String account = req.getParameter("account");
            String password = req.getParameter("password");
            //  int status = Integer.parseInt(req.getParameter("status"));

            Admin admin = new Admin(account, password);
            boolean flag = asi.add(admin);
            if (flag) {
                // String path = req.getRequestURI() + "?a=look";
                //res.sendRedirect(path);
                res.getWriter().print("<script>alert('註冊成功');</script>");
//                res.getWriter().print("<meta http-equiv=\"refresh\" content=\"3; http://localhost:8080/login?a=login\">");
                res.getWriter().print("<meta http-equiv=\"refresh\" content=\"3; http://localhost:8080/login?a=login\">");
               // req.getRequestDispatcher("/WEB-INF/admin/login.jsp").forward(req,res);
            } else {
//                    req.getRequestDispatcher("/WEB-INF/admin/login.jsp").forward(req,res);
                res.getWriter().print("<script>alert('error');history.back(); </script>");
            }

        break;

改正錯誤後代碼:

 case "register":


                req.getRequestDispatcher("/WEB-INF/admin/register.jsp").forward(req, res);

         break;

            case "register1":
            String account = req.getParameter("account");
            String password = req.getParameter("password");
            //  int status = Integer.parseInt(req.getParameter("status"));

            Admin admin = new Admin(account, password);
            boolean flag = asi.add(admin);
            if (flag) {
                // String path = req.getRequestURI() + "?a=look";
                //res.sendRedirect(path);
                res.getWriter().print("<script>alert('註冊成功');</script>");
//                res.getWriter().print("<meta http-equiv=\"refresh\" content=\"3; http://localhost:8080/login?a=login\">");
                res.getWriter().print("<meta http-equiv=\"refresh\" content=\"3; http://localhost:8080/login?a=login\">");
               // req.getRequestDispatcher("/WEB-INF/admin/login.jsp").forward(req,res);
            } else {
//                    req.getRequestDispatcher("/WEB-INF/admin/login.jsp").forward(req,res);
                res.getWriter().print("<script>alert('error');history.back(); </script>");
            }

        break;

問題分析:報錯的原因就是在一個方法裏寫了兩個請求轉換頁面,導致發生了死循環,頁面點擊註冊,註冊成功之後又返回註冊頁面,所以就會發生這個報錯,那麼應該分情況來寫,當註冊成功之後應該進入下一步,下一個方法來承接它,這也是我們不經意間就會犯得毛病。

另外:當我們在寫完 res.getWriter().print("<script>alert('註冊成功');</script>");這行代碼後,如果發現頁面上卻不顯示,那麼此時就需要考慮是不是被阻擋了,此時先可以將要跳轉語句註釋,再次運行,就可以看到;爲了得到兩者效果兼具,可以res.getWriter().print("<meta http-equiv=\"refresh\" content=\"3; http://localhost:8080/login?a=login\">");先讓他停留三秒再選擇去跳轉。這些都是我們需要注意的。

當我們跳轉過去發現頁面呈現的是亂碼時,那麼你應該在servlet語句中,寫上req.setCharacterEncoding("utf-8"); res.setCharacterEncoding("utf-8");
這兩行代碼,這個也需要注意,特別需要注意的是,當我們把所有都能想到的一般控制亂碼的地方設置之後,此時如果還有亂碼,多半應該是用到了其他功能,比如要實現上傳操作,String value= new String(fileItem.getString().getBytes("ISO8859-1"),"utf-8"); map.put(fileItem.getFieldName(),value);那麼,這行代碼就可以實現你想不到的亂碼問題解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章