2016-12-25 4 views
0

Я строю простую систему бронирования поездов, теперь я пытаюсь вызвать сервлет, когда я открываю jsp для выбора данных из базы данных, а затем возвращаюсь к тому же сервлету, но я продолжайте получать ошибки.Попытка вызвать сервлет при загрузке jsp

это мой trip.jsp

<body> 
    <% if ((request.getAttribute("trips") == null)) { 
    %> 

    <jsp:include page="/trips" flush="true" /> 
    <% } %> 
    <table> 
     <tr> 
      <th>Trip Number</th> 
      <th>Train Number</th> 
      <th>Source</th> 
      <th>Destination</th> 
      <th>Departure Time</th> 
      <th>Arrival Time</th> 
      <th>Date</th> 
      <th>Reserved Seats</th> 
      <th>Price</th> 
     </tr> 
    <% 
     //ArrayList list = new ArrayList(); 
     List trip = new ArrayList(); 
     Iterator viewTrip; 
     if(request.getAttribute("trips")!=null && request.getAttribute("trips")!=""){ 
      List allTrips = (ArrayList)request.getAttribute("trips"); 
      Iterator itr = allTrips.iterator(); 

      while(itr.hasNext()){ 
       trip = (ArrayList)itr.next(); 
       viewTrip = trip.iterator(); 
       %> 
       <tr> 
        <% 
         while(viewTrip.hasNext()){ 
          %> 
          <td> 
           <%=viewTrip.next()%> 
          </td> 
          <% 
         } 
        %> 
       </tr> 
       <% 
      } 
     } 
    %> 

    </table> 
</body> 

и это мой сервлет. trips.java

protected void processRequest(HttpServletRequest request,  HttpServletResponse response) 
     throws ServletException, IOException, SQLException { 
    response.setContentType("text/html;charset=UTF-8"); 
    try (PrintWriter out = response.getWriter()) { 
     Connection con = DB.getActiveConnection(); 
     Statement stmt = con.createStatement(); 
     ResultSet rs = null; 

     ArrayList trip = new ArrayList(); 
     ArrayList data = null; 

     try { 
      String query = "select * from trips"; 
      rs = stmt.executeQuery(query); 

      while(rs.next()){ 
       data = new ArrayList(); 

       data.add(rs.getString(9)); // trip number 
       data.add(rs.getInt(1)); // train number 
       data.add(rs.getString(2)); // source 
       data.add(rs.getString(3)); // destination 
       data.add(rs.getTime(4)); //departure time 
       data.add(rs.getTime(5));// arrival time 
       data.add(rs.getDate(6));// date 
       data.add(rs.getInt(7));// reserved seats 
       data.add(rs.getDouble(8));//price 


       trip.add(data); 
      } 
      request.setAttribute("trips", trip); 
      con.close(); 
      RequestDispatcher requestDispatcher = request.getRequestDispatcher("/updateTrip.jsp"); 
      requestDispatcher.include(request, response); 
      //out.close(); 
      //return; 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

и это ошибка, я получаю

25-Dec-2016 15:47:01.822 SEVERE [http-nio-8084-exec-4]   
    org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for  servlet [jsp] in context with path [/Train] threw exception [java.lang.IllegalStateException: Exception occurred when flushing data] with root cause 
java.io.IOException: Stream closed 
    at org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:200) 
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:105) 
    at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:184) 
    at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:120) 
    at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75) 
    at org.apache.jsp.updateTrip_jsp._jspService(updateTrip_jsp.java:199) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
+0

Хотя ответ Гурвиндера Сингха ниже, вероятно, является причиной, полагайте, что ваше приложение может извлечь выгоду из шаблона проектирования MVC. Это помогает, если вы научитесь правильно поступать правильно. –

ответ

2

Вы используете try with resources, который автоматически закрывает поток при выходе из блока Try.

try (PrintWriter out = response.getWriter()) { 
.... 
} 

trip.jsp передает запрос и объекты ответа на сервлет trips.java, где вы получите PrintWriter ответа (и по какой-то причине, не использовать его в любом месте) в try with resource, который закрывает основной поток в конце блока try. Теперь, когда ваше включение завершено, и управление возвращается к trip.jsp и попытается написать содержимое jsp, оно будет сбой, поскольку поток уже закрыт.

Просто измените свой код, как:

PrintWriter out = response.getWriter(); 
try { 
.... 
} catch (IOException e) { 
.... 
} 

или если вы не хотите, чтобы обработать исключение здесь, просто удалить вообще Попробовать.

+0

Спасибо, что это было очень полезно. –

Смежные вопросы