Reputation: 3
I am building a simple Train booking system, now i am trying to call a servlet once i open a jsp to select data from the database then return back to the same servlet, but i keep getting errors.
this is my 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>
and this is my servlet. 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();
}
}
and this is the error i get
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)
Upvotes: 0
Views: 565
Reputation: 39457
You are using try with resources
, which automatically closes the stream while exiting the try block.
try (PrintWriter out = response.getWriter()) {
....
}
trip.jsp
passes request and response objects to the servlet trips.java
, where you get the PrintWriter
of the response (and for some reason, not using it anywhere) in a try with resource
, which will close the underlying stream at the end of the try block. Now, when your include is finished and control comes back to the trip.jsp
and try to write the jsp content, it'll fail as the stream is already closed.
Just change your code as:
PrintWriter out = response.getWriter();
try {
....
} catch (IOException e) {
....
}
or if you don't want to handle the exception here, just remove the try altogether.
Upvotes: 2