Pengendalian Pengecualian Servlet Jakarta EE

1. Pengenalan

Dalam tutorial ini, kami akan menangani pengecualian dalam aplikasi Jakarta EE Servlet - untuk memberikan hasil yang anggun dan diharapkan setiap kali terjadi kesalahan.

2. Pengecualian Servlet Jakarta EE

Pertama, kita akan menentukan Servlet menggunakan anotasi API (lihat pada Servlets Intro untuk lebih jelasnya) dengan pemproses GET lalai yang akan memberikan pengecualian:

@WebServlet(urlPatterns = "/randomError") public class RandomErrorServlet extends HttpServlet { @Override protected void doGet( HttpServletRequest req, HttpServletResponse resp) { throw new IllegalStateException("Random error"); } }

3. Pengendalian Ralat Lalai

Mari sekarang hanya menyebarkan aplikasi ke dalam wadah servlet kami (kita akan menganggap bahawa aplikasi berjalan di bawah // localhost: 8080 / javax-servlets ).

Apabila kita mengakses alamat // localhost: 8080 / javax-servlets / randomError , kita akan melihat pengendalian ralat servlet lalai di tempat:

Pengendalian ralat lalai disediakan oleh wadah servlet dan dapat disesuaikan pada tahap wadah atau aplikasi.

4. Pengendalian Ralat Tersuai

Kami dapat menentukan pengendalian ralat tersuai menggunakan deskriptor fail web.xml di mana kami dapat menentukan jenis dasar berikut:

  • Pengendalian ralat kod status - ini memungkinkan kita memetakan kod ralat HTTP (klien dan pelayan) ke halaman ralat HTML statik atau servlet pengendalian ralat
  • Pengendalian ralat jenis pengecualian - ini membolehkan kami memetakan jenis pengecualian ke halaman ralat HTML statik atau servlet pengendalian ralat

4.1. Kesalahan Kod Status Mengendalikan dengan Halaman HTML

Kami dapat menetapkan dasar pengendalian ralat khusus kami untuk kesalahan HTTP 404 di web.xml :

  404 /error-404.html    

Sekarang, akses //localhost:8080/javax-servlets/invalid.html dari penyemak imbas - untuk mendapatkan halaman ralat HTML statik.

4.2. Kesalahan Jenis Pengecualian Mengendalikan dengan Servlet

Kami boleh menetapkan polisi pengendalian ralat tersuai kami untuk java.lang.Exception di web.xml :

  java.lang.Exception /errorHandler  

Di ErrorHandlerServlet , kita dapat mengakses perincian ralat menggunakan atribut ralat yang disediakan dalam permintaan:

@WebServlet(urlPatterns = "/errorHandler") public class ErrorHandlerServlet extends HttpServlet { @Override protected void doGet( HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/html; charset=utf-8"); try (PrintWriter writer = resp.getWriter()) { writer.write("Error description"); writer.write("

Error description

"); writer.write("
    "); Arrays.asList( ERROR_STATUS_CODE, ERROR_EXCEPTION_TYPE, ERROR_MESSAGE) .forEach(e -> writer.write("
  • " + e + ":" + req.getAttribute(e) + "
  • ") ); writer.write("
"); writer.write(""); } } }

Sekarang, kita dapat mengakses // localhost: 8080 / javax-servlets / randomError untuk melihat servlet ralat tersuai berfungsi.

Catatan : Jenis pengecualian kami yang ditentukan di web.xml terlalu luas dan kami harus menentukan semua pengecualian yang ingin kami atasi dengan lebih terperinci.

Kami juga boleh menggunakan logger servlet yang disediakan kontena dalam komponen ErrorHandlerServlet kami untuk log maklumat tambahan:

Exception exception = (Exception) req.getAttribute(ERROR_EXCEPTION); if (IllegalArgumentException.class.isInstance(exception)) { getServletContext() .log("Error on an application argument", exception); }

Perlu mengetahui apa yang ada di luar mekanisme pembalakan yang disediakan servlet, periksa panduan di slf4j untuk maklumat lebih lanjut.

5. Kesimpulan

Dalam artikel ringkas ini, kami telah melihat pengendalian ralat lalai dan penanganan ralat tersuai yang ditentukan dalam aplikasi servlet tanpa menambahkan komponen luaran atau perpustakaan.

Seperti biasa, anda boleh mendapatkan kod sumber di repositori tutorial Servlets.