【问题标题】:Do getRequestDispatcher(), getOutputStream() and getWriter() have some relationship?getRequestDispatcher()、getOutputStream() 和 getWriter() 有什么关系吗?
【发布时间】:2016-04-29 01:24:05
【问题描述】:

我的工作代码有这个 sn-p

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() 已经被调用。我一直在搜索这个异常,但我没有看到任何与我目前的情况有关的适当解释。

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

  1. getRequestDispatcher() 隐式调用getOutputStream(),如果调用getWriter() 方法则会显示异常,因为getOutputStream() 和`getWriter() 不能同时调用。

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

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

【问题讨论】:

  • 我认为你说得对。

标签: java exception servlets stream printwriter


【解决方案1】:

getOutputStream() 和 getWriter() 之间存在关系

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

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

在您的情况下,getRequestDispatcher() 正在使用getOutputStream(),因此您以后无法使用getWriter() 编写。

也可能是其他情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2018-11-21
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多