Pengendalian pengecualian Servlet
Apabila Servlet melontar pengecualian, bekas web mencari web.xml menggunakan elemen jenis pengecualian untuk konfigurasi yang sepadan dengan jenis pengecualian yang dilemparkan.
Anda mesti menggunakan elemen halaman-ralat dalam web.xml untuk menentukan panggilan Servlet yang sesuai untuk dibuat bagi Pengecualian atau HTTP Kod Status< khusus. 🎜> .
Konfigurasiweb.xml
mengandaikan bahawa terdapat ErrorHandler untuk Servelt yang dipanggil apabila sebarang pengecualian atau ralat yang ditentukan berlaku. Perkara berikut ialah item yang dibuat dalam web.xml.
<!-- servlet 定义 --> <servlet> <servlet-name>ErrorHandler</servlet-name> <servlet-class>ErrorHandler</servlet-class> </servlet> <!-- servlet 映射 --> <servlet-mapping> <servlet-name>ErrorHandler</servlet-name> <url-pattern>/ErrorHandler</url-pattern> </servlet-mapping> <!-- error-code 相关的错误页面 --> <error-page> <error-code>404</error-code> <location>/ErrorHandler</location> </error-page> <error-page> <error-code>403</error-code> <location>/ErrorHandler</location> </error-page> <!-- exception-type 相关的错误页面 --> <error-page> <exception-type> javax.servlet.ServletException </exception-type > <location>/ErrorHandler</location> </error-page> <error-page> <exception-type>java.io.IOException</exception-type > <location>/ErrorHandler</location> </error-page>
Jika anda ingin mempunyai pengendali ralat biasa untuk semua pengecualian, maka bukannya mentakrifkan elemen halaman ralat yang berasingan untuk setiap pengecualian, anda harus menentukan halaman ralat berikut:
<error-page> <exception-type>java.lang.Throwable</exception-type > <location>/ErrorHandler</location> </error-page>
Berikut ialah perkara yang perlu diberi perhatian tentang pengendalian pengecualian web.xml di atas:
Servelt ErrorHandler ditakrifkan dengan cara yang sama seperti Servelts lain dan dikonfigurasikan dalam web.xml.
Jika kod status ralat berlaku, sama ada 404 (Tidak Ditemui) atau 403 (Dilarang), Servlet ErrorHandler akan dipanggil.
Jika aplikasi web membuang ServletException atau IOException, maka bekas web akan memanggil Servlet ErrorHandler.
Anda boleh menentukan pengendali ralat yang berbeza untuk mengendalikan pelbagai jenis ralat atau pengecualian. Contoh-contoh di atas adalah sangat umum dan saya harap anda dapat memahami konsep asas melalui contoh.
Atribut Permintaan - Ralat/Pengecualian
Berikut ialah senarai atribut permintaan yang boleh diakses oleh Servlet pengendalian ralat untuk menganalisis sifat ralat/pengecualian .
序号 | 属性 & 描述 |
---|---|
1 | javax.servlet.error.status_code 该属性给出状态码,状态码可被存储,并在存储为 java.lang.Integer 数据类型后可被分析。 |
2 | javax.servlet.error.exception_type 该属性给出异常类型的信息,异常类型可被存储,并在存储为 java.lang.Class 数据类型后可被分析。 |
3 | javax.servlet.error.message 该属性给出确切错误消息的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。 |
4 | javax.servlet.error.request_uri 该属性给出有关 URL 调用 Servlet 的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。 |
5 | javax.servlet.error.exception 该属性给出异常产生的信息,信息可被存储,并在存储为 java.lang.Throwable 数据类型后可被分析。 |
6 | javax.servlet.error.servlet_name 该属性给出 Servlet 的名称,名称可被存储,并在存储为 java.lang.String 数据类型后可被分析。 |
Contoh Pengendali Ralat Servlet
Berikut ialah tika Servlet yang akan mengendalikan sebarang ralat atau pengecualian yang anda tentukan.
Contoh ini memberi anda pemahaman asas tentang pengendalian pengecualian dalam Servlets dan anda boleh menggunakan konsep yang sama untuk menulis aplikasi pengendalian pengecualian yang lebih kompleks:
// 导入必需的 java 库 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // 扩展 HttpServlet 类 public class ErrorHandler extends HttpServlet { // 处理 GET 方法请求的方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 分析 Servlet 异常 Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception"); Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); String servletName = (String) request.getAttribute("javax.servlet.error.servlet_name"); if (servletName == null){ servletName = "Unknown"; } String requestUri = (String) request.getAttribute("javax.servlet.error.request_uri"); if (requestUri == null){ requestUri = "Unknown"; } // 设置响应内容类型 response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Error/Exception Information"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n"); if (throwable == null && statusCode == null){ out.println("<h2>Error information is missing</h2>"); out.println("Please return to the <a href=\"" + response.encodeURL("http://localhost:8080/") + "\">Home Page</a>."); }else if (statusCode != null){ out.println("The status code : " + statusCode); }else{ out.println("<h2>Error information</h2>"); out.println("Servlet Name : " + servletName + "</br></br>"); out.println("Exception Type : " + throwable.getClass( ).getName( ) + "</br></br>"); out.println("The request URI: " + requestUri + "<br><br>"); out.println("The exception message: " + throwable.getMessage( )); } out.println("</body>"); out.println("</html>"); } // 处理 POST 方法请求的方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Kompil dengan cara biasaErrorHandler .java, letakkan fail kelas anda ke dalam <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.
Mari kami menambah konfigurasi berikut dalam web Bekas memanggil Servlet
ErrorHandler dan memaparkan mesej yang sesuai. Contohnya, jika anda memasukkan URL yang salah, maka ia akan memaparkan hasil berikut: <servlet>
<servlet-name>ErrorHandler</servlet-name>
<servlet-class>ErrorHandler</servlet-class>
</servlet>
<!-- servlet mappings -->
<servlet-mapping>
<servlet-name>ErrorHandler</servlet-name>
<url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>
<error-page>
<error-code>404</error-code>
<location>/ErrorHandler</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type >
<location>/ErrorHandler</location>
</error-page>
Kod di atas mungkin tidak berfungsi dengan betul dalam sesetengah penyemak imbas web. Jadi cuba gunakan pelayar Mozilla dan Safari, ia sepatutnya berfungsi dengan baik dalam kedua-dua pelayar.