getRequestDispatcher(),getOutputStream()和getWriter()有一些关系吗?

时间:2016-04-29 01:24:05

标签: java exception servlets stream printwriter

我有我的工作代码片段

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. 如果在getWriter()方法之前调用getRequestDispatcher()方法,则getRequestDispatcher()将使用返回的PrintWriter对象,而不是调用getOutputStream()。< / p>

  3. 如果我的所有假设都错了,你能否告诉我这3种方法的正确关系是什么?

1 个答案:

答案 0 :(得分:0)

是getOutputStream()和getWriter()之间的关系。

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

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

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

否则也可能。