Servlets - การดีบัก

การทดสอบ / แก้ไขจุดบกพร่องของ servlets เป็นเรื่องยากเสมอ Servlets มีแนวโน้มที่จะเกี่ยวข้องกับการโต้ตอบกับไคลเอนต์ / เซิร์ฟเวอร์จำนวนมากทำให้เกิดข้อผิดพลาดได้ยาก แต่จะเกิดซ้ำได้ยาก

คำแนะนำและคำแนะนำบางส่วนที่อาจช่วยคุณในการแก้ไขข้อบกพร่องมีดังนี้

System.out.println ()

System.out.println () ใช้งานง่ายเป็นเครื่องหมายเพื่อทดสอบว่ามีการเรียกใช้โค้ดบางส่วนหรือไม่ เราสามารถพิมพ์ค่าตัวแปรได้เช่นกัน นอกจากนี้ -

  • เนื่องจากอ็อบเจ็กต์ System เป็นส่วนหนึ่งของอ็อบเจ็กต์ Java หลักจึงสามารถใช้ได้ทุกที่โดยไม่จำเป็นต้องติดตั้งคลาสเพิ่มเติมใด ๆ ซึ่งรวมถึง Servlets, JSP, RMI, EJB, ถั่วธรรมดาและคลาสและแอปพลิเคชันแบบสแตนด์อโลน

  • การหยุดที่เทคนิคเบรกพอยต์จะหยุดการดำเนินการตามปกติจึงใช้เวลามากขึ้น ในขณะที่การเขียนไปที่ System.out ไม่รบกวนขั้นตอนการดำเนินการตามปกติของแอปพลิเคชันมากนักซึ่งจะทำให้มีค่ามากเมื่อเวลามีความสำคัญ

ต่อไปนี้เป็นไวยากรณ์ที่จะใช้ System.out.println () -

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

ข้อความทั้งหมดที่สร้างโดยไวยากรณ์ข้างต้นจะถูกบันทึกในไฟล์บันทึกของเว็บเซิร์ฟเวอร์

การบันทึกข้อความ

เป็นความคิดที่ดีเสมอที่จะใช้วิธีการบันทึกที่เหมาะสมในการบันทึกข้อบกพร่องคำเตือนและข้อความแสดงข้อผิดพลาดทั้งหมดโดยใช้วิธีการบันทึกมาตรฐาน ฉันใช้log4Jเพื่อบันทึกข้อความทั้งหมด

Servlet API ยังมีวิธีง่ายๆในการส่งออกข้อมูลโดยใช้เมธอด log () ดังนี้ -

// Import required java libraries
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");
      
      //Call the two ServletContext.log methods
      ServletContext context = getServletContext( );

      if (par == null || par.equals(""))
         //log version with Throwable parameter
         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 บันทึกข้อความลงในล็อกไฟล์ของคอนเทนเนอร์ servlet ด้วย Tomcat บันทึกเหล่านี้พบได้ใน <Tomcat-installation-directory> / logs

ไฟล์บันทึกแสดงข้อบกพร่องที่เกิดขึ้นใหม่หรือความถี่ของปัญหา ด้วยเหตุนี้จึงควรใช้ฟังก์ชัน log () ในคำสั่ง catch ของข้อยกเว้นซึ่งโดยปกติไม่ควรเกิดขึ้น

ใช้ JDB Debugger

คุณสามารถดีบัก servlets ด้วยคำสั่ง jdb เดียวกับที่คุณใช้เพื่อดีบักแอพเพล็ตหรือแอ็พพลิเคชัน

ในการดีบัก servlet เราดีบัก sun.servlet.http.HttpServer และดูอย่างระมัดระวังขณะที่ HttpServer เรียกใช้งาน servlet เพื่อตอบสนองคำขอ HTTP ที่สร้างจากเบราว์เซอร์ สิ่งนี้คล้ายกับวิธีแก้จุดบกพร่องของแอพเพล็ต ความแตกต่างคือเมื่อใช้แอพเพล็ตโปรแกรมจริงที่ถูกดีบักคือ sun.applet.AppletViewer

ดีบักเกอร์ส่วนใหญ่ซ่อนรายละเอียดนี้โดยรู้วิธีการดีบักแอพเพล็ตโดยอัตโนมัติ จนกว่าจะทำเช่นเดียวกันสำหรับ servlets คุณต้องช่วยดีบักเกอร์ของคุณโดยทำดังต่อไปนี้ -

  • ตั้งค่าคลาสพา ธ ของดีบักเกอร์เพื่อให้สามารถค้นหา sun.servlet.http.Http-Server และคลาสที่เกี่ยวข้อง

  • ตั้งค่าคลาสพา ธ ของดีบักเกอร์เพื่อให้สามารถค้นหา servlets และคลาสสนับสนุนของคุณโดยทั่วไปคือ server_root / servlets และ server_root / คลาส

โดยปกติคุณไม่ต้องการให้ server_root / servlets ใน classpath ของคุณเนื่องจากปิดใช้งานการโหลด servlet อย่างไรก็ตามการรวมนี้มีประโยชน์สำหรับการดีบัก อนุญาตให้ดีบักเกอร์ของคุณตั้งค่าเบรกพอยต์ใน servlet ก่อนที่ตัวโหลด servlet ที่กำหนดเองใน HttpServer จะโหลด servlet

เมื่อคุณตั้งค่า classpath ที่เหมาะสมแล้วให้เริ่มการดีบัก sun.servlet.http.HttpServer คุณสามารถตั้งค่าจุดพักใน servlet ใดก็ได้ที่คุณสนใจในการดีบักจากนั้นใช้เว็บเบราว์เซอร์เพื่อส่งคำขอไปยัง HttpServer สำหรับ servlet ที่กำหนด (http: // localhost: 8080 / servlet / ServletToDebug) คุณควรเห็นการดำเนินการหยุดอยู่ที่จุดพักของคุณ

การใช้ความคิดเห็น

ความคิดเห็นในโค้ดของคุณสามารถช่วยกระบวนการดีบักได้หลายวิธี ข้อคิดเห็นสามารถใช้ในรูปแบบอื่น ๆ ในกระบวนการดีบัก

Servlet ใช้ความคิดเห็น Java และความคิดเห็นบรรทัดเดียว (// ... ) และหลายบรรทัด (/ * ... * /) สามารถใช้เพื่อลบบางส่วนของโค้ด Java ของคุณชั่วคราว หากข้อบกพร่องหายไปให้ตรวจสอบโค้ดที่คุณเพิ่งแสดงความคิดเห็นอย่างละเอียดและค้นหาปัญหา

ส่วนหัวไคลเอนต์และเซิร์ฟเวอร์

บางครั้งเมื่อ servlet ไม่ทำงานตามที่คาดไว้การดูคำขอและการตอบกลับ HTTP ดิบจะมีประโยชน์ หากคุณคุ้นเคยกับโครงสร้างของ HTTP คุณสามารถอ่านคำขอและการตอบกลับและดูว่าเกิดอะไรขึ้นกับส่วนหัวเหล่านั้น

เคล็ดลับการแก้จุดบกพร่องที่สำคัญ

นี่คือรายการของเคล็ดลับการดีบักเพิ่มเติมเกี่ยวกับการดีบัก servlet -

  • โปรดจำไว้ว่า server_root / คลาสไม่โหลดซ้ำและ server_root / servlets อาจทำ

  • ขอให้เบราว์เซอร์แสดงเนื้อหาดิบของหน้าที่กำลังแสดง ซึ่งสามารถช่วยระบุปัญหาการจัดรูปแบบ โดยปกติจะเป็นตัวเลือกในเมนู View

  • ตรวจสอบให้แน่ใจว่าเบราว์เซอร์ไม่ได้แคชเอาต์พุตของคำขอก่อนหน้านี้โดยบังคับให้โหลดหน้าเว็บซ้ำทั้งหมด ด้วย Netscape Navigator ให้ใช้ Shift-Reload กับ Internet Explorer ให้ใช้ Shift-Refresh

  • ตรวจสอบว่าเมธอด init () ของ servlet รับพารามิเตอร์ ServletConfig และเรียกใช้ super.init (config) ทันที