参见英文答案 >
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.
- }
也可以看看: