получение IllegalStateException для моего кода с сообщением «getOutputStream () уже был вызван для этого ответа» - PullRequest
1 голос
/ 08 июля 2019

Проблема

Я получаю сообщение об ошибке ниже, когда я пытаюсь отправить форму с использованием JSP.Я хочу обновить значение в хеш-таблице на основе входных данных из формы (в ChangePassword.html) и распечатать некоторые выходные данные, используя страницу JSP (ChangePasswordJSP.jsp), а затем передать запрос и ответ на другую страницу JSP.

java.lang.IllegalStateException: getOutputStream () уже был вызван для этого ответа

Мне нужно сделать это с JSP (без использования сервлета) Я использую 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>

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)

1 Ответ

1 голос
/ 08 июля 2019

Выполните следующие действия:

  • 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();
        %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...