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. 🎜> .

Konfigurasi

web.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 .

序号属性 & 描述
1javax.servlet.error.status_code
该属性给出状态码,状态码可被存储,并在存储为 java.lang.Integer 数据类型后可被分析。
2javax.servlet.error.exception_type
该属性给出异常类型的信息,异常类型可被存储,并在存储为 java.lang.Class 数据类型后可被分析。
3javax.servlet.error.message
该属性给出确切错误消息的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。
4javax.servlet.error.request_uri
该属性给出有关 URL 调用 Servlet 的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。
5javax.servlet.error.exception
该属性给出异常产生的信息,信息可被存储,并在存储为 java.lang.Throwable 数据类型后可被分析。
6javax.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.