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) ทันที