2016-04-29 64 views
1

我有我的工作代碼Do getRequestDispatcher(),getOutputStream()和getWriter()有一些關係嗎?

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()

如果我所有的假設都是錯誤的,你能告訴我這3種方法的正確關係嗎?

+0

我認爲你已經說得很對。 – EJP

回答

0

There 是getOutputStream()和getWriter()之間的關係

但是,那裏getRequestDispatcher()之間沒有關係。

getOutputStream()getWriter()之間的關係是在請求處理過程中不能使用它們。原因是,使用這兩種方法會交錯數據。它不符合最終要求。

在您的情況下,getRequestDispatcher()正在使用getOutputStream(),因此您以後無法使用getWriter()進行編寫。

也可能是其他情況。