Penyahpepijatan Servlet


Menguji/menyahpepijat Servlet sentiasa menjadi titik sukar dalam proses pembangunan dan penggunaan. Servlet selalunya melibatkan banyak interaksi klien/pelayan, dan ralat boleh berlaku tetapi sukar untuk dihasilkan semula.

Berikut ialah beberapa petua dan cadangan untuk membantu anda nyahpepijat.

System.out.println()

System.out.println() digunakan sebagai penanda untuk menguji sama ada sekeping kod tertentu dilaksanakan. Kita juga boleh mencetak nilai pembolehubah. Selain itu:

  • Memandangkan objek Sistem adalah sebahagian daripada objek Java teras, ia boleh digunakan di mana-mana tanpa perlu memasang sebarang kelas tambahan. Ini termasuk Servlet, JSP, RMI, EJB, Kacang biasa dan kelas, serta aplikasi kendiri.

  • Tidak seperti berhenti pada titik putus, menulis ke System.out tidak mengganggu aliran pelaksanaan biasa aplikasi, yang menjadikannya amat berguna apabila masa adalah kritikal.

Berikut ialah sintaks untuk menggunakan System.out.println():

System.out.println("Debugging message");

Semua mesej yang dijana oleh sintaks di atas akan dilog dalam fail log pelayan web .

Log Mesej

Adalah idea yang sangat baik untuk menggunakan kaedah pengelogan yang sesuai untuk log semua nyahpepijat, amaran dan mesej ralat, adalah disyorkan untuk menggunakan log4J untuk log semua maklumat.

API Servlet juga menyediakan cara mudah untuk mengeluarkan maklumat, menggunakan kaedah log(), seperti yang ditunjukkan di bawah:

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ContextLog extends HttpServlet {
  public void doGet(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException,
         java.io.IOException {
    
      String par = request.getParameter("par1");
      // 调用两个 ServletContext.log 方法
      ServletContext context = getServletContext( );

      if (par == null || par.equals(""))
      // 通过 Throwable 参数记录版本
      context.log("No message received:",
          new IllegalStateException("Missing parameter"));
      else
          context.log("Here is the visitor's message: " + par);
      
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
      String title = "Context Log";
      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" +
        "<h1 align=\"center\">" + title + "</h1>\n" +
        "<h2 align=\"center\">Messages sent</h2>\n" +
        "</body></html>");
    } //doGet
}

ServletContext log mesej teksnya ke fail log bekas Servlet . Untuk Tomcat, log ini boleh didapati dalam direktori <Tomcat-installation-directory>/logs.

Fail log ini memberikan petunjuk tentang kekerapan ralat atau masalah baharu. Oleh sebab itu, adalah disyorkan untuk menggunakan fungsi log() dalam fasal tangkapan pengecualian yang biasanya tidak akan berlaku.

Menggunakan Penyahpepijat JDB

Anda boleh nyahpepijat servlet menggunakan applet nyahpepijat atau arahan jdb aplikasi.

Untuk menyahpepijat Servlet, kami boleh menyahpepijat sun.servlet.http.HttpServer, dan kemudian melihatnya sebagai HttpServer yang melaksanakan Servlet untuk membalas permintaan HTTP di sebelah penyemak imbas. Ini sangat serupa dengan penyahpepijatan applet. Tidak seperti applet penyahpepijatan, program sebenar yang sedang dinyahpepijat ialah sun.applet.AppletViewer.

Kebanyakan penyahpepijat secara automatik menyembunyikan butiran cara menyahpepijat applet. Begitu juga, untuk servlet, anda mesti melakukan perkara berikut untuk penyahpepijat:

  • Tetapkan laluan kelas penyahpepijat anda supaya ia boleh mencari sun.servlet.http.Http-Server dan kelas yang berkaitan.

  • Tetapkan laluan kelas penyahpepijat anda supaya ia boleh mencari servlet dan kelas sokongan anda, biasanya dalam server_root/servlets dan server_root/classes.

Anda biasanya tidak mahu server_root/servlet dalam laluan kelas anda kerana ia melumpuhkan muat semula servlet. Tetapi peraturan kemasukan ini sangat berguna untuk nyahpepijat. Ia membenarkan penyahpepijat anda menetapkan titik putus dalam servlet sebelum ia dimuatkan oleh pemuat servlet tersuai dalam HttpServer.

Jika anda telah menyediakan laluan kelas yang betul, anda boleh mula menyahpepijat sun.servlet.http.HttpServer. Anda boleh menetapkan titik putus dalam kod Servlet yang anda ingin nyahpepijat dan kemudian membuat permintaan kepada HttpServer melalui pelayar web menggunakan Servlet yang diberikan (http://localhost:8080/servlet/ServletToDebug). Anda akan melihat bahawa pelaksanaan program berhenti pada titik putus.

Menggunakan Ulasan

Ulasan dalam kod anda membantu menyahpepijat dalam pelbagai cara. Komen boleh digunakan dalam banyak cara lain untuk menyahpepijat proses.

Servlet ini menggunakan ulasan Java dan ulasan satu baris (//...) komen berbilang baris (/* ...*/) boleh digunakan untuk mengalih keluar bahagian kod Java buat sementara waktu. Jika pepijat hilang, lihat lebih dekat pada kod yang baru anda ulas dan ketahui di mana masalahnya.

Maklumat pengepala bahagian pelanggan dan pelayan

Kadangkala, apabila servlet tidak berkelakuan seperti yang diharapkan, adalah berguna untuk melihat permintaan dan respons HTTP mentah. Jika anda biasa dengan struktur HTTP, anda boleh membaca permintaan dan respons untuk melihat tajuk ini.

Petua Penyahpepijatan Penting

Di bawah disenaraikan beberapa petua penyahpepijatan Servlet:

  • Sila ambil perhatian bahawa server_root/classes tidak akan dimuatkan semula server_root/servlets; .

  • Meminta penyemak imbas untuk memaparkan kandungan asal halaman yang dipaparkan. Ini membantu mengenal pasti isu pemformatan. Ia biasanya pilihan di bawah menu View.

  • Memastikan penyemak imbas tidak menyimpan cache keluaran permintaan sebelumnya dengan memaksa muat semula halaman yang lengkap. Dalam Netscape Navigator, gunakan Shift-Reload dan dalam Internet Explorer, gunakan Shift-Refresh.

  • Sila sahkan bahawa kaedah init() servlet menerima parameter ServletConfig dan memanggil super.init(config).