参见英文答案 >
java.lang.IllegalStateException: Cannot (forward | sendRedirect | create session) after response has been committed8个
在我的项目中,我禁止用户每个页面只有他已经登录.这就是我写下面代码的原因.当我输入浏览器时,例如 http://localhost:8080/JSP1/Students,我来到login.jsp页面.但在输入loginid和密码后,只显示空白页面 http://localhost:8080/JSP1/Logged,而GlassFish表示存在异常
在我的项目中,我禁止用户每个页面只有他已经登录.这就是我写下面代码的原因.当我输入浏览器时,例如 http://localhost:8080/JSP1/Students,我来到login.jsp页面.但在输入loginid和密码后,只显示空白页面 http://localhost:8080/JSP1/Logged,而GlassFish表示存在异常
if (userPath.equals("/Students")){ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/Students.jsp"); requestDispatcher.forward(request,response); } java.lang.IllegalStateException: PWC1227: Cannot forward after response has been committed
完整的doGet和doPost代码:
@Override protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { HttpSession ses = request.getSession(); String login = (String)ses.getAttribute("login"); String password = (String)ses.getAttribute("password"); if ((login==null)|(password==null)){ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/login.jsp"); requestDispatcher.forward(request,response); } //Now we think that we are successfully logged in String userPath = request.getServletPath(); // System.out.println(userPath); if (userPath.equals("/Login")){ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/login.jsp"); requestDispatcher.forward(request,response); } if (userPath.equals("/Students")){ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/Students.jsp"); requestDispatcher.forward(request,response); } if (userPath.equals("/Student")){ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/Student.jspx"); requestDispatcher.forward(request,response); } if (userPath.equals("/StudentEdit")){ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/StudentEdit.jsp"); requestDispatcher.forward(request,response); } } @Override protected void doPost(HttpServletRequest request,IOException { // processRequest(request,response); PrintWriter out = response.getWriter(); String userPath = request.getServletPath(); System.out.println(userPath); if (request.getRequestURI().equals("/Logged")){ String Login = request.getParameter("login"); String Password = request.getParameter("password"); request.getSession().setAttribute("login",Login); request.getSession().setAttribute("password",Password); RequestDispatcher requestDispatcher = request.getRequestDispatcher("/Students.jsp"); requestDispatcher.forward(request,response); } if (userPath.equals("/addStudent")) { // System.out.println(request.getContextPath()); String Name = request.getParameter("name"); String Surname = request.getParameter("surname"); String Login = request.getParameter("login"); String Password = request.getParameter("password"); Student student = new Student(Name,Surname,Login,Password); if (student != null) { dao.insertStudent(student); } else { System.out.println("Not valid parameter!!!"); } RequestDispatcher requestDispatcher = request.getRequestDispatcher("/Students.jsp"); requestDispatcher.forward(request,response); } if (request.getRequestURI().equals("/Edit")) { System.out.println("We work with students!!!"); String delete = request.getParameter("Add_new_student"); if (delete != null){ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/Student.jspx"); requestDispatcher.forward(request,response); } Enumeration parameters = request.getParameterNames(); while (parameters.hasMoreElements()) { String parameterName = (String) parameters.nextElement(); String parameterValue = request.getParameter(parameterName); String norder = parameterName.substring(parameterName.indexOf("_")+1); ArrayList<Student> curStudents = dao.getAllStudents(); int norderint = Integer.parseInt(norder); Student studentToWork = curStudents.get(norderint); String actionToDo = parameterName.substring(0,parameterName.indexOf("_")); if (actionToDo.equals("Edit")){ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/StudentEdit.jsp"); ServletContext cont = request.getServletContext(); cont.setAttribute("studentToEdit",studentToWork); requestDispatcher.forward(request,response); } else { boolean attemp = dao.deleteStudent(studentToWork); if (attemp){ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/Students.jsp"); requestDispatcher.forward(request,response); } else { out.println("Unsuccessfull attemp to delete a Student"); } } } } if (userPath.equals("/EditStudent")){ System.out.println("We work with StudentEdit!"); Student studentToEdit = (Student)request.getSession().getAttribute("studentToEdit"); String newName = request.getParameter("name"); String newSurname = request.getParameter("surname"); String newLogin = request.getParameter("login"); String newPassword = request.getParameter("password"); Student newStudent = new Student(newName,newSurname,newLogin,newPassword); boolean update = dao.updateStudent(studentToEdit,newStudent); if (update){ out.println("<p>You have successfully edited a Student=" + studentToEdit.toString() + " to Student="+ newStudent.toString()); } else { out.println("<p>Unsuccessful attempt to edit!</p>" ); } } }
login.jsp很简单:
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <Meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <form action="/JSP1/Logged" method="POST"> <table> <tr> <td>Login:</td> <td><input type="text" name="login" value=""/> </td> </tr> <tr> <td>Password </td> <td><input type="password" name="password"/> ></td> </tr> <tr> <td><input type="submit" name="OK" value="OK" /> </td> </tr> </table> </form> </body>
我无法弄清楚发生了什么.
解决方法
如果未提供登录和/或密码,您不会在转发后返回.在初学者中常见的误解是,forward()方法神奇地终止了代码执行并以某种方式跳出了方法.因此不是这样.您必须从方法返回并自行停止执行代码的残余.
你需要添加一个回报;
if ((login==null)|(password==null)){ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/login.jsp"); requestDispatcher.forward(request,response); return; }
if ((login==null)|(password==null)){ RequestDispatcher requestDispatcher = request.getRequestDispatcher("/login.jsp"); requestDispatcher.forward(request,response); } else { // Now we think that we are successfully logged in. // Yes,that above comment is now finally true. // Put your bunch of non-DRY if-else code here. }
也可以看看: