使用消息 "getOutputStream() has already been called for this response" 为我的代码获取 IllegalStateException

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

问题

每当我尝试使用 JSP 提交表单时,我都会遇到以下错误。我想根据表单(在 ChangePassword.html 中)的输入更新哈希表中的值,并使用 JSP(ChangePasswordJSP.jsp) 页面打印一些输出,然后将请求和响应传递给另一个JSP 页。

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

我需要用 JSP 来完成(不使用 servlet) 我使用 Netbeans 作为 IDE 和 Glassfish-5 作为服务器。

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>

琉璃鱼服务器日志

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

执行以下操作:

  • response.getOutputStream() 而不是可用的默认打印编写器 out.
  • 调用后关闭输出流 request.getRequestDispatcher("/index.html").include(request, response);

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