Metode ini melempar
java.lang.IllegalStateException: Tidak dapat meneruskan setelah respons dilakukan
dan saya tidak dapat menemukan masalahnya. Ada bantuan?
int noOfRows = Integer.parseInt(request.getParameter("noOfRows"));
String chkboxVal = "";
// String FormatId=null;
Vector vRow = new Vector();
Vector vRow1 = new Vector();
String GroupId = "";
String GroupDesc = "";
for (int i = 0; i < 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 from cs2k_Files "
+ " where FileId like 'M%' and co_code = "
+ ccode);
ResultSetMetaData rsm = rs1.getMetaData();
int cCount = rsm.getColumnCount();
while (rs1.next()) {
Vector vCol1 = new Vector();
for (int j = 1; j <= cCount; j++) {
vCol1.addElement(rs1.getObject(j));
}
vRow.addElement(vCol1);
}
rs1 = st1
.executeQuery("select FileId,NotAllowed from cs2kGroupSub "
+ " where FileId like 'M%' and GroupId = '"
+ GroupId + "'" + " and co_code = " + ccode);
rsm = rs1.getMetaData();
cCount = rsm.getColumnCount();
while (rs1.next()) {
Vector vCol2 = new Vector();
for (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);
}
servlets
response
illegalstateexception
forward
requestdispatcher
sansknwoledge
sumber
sumber
Jawaban:
Kesalahpahaman yang umum di antara para pemula adalah bahwa mereka berpikir bahwa panggilan a
forward()
,sendRedirect()
atausendError()
secara ajaib akan keluar dan "melompat" keluar dari blok metode, dengan ini mengabaikan sisa kode. Sebagai contoh:Jadi ini sebenarnya tidak benar. Mereka tentu tidak berperilaku berbeda dari metode Java lainnya (
System#exit()
tentu saja diharapkan). Ketika contohsomeCondition
di atas adalahtrue
dan Anda dengan demikian memanggilforward()
setelahsendRedirect()
atausendError()
atas permintaan / tanggapan yang sama, maka kemungkinan besar Anda akan mendapatkan pengecualian:Jika
if
pernyataan memanggil aforward()
dan Anda kemudian memanggilsendRedirect()
atausendError()
, maka pengecualian di bawah ini akan dilontarkan:Untuk memperbaikinya, Anda perlu menambahkan
return;
pernyataan sesudahnya... atau untuk memperkenalkan blok lain.
Untuk menemukan akar masalah dalam kode Anda, cukup cari baris apa pun yang memanggil a
forward()
,sendRedirect()
atausendError()
tanpa keluar dari blok metode atau melewatkan sisa kode. Ini bisa berada di dalam servlet yang sama sebelum baris kode tertentu, tetapi juga di servlet atau filter mana pun yang telah dipanggil sebelum servlet tertentu.Dalam kasus
sendError()
, jika satu-satunya tujuan Anda adalah menyetel status respons, gunakansetStatus()
saja.Kemungkinan penyebab lainnya adalah servlet menulis ke respons saat a
forward()
akan dipanggil, atau telah dipanggil dengan metode yang sama.Ukuran buffer respons secara default di sebagian besar server menjadi 2KB, jadi jika Anda menulis lebih dari 2KB padanya, maka itu akan dilakukan dan
forward()
akan gagal dengan cara yang sama:Solusinya jelas, jangan menulis ke respon di servlet. Itu tanggung jawab JSP. Anda tinggal mengatur atribut permintaan seperti itu
request.setAttribute("data", "some string")
dan kemudian mencetaknya di JSP seperti itu${data}
. Lihat juga halaman wiki Servlets kami untuk mempelajari bagaimana menggunakan Servlets dengan cara yang benar.Kemungkinan penyebab lainnya adalah servlet menulis file download ke respon setelah itu misalnya a
forward()
dipanggil.Ini secara teknis tidak mungkin. Anda perlu menghapus
forward()
panggilan. Pengguna akhir akan tetap berada di halaman yang dibuka saat ini. Jika Anda benar-benar bermaksud untuk mengubah halaman setelah mendownload file, Anda perlu memindahkan logika download file untuk memuat halaman dari halaman target.Namun kemungkinan penyebab lainnya adalah bahwa
forward()
,sendRedirect()
atausendError()
metode dipanggil melalui kode Java yang disematkan dalam file JSP dalam bentuk cara lama<% scriptlets %>
, sebuah praktik yang secara resmi tidak disarankan sejak 2001 . Sebagai contoh:Masalahnya di sini adalah bahwa JSP secara internal segera menulis teks template (yaitu kode HTML)
out.write("<!DOCTYPE html> ... etc ...")
segera setelah ditemukan. Ini pada dasarnya adalah masalah yang sama seperti yang dijelaskan di bagian sebelumnya.Solusinya jelas, jangan menulis kode Java di file JSP. Itu adalah tanggung jawab kelas Java normal seperti Servlet atau Filter. Lihat juga halaman wiki Servlets kami untuk mempelajari bagaimana menggunakan Servlets dengan cara yang benar.
Lihat juga:
Tidak terkait dengan masalah konkret Anda, kode JDBC Anda membocorkan sumber daya. Perbaiki itu juga. Untuk petunjuk, lihat juga Seberapa sering Connection, Statement dan ResultSet harus ditutup di JDBC?
sumber
break;
? Itu berarti bahwa kode berada di dalam beberapafor
atauwhile
loop di manaforward()
dipanggil berulang kali selama loop (yang salah, Anda harus memanggil maju hanya sekali SETELAH loop --atau untuk menyingkirkan loop karena tampaknya tidak diperlukan) .forward()
panggilan sementara seharusnya tidak melakukan itu. JSF, yang saya kenal, melakukan itu juga kecuali Anda secara eksplisit memanggilFacesContext#responseComplete()
. Pertanyaan terkait ini (yang saya temukan menggunakan kata kunci "grails mencegah respons render") mungkin berguna: stackoverflow.com/questions/5708654/…forward()
panggilan sementara seharusnya tidak melakukan itu. Solusinya jelas secara fungsional: katakan padanya untuk tidak melakukan itu. Tidak ada gagasan bahwa Anda secara terprogram telah mengambil alih pekerjaan yang seharusnya dilakukan Grails: menangani respons. Secara teknis, saya tidak tahu bagaimana memberi tahu Grails tentang hal itu. Tetapi saya tahu bahwa banyak kerangka kerja MVC lain mendukung ini (diperintahkan untuk tidak menangani respons dengan sendirinya), seperti JSF, Spring MVC, Wicket, dll. Saya akan terkejut jika hal ini tidak mungkin dilakukan di Grails.bahkan menambahkan pernyataan return akan memunculkan pengecualian ini, yang solusinya hanya kode ini:
sumber
Biasanya Anda melihat kesalahan ini setelah Anda melakukan pengalihan dan kemudian mencoba mengeluarkan lebih banyak data ke aliran keluaran. Dalam kasus di mana saya telah melihat ini di masa lalu, sering kali salah satu filter yang mencoba mengarahkan ulang halaman, dan kemudian masih meneruskan ke servlet. Saya tidak bisa melihat ada yang salah dengan servlet, jadi Anda mungkin ingin mencoba melihat filter yang Anda miliki juga.
Sunting : Beberapa bantuan lagi dalam mendiagnosis masalah…
Langkah pertama untuk mendiagnosis masalah ini adalah memastikan secara tepat di mana pengecualian tersebut dilemparkan. Kami berasumsi bahwa itu dilemparkan oleh garis
Tetapi Anda mungkin menemukan bahwa itu dilemparkan nanti dalam kode, di mana Anda mencoba untuk mengeluarkan ke aliran keluaran setelah Anda mencoba melakukan penerusan. Jika itu berasal dari baris di atas, maka itu berarti bahwa di suatu tempat sebelum baris ini Anda memiliki:
Semoga berhasil!
sumber
Ini karena servlet Anda mencoba mengakses objek permintaan yang sudah tidak ada lagi .. Pernyataan forward atau include servlet tidak menghentikan eksekusi blok metode. Ini berlanjut ke akhir blok metode atau pernyataan pengembalian pertama seperti metode java lainnya.
Cara terbaik untuk mengatasi masalah ini cukup dengan mengatur halaman (di mana Anda seharusnya meneruskan permintaan) secara dinamis sesuai logika Anda. Itu adalah:
dan lakukan penyerangan hanya sekali pada baris terakhir ...
Anda juga dapat memperbaiki masalah ini menggunakan pernyataan return setelah setiap forward () atau meletakkan setiap forward () di blok if ... else
sumber
Saya dihapus
Kemudian itu bekerja dengan baik untuk saya
sumber
Menabrak...
Saya baru saja mengalami kesalahan yang sama. Saya perhatikan bahwa saya sedang memanggil
super.doPost(request, response);
saat menimpadoPost()
metode serta secara eksplisit memanggil konstruktor superclassSegera setelah saya mengomentari pernyataan
super.doPost(request, response);
dari dalam,doPost()
itu bekerja dengan sempurna ...Tak perlu dikatakan, saya perlu membaca kembali tentang
super()
praktik terbaik: psumber
Anda harus menambahkan pernyataan pengembalian saat Anda meneruskan atau mengarahkan aliran.
Contoh:
jika forwardind,
jika mengarahkan,
sumber
Setelah metode pengembalian ke depan, Anda cukup melakukan ini:
Ini akan merusak ruang lingkup saat ini.
sumber