problem z servletem

0

witam, napisałem servlet ktory w założeniu ma wysłać Vector z obektami klasy Kontrahenci do apletu, zrobilem to prawie tak samo jak w pewnym przykladzie ktory znalazłem na necie, ale cos jednak nie działa wywala mi nastepyjący błąd :

java.lang.IllegalStateException: getWriter() has already been called for this response
at org.apache.catalina.connector.Response.getOutputStream(Response.java:568)
at org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:180)
at javax.servlet.ServletResponseWrapper.getOutputStream(ServletResponseWrapper.java:101)
at Controller.sendKontrVector(Controller.java:87)
at Controller.doGet(Controller.java:61)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:619)

czy ktos moglby doradzić co jest nie tak? oto kod servletu :


import java.io.*;
import java.net.*;
import java.sql.SQLException;
import java.util.Vector;
import javax.servlet.*;
import javax.servlet.http.*;
import klasy.*;

public class Controller extends HttpServlet {
    
   
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        /* TODO output your page here
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet Controller</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet Controller at " + request.getContextPath () + "</h1>");
        out.println("</body>");
        out.println("</html>");
         */
        out.close();
    }
    
  
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
        
        String action = null;
        action = request.getParameterValues("Action")[0];
        AccessDB accessDB = new AccessDB();
        Vector dataVector = null;
        if(action.equals("Kontrahenci")) {
            try {
                dataVector = accessDB.getKontrahenci();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            sendKontrVector(response,dataVector);
        }
    }
    

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    // </editor-fold>
    
    protected void sendKontrVector(HttpServletResponse response, Vector dataVector) {
        
        ObjectOutputStream outputToApplet;
        
        try
        {
            outputToApplet = new ObjectOutputStream(response.getOutputStream());
            
            outputToApplet.writeObject(dataVector);
            outputToApplet.flush();
            
            outputToApplet.close();
            
        }
        catch (IOException e)
        {
			e.printStackTrace(); 
        }
    }
}
0

http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletResponse.html#getWriter()

w szczególności linijka:

Either this method or getOutputStream() may be called to write the body, not both.

A Ty wywołujesz obydwie metody.

Pozdrawiam,

0

aha to juz chyba rozumiem, czyli metoda processRequest(request, response); jest tu niepotrzebna bo ona wywołuje tą metode. Dobrze myśle?

0

Po prostu chodzi o to, że albo otwierasz Writera albo OutputStream.

W Twojej metodzie processRequest w zasadzie nic się nie dzieje, poza tym, że zamykasz (pod spodem Writera) bufor wyjściowy, czyli flushuejsz odpowiedź do klienta. Nic więc dziwnego, że masz IllegalState - bo nie ma co otwierać wyjścia, którego klient już na pewno nie odbierze. Z resztą nawet gdybyś go nie zamknął to nadal zasada albo albo jest w mocy - bo nie możesz w servlecie otworzyć dwa razy ani dwóch instancji bufora wyjściowego.

Ale odpowiadając bezpośrednio na Twoje ostatnie pytanie - owszem, bioraćąc pod uwagę, że zawartość processRequest jest niemal cała zakomentowana nie wywołuj jej albo to w niej umieść wysyłanie danych do Appletu.

Pozdrawiam,

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