Java getRequestDispatcher()、getOutputStream()和getWriter()之间有关系吗?

Java getRequestDispatcher()、getOutputStream()和getWriter()之间有关系吗?,java,exception,servlets,stream,printwriter,Java,Exception,Servlets,Stream,Printwriter,我有一段我的工作代码 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter writer = response.getWriter(); r

我有一段我的工作代码

protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");

        PrintWriter writer = response.getWriter();
        request.getRequestDispatcher("link.html").include(request, response);


        String userName = request.getParameter("userName");
        String passWord = request.getParameter("passWord");
我对这段代码没有任何问题,它按照我希望的方式工作。但是,如果我交换getWriter()和getRequestDispatcher()的位置,则会显示IllegalArgumentException

protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");

        request.getRequestDispatcher("link.html").include(request, response);
        PrintWriter writer = response.getWriter();

        String userName = request.getParameter("userName");
        String passWord = request.getParameter("passWord");

java.lang.IllegalStateException: getOutputStream() has already been called for this response
    org.apache.catalina.connector.Response.getWriter(Response.java:614)
    org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:199)
    com.servlet.LoginServlet.doPost(LoginServlet.java:34)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
它表示已经调用了
getOutputStream()
。我一直在寻找这个例外,但我没有看到任何适当的解释与我目前的情况

这些是我的假设(如果我错了,请纠正我)

  • getRequestDispatcher()
    隐式调用
    getOutputStream()
    ,如果调用
    getWriter()
    方法,将显示异常,因为不能同时调用
    getOutputStream()
    和`getWriter()

  • 如果在
    getRequestDispatcher()
    方法之前调用
    getWriter()
    方法,
    getRequestDispatcher()
    将使用返回的
    PrintWriter
    对象,而不是调用
    getOutputStream()


  • 如果我所有的假设都是错误的,你能告诉我这三种方法的正确关系吗?

    getOutputStream()和getWriter()之间有一种关系

    但是,getRequestDispatcher()之间没有关系

    getOutputStream()
    getWriter()
    之间的关系是,在请求处理过程中,不能同时使用它们。原因是,使用这两种方法会交错数据。它不符合最终要求

    在您的情况下,
    getRequestDispatcher()
    正在使用
    getOutputStream()
    因此您无法稍后使用
    getWriter()
    进行写入


    也可能是其他原因

    getOutputStream()和getWriter()之间有一种关系

    但是,getRequestDispatcher()之间没有关系

    getOutputStream()
    getWriter()
    之间的关系是,在请求处理过程中,不能同时使用它们。原因是,使用这两种方法会交错数据。它不符合最终要求

    在您的情况下,
    getRequestDispatcher()
    正在使用
    getOutputStream()
    因此您无法稍后使用
    getWriter()
    进行写入


    也可能是其他原因

    我想你说得很对,我想你说得很对。