getWriter() has already been called for this response

0
  1. W htmlu mam pole input, którego zawartość chce wysłać do serwletu w trakcie jego zmiany ( zdarzenie onKeyUp ).
  2. Serwlet ma za zadanie przeszukać wszystkie rekordy z jakiegoś pliku i zwrócić te, które zaczynają się na przesłaną wartość.
  3. Następnie serwlet ma zwrócić interesujące nas rekordy i wyświetlić w htmlu.

Punkty 1 i 3 mam wykonać z wykorzystaniem jQuery.
Punkt 2 mam zrealizować z poziomu serwletu.

Więc mam pole input oraz div, do którego będę wrzucał wyniki z serwletu:

<input type="text" id="name">
<div id="result"></div>

Robię zdarzenie z jQuery i wysyłam metodą POST zawartość pola do serwletu:

 $('#name').keyup(function () {
                value = $(this).val();

                $.ajax({
                    type: "POST",
                    url: "Servlet",
                    data: {"name": value},
                    success: function (value) {
                        $('#result').html(value);
                    }
                });
}

Zmienna result zawiera rekordy, które chce żeby serwlet zwrócił w wyniku jego wywołania.

public class Servlet extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        String name = request.getParameter("name").toLowerCase();
        String result = "";

        // tutaj ma miejsce przeszukiwanie danych z pliku ale to nie jest istotne

        try (PrintWriter out = response.getWriter()) {
            out.println("<html>" + result + "</html>");
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
}

Program działa prawidłowo ale podczas uruchomienia wywala błędy, wskazując je w miejscu wypisania danych z PrintWritera oraz wywołania metody doPost.

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

Nie masz przypadkiem w pominiętym fragmencie kodu wywołania response.getWriter()? Skoro stosujesz try with resources to nie musisz zamykać strumienia out.

0
bogdans napisał(a):

Nie masz przypadkiem w pominiętym fragmencie kodu wywołania response.getWriter()? Skoro stosujesz try with resources to nie musisz zamykać strumienia out.

W pominiętym fragmencie nie odwoływałem się do response.
Dziwnym zbiegiem okoliczności dziś błędy się nie pojawiają - wszystko działa ok.
Niemniej chciałbym się dowiedzieć czemu wczoraj było źle a dziś nagle jest dobrze.
Coś mu w pamięci siedziało ?
Jakiś bug NetBeansa ?
Strumienia faktycznie nie muszę zamykać - dziękuje za pomoc.

Edit:
W jaki sposób mam wyświetlić przetworzone wyniki z serwletu za pomocą jQuery ?
Czy to ma jakikolwiek sens - robię to już w serwlecie ( właśnie z tym PrintWriterem wypisuję co ma być na wyjściu ).
Może mi ktoś dać jakąś wskazówkę jak to zrobić ( o ile to możliwe ) ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1