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);
那麼,這行代碼就可以實現你想不到的亂碼問題解決