Sunday, November 24, 2019

Java.Lang.Illegalstateexception: Getwriter() Has Already Been Called For This Response

This mistake comes when a Servlet calls the getOutputStream() method on response object for writing something afterwards calling the include() method. Suppose a Servlet calls the include() method to charge the response of a JSP. Since JSP has already written the response on it thence ane time again opening OutputStream on response object is illegal, you lot acquire the java.lang.IllegalStateException: getWriter() has already been called for this response error. This mistake besides comes when you lot endeavour to include response of but about other Servlet together with than tries to write something on output stream again. In short, your Servlet should never write anything on response object afterwards calling the include() method. 

Here is the detailed stack draw of exception :
java.lang.IllegalStateException: getWriter() has already been called for this response
org.apache.catalina.connector.Response.getOutputStream(Response.java:580)
org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:183)
HelloServlet.doGet(HelloServlet.java:20)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:723)



This a perfect beginner mistake who tries to larn Servlet together with JSP past times case together with error. If you lot know the right agency to role the include() together with forward() method so you lot won't aspect upward this type of problem. That ane time again highlights the of import of learning novel technology from a expert mass similar Head First Servlet together with JSP. The mass volition no doubtfulness instruct you lot the basics, which is quite of import inwards the long journeying of learning novel characteristic every day.

 This mistake comes when a Servlet calls the  java.lang.IllegalStateException: getWriter() has already been called for this response



java.lang.IllegalStateException: getWriter() has already been called for this response Solution

If you lot expect at the mistake carefully, you lot tin encounter it pointing to HelloServlet.doGet() method at work 20, let's encounter the HelloServlet degree to respect out what's happening at work 20.

import java.io.IOException;  import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;  public class HelloServlet extends HttpServlet {     private static in conclusion long serialVersionUID = 1L;      public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         String userAgent = req.getHeader("user-agent");         String clientBrowser = "Not known!";         if (userAgent != null)             clientBrowser = userAgent;         req.setAttribute("client.browser", clientBrowser);         req.getRequestDispatcher("/hello.jsp").include(req, resp);         resp.getOutputStream().println("This is written from Servlet");     }  }

You tin encounter that at work twenty nosotros are calling the getOutputStream() afterwards calling the include() method of RequestDispather, this is causing the problem. Remove this work together with your programme volition run fine. The bottom work is you lot should endeavour to write anything on output stream of Servlet afterwards calling the include() together with forward() method because the response is already committed.


Further Learning
Java Web Fundamentals By Kevin Jones
Spring Framework 5: Beginner to Guru
JSP, Servlets together with JDBC for Beginners: Build a Database App

No comments:

Post a Comment