java.lang.IllegalStateException:在servlet中提交响应后无法转发

前端之家收集整理的这篇文章主要介绍了java.lang.IllegalStateException:在servlet中提交响应后无法转发前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > 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表示存在异常
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.
}

也可以看看:

> java.lang.IllegalStateException: Cannot (forward | sendRedirect | create session) after response has been committed

猜你在找的Java相关文章