Search code examples
jspillegalstateexception

getting IllegalStateException for my code with message "getOutputStream() has already been called for this response"


Problem

I am getting below error whenever I try to submit a form using JSP. I want to update a value in hashtable based on inputs from a form(in ChangePassword.html) and print some output using a JSP(ChangePasswordJSP.jsp) page and then pass the request and response to another JSP page.

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

I need to do it with JSP(without using servlet) I am using Netbeans as IDE and Glassfish-5 as a server.

ChangePassword.html

<html>
    <!-- Form to change the password, takes in User Id and current password. -->

    <head>
        <title>Change Password </title>
    </head>
    <body bgcolor="#FDF5E6">
        <h3> Change Password </h3>
        <form name="myForm" action="ChangePasswordJSP.jsp" method="post">
            <label>User Name: </label>
            <input type="text" id="uName" name="uName" required/>
            <br>
            <br>
            <label>Old Password: </label>
            <input type="password" id="oldPass" name="oldPass" required/>
            <br>
            <br>
            <label>New Password: </label>
            <input type="password" id="newPass" name="newPass" required/>
            <br>
            <br>
            <label>Confirm New Password: </label>
            <input type="password" id="confirmNewPass" name="confirmNewPass" required/>
            <br>
            <br>
            <br>
            <button type="submit" value="Submit" >Submit</button>
            <button type="reset" value="Reset">Reset</button>
        </form>
    </body>
</html>

ChangePasswordJSP.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.util.Hashtable"%>
<%@page import="javax.servlet.http.HttpSession"%>
<%--<%@ page trimDirectiveWhitespaces="true" %>--%>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>

        <%! Hashtable users = new Hashtable(); %>
        <%!
            public void init() {
                users.put("ann", "aaa");
                users.put("john", "jjj");
                users.put("mark", "mmm");
            }
        %>
        <%
            session = request.getSession();
            if (session.getAttribute("users") == null) {
                session.setAttribute("users", users);
            }
            String userName = request.getParameter("uName");
            String oldPassword = request.getParameter("oldPass");
            String newPassword = request.getParameter("newPass");
            String confirmNewPassword = request.getParameter("confirmNewPass");

            if (users != null && newPassword.equals(confirmNewPassword) && users.get(userName).equals(oldPassword)) {
                out.println("<h3>Password Changed Successfully. </h3>");
                users.put(userName, newPassword);
                request.getSession().setAttribute("users", users);
                //  request.getRequestDispatcher("/LoginServlet").forward(request, response);

            } else {
                //Password unsuccessful.
                out.println("<h3>Password Unsuccessful</h3>");
            }

            out.println("</body>");
            out.println("</html>");
            request.getRequestDispatcher("/index.html").include(request, response);
        %>



    </body>
</html>

Glass Fish Server Log

Warning:   StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:695)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:180)
    at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:195)
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:188)
    at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:240)
    at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:185)
    at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:137)
    at org.apache.jsp.ChangePasswordJSP_jsp._jspService(ChangePasswordJSP_jsp.java:118)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:411)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1540)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:119)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:611)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:550)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:114)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:199)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:463)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:168)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:242)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
    at java.lang.Thread.run(Thread.java:748)

Solution

  • Do the following:

    • response.getOutputStream() instead of default print writer available named out.
    • close the output stream after calling request.getRequestDispatcher("/index.html").include(request, response);

    The code with modifications for ChangePasswordJSP.jsp:

    <%
                session = request.getSession();
                ServletOutputStream ot = response.getOutputStream();
                if (session.getAttribute("users") == null) {
                    session.setAttribute("users", users);
                }
                String userName = request.getParameter("uName");
                String oldPassword = request.getParameter("oldPass");
                String newPassword = request.getParameter("newPass");
                String confirmNewPassword = request.getParameter("confirmNewPass");
    
                if (users != null && newPassword.equals(confirmNewPassword) && users.get(userName).equals(oldPassword)) {
                    ot.println("<h3>Password Changed Successfully. </h3>");
                    users.put(userName, newPassword);
                    request.getSession().setAttribute("users", users);
                    //  request.getRequestDispatcher("/LoginServlet").forward(request, response);
    
                } else {
                    //Password unsuccessful.
    
                    ot.println("<h3>Password Unsuccessful</h3>");
                }
    
                ot.println("</body>");
                ot.println("</html>");
                request.getRequestDispatcher("/index.html").include(request, response);
                ot.close();
            %>