0
votes

I am running an application where JSP calls a servlet1. This servlet1 internally calls servlet2 to fetch some data. Servlet 1 calculate some data on it own and get some from servlet2 and sends it back to JSP.

But i am getting following error:

HTTP Status 500 -


type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.lang.IllegalStateException: Cannot forward after response has been committed RoutingParser.doPost(RoutingParser.java:389) javax.servlet.http.HttpServlet.service(HttpServlet.java:754) javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.16 logs.

my code is written like this:

    import java.awt.List;
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Enumeration;
    import java.util.HashSet;
    import org.w3c.dom.Element;

    //import javax.lang.model.element.Element;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.swing.text.Document;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;

    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;

    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.DocumentBuilder;

    import org.w3c.dom.NodeList;
    import org.w3c.dom.Node;

    import java.io.File;
    import java.util.ArrayList;


    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Enumeration;
    import java.util.HashSet;

    //import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List;

    public class RoutingParser extends HttpServlet {


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

     response.setContentType("text/html");
     PrintWriter writer = response.getWriter();

     System.out.println("Routing Parser is accessible");

     System.out.println("i reached servlet");
          try {

              ArrayList inputlist1= new ArrayList();

                                        inputlist1.add(request.getParameter("CardNetwork"));//CardNetwork
                inputlist1.add(request.getParameter("Currency"));//Currency
                inputlist1.add(request.getParameter("TxnCategory"));//TxnCategory
                inputlist1.add(request.getParameter("TxnType"));//TxnType


                ArrayList list1=new ArrayList();
                ArrayList returnedData= new ArrayList();

                System.out.println("i reached servlet");
                  try {

                    File fXmlFile = new File("c:\\eclipse\\RoutingTable.xml");
                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    org.w3c.dom.Document doc = dBuilder.parse(fXmlFile);
                    doc.getDocumentElement().normalize();

                    System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
                    NodeList nList = doc.getElementsByTagName("Entry");
                    System.out.println("-----------------------");

                    for (int temp = 0; temp < nList.getLength(); temp++)
                    {

                                //some piece of code

                              returnedData.add(data1);
                              returnedData.add(extra_info);
                              break;
                          }

                       }

                       /*it is important to remove the earlier node elements as the comparison starts from 0 all the time, we make a purely fresh arraylist for every node
                       * if we dont remove, the arraylist will keep on adding elements to the end and the comparison will not be made with latest node elements.
                       */ 
                       for (int remove = 0; remove < 26; remove++){
                           list1.remove(0);
                       }

                    }
                    //this will be returned to JSP page

                    ServletContext context = this.getServletContext();
                    RequestDispatcher dispatcher = context.getRequestDispatcher("/Mid");

                    // change your request and response accordingly

                    dispatcher.forward(request, response);


                    request.setAttribute("returndata",returnedData);
                    System.out.println("data1 set in arraylist for JSP page is: "+ returnedData.get(0));
                    System.out.println("extra_info set in arraylist for JSP page is: "+ returnedData.get(1));




                  } catch (Exception e) {
                    e.printStackTrace();
                  }

                  System.out.println("array list in end is: " + list1);
          } finally {

                RequestDispatcher requestDispatcher = getServletContext().getRequestDispatcher("/show_result_combination_2.jsp");
                requestDispatcher.forward(request,response);

          }
              }

              private static String getTagValue(String sTag, Element eElement) {
                NodeList nlList = (eElement).getElementsByTagName(sTag).item(0).getChildNodes();

                    Node nValue = (Node) nlList.item(0);

                return nValue.getNodeValue();
              }

}

Can some one please help me in resolving this error.

thanks in advance.

2
your code as it is provided it doesn't compile. Are you leaving anything behind? - MaVRoSCy

2 Answers

0
votes

The problem is that you try to write in the response after a forward. Servlet 2 is probably commiting the response.

Try to use RequestDispatcher.include instead.

0
votes

You have a logical problem there. The code in the finally block should be moved inside the catch block couple of lines up (as i understand you want to forward the response to /Mid if everything is ok, and if not you want to redirect it to /show_result_combination_2.jsp)

If this is not the case then you should revise your code because you have two forward conditions that can happen. And that is what is causing the error. If the first is executed, then the second forward generates the exception