2016-04-29 14 views
1

私は私の作業コード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()ができないため、例外が表示されます。両方とも呼ばれた。 getWriter()方法がgetRequestDispatcher()メソッドの前に呼び出され

  2. 場合、getRequestDispatcher()ではなくgetOutputStream()を呼び出すので返されたPrintWriterオブジェクトを使用します。

私の前提が間違っている場合は、これらの3つの方法との正しい関係は何か教えてください。

+0

あなたはそれがかなり正しいと思います。 – EJP

答えて

0

ここでは、getOutputStream()とgetWriter()の関係です。

ただし、はgetRequestDispatcher()とは関係ありません。

getOutputStream()getWriter()の関係は、リクエスト処理中は両方を使用できないということです。その理由は、両方のメソッドを使用するとデータをインターリーブするためです。最終的な要件を満たしていません。

getRequestDispatcher()getOutputStream()を使用しているため、後でgetWriter()を使用して書き込むことはできません。

それ以外の場合もあります。