0

JSP が servlet1 を呼び出すアプリケーションを実行しています。この servlet1 は内部的に servlet2 を呼び出してデータをフェッチします。サーブレット 1 は独自にいくつかのデータを計算し、サーブレット 2 からいくつかのデータを取得して JSP に送り返します。

しかし、私は次のエラーが発生しています:

HTTP ステータス 500 -


タイプ例外レポート

メッセージ

サーバーで内部エラー () が発生したため、この要求を実行できませんでした。

例外

java.lang.IllegalStateException: 応答がコミットされた後に転送できません.java:847)

note 根本原因の完全なスタック トレースは、Apache Tomcat/7.0.16 ログで入手できます。

私のコードは次のように書かれています:

    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();
              }

}

このエラーを解決するのを手伝ってください。

前もって感謝します。

4

2 に答える 2

0

問題は、転送後に応答を書き込もうとすることです。サーブレット 2 がおそらく応答をコミットしています。

代わりに RequestDispatcher.include を使用してみてください。

于 2012-08-03T19:54:54.253 に答える
0

そこに論理的な問題があります。finally ブロックのコードは、catch ブロックの数行上に移動する必要があります (すべてが問題なければ /Mid に応答を転送し、そうでない場合は /show_result_combination_2.jsp にリダイレクトすることを理解しています)。

そうでない場合は、2 つの前方条件が発生する可能性があるため、コードを修正する必要があります。そして、それがエラーの原因です。最初の転送が実行されると、2 番目の転送で例外が生成されます

于 2012-08-03T23:12:47.470 に答える