servlets - java.lang.IllegalStateException: Cannot (forward | sendRedirect | create session) after response has been committed -
this method throws
java.lang.illegalstateexception: cannot forward after response has been committed
and unable spot problem. help?
int noofrows = integer.parseint(request.getparameter("noofrows")); string chkboxval = ""; // string formatid=null; vector vrow = new vector(); vector vrow1 = new vector(); string groupid = ""; string groupdesc = ""; (int = 0; < noofrows; i++) { if ((request.getparameter("chk_select" + i)) == null) { chkboxval = "notticked"; } else { chkboxval = request.getparameter("chk_select" + i); if (chkboxval.equals("ticked")) { fwdurl = "true"; statement st1 = con.createstatement(); groupid = request.getparameter("groupid" + i); groupdesc = request.getparameter("groupdesc" + i); resultset rs1 = st1 .executequery("select fileid,description cs2k_files " + " fileid 'm%' , co_code = " + ccode); resultsetmetadata rsm = rs1.getmetadata(); int ccount = rsm.getcolumncount(); while (rs1.next()) { vector vcol1 = new vector(); (int j = 1; j <= ccount; j++) { vcol1.addelement(rs1.getobject(j)); } vrow.addelement(vcol1); } rs1 = st1 .executequery("select fileid,notallowed cs2kgroupsub " + " fileid 'm%' , groupid = '" + groupid + "'" + " , co_code = " + ccode); rsm = rs1.getmetadata(); ccount = rsm.getcolumncount(); while (rs1.next()) { vector vcol2 = new vector(); (int j = 1; j <= ccount; j++) { vcol2.addelement(rs1.getobject(j)); } vrow1.addelement(vcol2); } // throw new exception("test"); break; } } } if (fwdurl.equals("true")) { // throw new exception("test"); // response.sendredirect("cs2k_groupcopiedupdt.jsp") ; request.setattribute("groupid", groupid); request.setattribute("groupdesc", groupdesc); request.setattribute("vrow", vrow); request.setattribute("vrow1", vrow1); getservletconfig().getservletcontext().getrequestdispatcher( "/groupcopiedupdt.jsp").forward(request, response); }
a common misunderstanding among starters think call of forward(), sendredirect(), or senderror() magically exit , "jump" out of method block, hereby ignoring remnant of code. example:
protected void dopost() { if (somecondition) { sendredirect(); } forward(); // still invoked when somecondition true! } this not true. not behave differently other java methods (expect of system#exit() of course). when somecondition in above example true , you're calling forward() after sendredirect() or senderror() on same request/response, chance big exception:
java.lang.illegalstateexception: cannot forward after response has been committed
if if statement calls forward() , you're afterwards calling sendredirect() or senderror(), below exception thrown:
java.lang.illegalstateexception: cannot call sendredirect() after response has been committed
to fix this, need either add return; statement afterwards
protected void dopost() { if (somecondition) { sendredirect(); return; } forward(); } ... or introduce else block.
protected void dopost() { if (somecondition) { sendredirect(); } else { forward(); } } to naildown root cause in code, search line calls forward(), sendredirect() or senderror() without exiting method block or skipping remnant of code. can inside same servlet before particular code line, in servlet or filter been called before particular servlet.
in case of senderror(), if sole purpose set response status, use setstatus() instead.
another probable cause servlet writes response while forward() called, or has been called in same method.
protected void dopost() { out.write("some string"); // ... forward(); // fail! } the response buffer size defaults in server 2kb, if write more 2kb it, committed , forward() fail same way:
java.lang.illegalstateexception: cannot forward after response has been committed
solution obvious, don't write response in servlet. that's responsibility of jsp. set request attribute request.setattribute("data", "some string") , print in jsp ${data}. see our servlets wiki page learn how use servlets right way.
see also:
unrelated concrete problem, jdbc code leaking resources. fix well. hints, see how should connection, statement , resultset closed in jdbc?
Comments
Post a Comment