การทดสอบ/ดีบัก JSP หรือโปรแกรมเซิร์ฟเล็ตเป็นเรื่องยากเสมอไป โปรแกรม JSP และ Servlets มีแนวโน้มที่จะเกี่ยวข้องกับการโต้ตอบระหว่างไคลเอ็นต์/เซิร์ฟเวอร์เป็นจำนวนมาก ซึ่งมีแนวโน้มที่จะทำให้เกิดข้อผิดพลาดอย่างมาก และเป็นการยากที่จะสร้างสภาพแวดล้อมข้อผิดพลาดขึ้นมาใหม่
ต่อไป เราจะให้คำแนะนำและเคล็ดลับเพื่อช่วยคุณแก้ไขข้อบกพร่องของโปรแกรม
System.out.println() สามารถทำเครื่องหมายได้อย่างง่ายดายว่าโค้ดบางส่วนถูกเรียกใช้งานหรือไม่ แน่นอนว่าเราสามารถพิมพ์ค่าต่างๆ ออกมาได้ อีกด้วย:
เนื่องจากอ็อบเจ็กต์ System กลายเป็นอ็อบเจ็กต์ Java หลัก จึงสามารถใช้งานได้ทุกที่โดยไม่ต้องมีคลาสเพิ่มเติม ขอบเขตการใช้งานประกอบด้วย Servlets, JSP, RMI, EJB's, Beans, คลาส และแอปพลิเคชันแบบสแตนด์อโลน
เมื่อเปรียบเทียบกับการหยุดการทำงานที่จุดพัก การใช้ System.out เพื่อส่งออกจะไม่ส่งผลกระทบอย่างมีนัยสำคัญต่อกระบวนการทำงานของแอปพลิเคชัน คุณลักษณะนี้มีประโยชน์มากในแอปพลิเคชันที่กลไกการกำหนดเวลามีความสำคัญมาก
ไวยากรณ์สำหรับการใช้ System.out.println() มีดังต่อไปนี้:
System.out.println("ข้อความการดีบัก");นี่คือตัวอย่างง่ายๆ โดยใช้ System.out.print():
<%@taglib คำนำหน้า = "c" uri = "http://java.sun.com/jsp/jstl/core" %><html><head><title>System.out.println</title></ หัว <body><c:forEach var="counter" beginning="1" end="10" step="1" > <c:out value="${counter-5}"/></br> <% System.out.println( "เคาน์เตอร์ = " + pageContext.findAttribute("ตัวนับ") ); %></c:forEach></body></html>ตอนนี้ หากคุณรันตัวอย่างข้างต้น มันจะให้ผลลัพธ์ดังต่อไปนี้:
-4-3-2-1012345หากคุณใช้เซิร์ฟเวอร์ Tomcat คุณจะสามารถค้นหาเนื้อหาเพิ่มเติมต่อไปนี้ในไฟล์ stdout.log ในไดเร็กทอรีบันทึก:
เคาน์เตอร์=1เคาน์เตอร์=2เคาน์เตอร์=3เคาน์เตอร์=4เคาน์เตอร์=5เคาน์เตอร์=6เคาน์เตอร์=7เคาน์เตอร์=8เคาน์เตอร์=9เคาน์เตอร์=10เมื่อใช้วิธีการนี้ ตัวแปรและข้อมูลอื่นๆ จะสามารถส่งออกไปยังบันทึกของระบบเพื่อการวิเคราะห์และค้นหาสาเหตุของปัญหาได้
เฟรมเวิร์กการบันทึก J2SE ให้บริการการบันทึกสำหรับคลาสใดๆ ที่ทำงานอยู่ใน JVM ดังนั้นเราจึงสามารถใช้กรอบนี้เพื่อบันทึกข้อมูลใดๆ
มาเขียนโค้ดด้านบนใหม่เพื่อใช้ logger API ใน JDK:
<%@taglib คำนำหน้า = "c" uri = "http://java.sun.com/jsp/jstl/core" %><%@page import="java.util.logging.Logger" %><html> <head><title>Logger.info</title></head><body><% Logger logger=Logger.getLogger(this.getClass().getName());%><c:forEach var="counter " เริ่มต้น="1" end="10" step="1" > <c:set var="myCount" value="${counter-5}" /> <c:out value="${myCount}"/ ></br> <% String message = "counter=" + pageContext.findAttribute("counter") + " myCount=" + pageContext.findAttribute("myCount"); logger.info( ข้อความ ); :forEach></body></html>ผลลัพธ์จะคล้ายกับผลลัพธ์ก่อนหน้า แต่สามารถส่งออกข้อมูลเพิ่มเติมไปยังไฟล์ stdout.log ได้ ที่นี่เราใช้วิธีข้อมูลในบันทึก ด้านล่างนี้เราจะให้ภาพรวมของไฟล์ stdout.log:
24 กันยายน 2556 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=1 myCount=-424-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=2 myCount=- 324-ก.ย.-2556 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: เคาน์เตอร์ = 3 myCount = -224-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: เคาน์เตอร์ = 4 myCount = -124-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=5 myCount=024-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=6 myCount=124-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter= 7myCount=224-ก.ย.-2556 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=8 myCount=324-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=9 myCount=424-Sep-2013 23: 31:31 org.apache.jsp.main_jsp _jspServiceINFO: ตัวนับ=10 myCount=5สามารถส่งข้อความที่มีลำดับความสำคัญต่างๆ ได้ โดยใช้เมธอด sever(), warning(), info(), config(), fine(), finer() และ finest() วิธี finest() ใช้เพื่อบันทึกข้อมูลที่ดีที่สุด และวิธีการ sever() ใช้เพื่อบันทึกข้อมูลที่ร้ายแรงที่สุด
ใช้เฟรมเวิร์ก Log4J เพื่อบันทึกข้อความในไฟล์ต่างๆ ซึ่งจัดประเภทตามความรุนแรงและความสำคัญ
NetBeans เป็นโครงสร้างแบบต้นไม้และสภาพแวดล้อมการพัฒนา Java แบบโอเพ่นซอร์สที่ครอบคลุม ซึ่งสนับสนุนการพัฒนาแอปพลิเคชัน Java อิสระและแอปพลิเคชันเครือข่าย และยังรองรับการดีบัก JSP อีกด้วย
NetBeans รองรับฟังก์ชันการดีบักพื้นฐานต่อไปนี้:
เบรกพอยต์
ติดตามขั้นตอนเดียว
จุดสังเกต
ข้อมูลรายละเอียดสามารถพบได้ในคู่มือ NetBeans
คุณสามารถใช้คำสั่ง jdb ใน JSP และเซิร์ฟเล็ตเพื่อดีบักได้เหมือนกับแอปพลิเคชันทั่วไป
โดยปกติ เราจะดีบักอ็อบเจ็กต์ sun.servlet.http.HttpServer โดยตรงเพื่อดูว่า HttpServer ดำเนินการ JSP/Servlets เพื่อตอบสนองต่อคำขอ HTTP อย่างไร สิ่งนี้คล้ายกับการดีบักแอปเพล็ตมาก ความแตกต่างก็คือสิ่งที่โปรแกรมแอปเพล็ตทำการดีบั๊กจริงๆ คือ sun.applet.AppletViewer
ตัวดีบั๊กส่วนใหญ่สามารถละเว้นรายละเอียดบางอย่างได้โดยอัตโนมัติเมื่อทำการดีบักแอปเพล็ต เนื่องจากพวกเขารู้วิธีดีบั๊กแอปเพล็ต หากคุณต้องการถ่ายโอนอ็อบเจ็กต์การดีบักไปยัง JSP คุณต้องทำสองสิ่งต่อไปนี้:
ตั้งค่า classpath ของดีบักเกอร์เพื่อให้สามารถค้นหา sun.servlet.http.Http-Server และคลาสที่เกี่ยวข้องได้
ตั้งค่า classpath ของดีบักเกอร์เพื่อให้สามารถค้นหาไฟล์ JSP ของคุณและคลาสที่เกี่ยวข้องได้
หลังจากตั้งค่า classpath แล้ว ให้เริ่มการดีบัก sun.servlet.http.Http-Server คุณสามารถตั้งค่าเบรกพอยต์ที่ใดก็ได้ในไฟล์ JSP ตามที่คุณต้องการ จากนั้นใช้เบราว์เซอร์เพื่อส่งคำขอไปยังเซิร์ฟเวอร์ และคุณจะเห็นโปรแกรมหยุดที่เบรกพอยต์
ความคิดเห็นในโปรแกรมมีบทบาทบางอย่างในการดีบักโปรแกรมในหลายๆ ด้าน ความคิดเห็นสามารถนำมาใช้ในหลายแง่มุมของการดีบักโปรแกรม
JSP ใช้คำอธิบายประกอบ Java หากข้อบกพร่องหายไป ให้ตรวจดูโค้ดที่คุณเพิ่งแสดงความคิดเห็นให้ละเอียดยิ่งขึ้น และโดยปกติแล้วคุณจะสามารถค้นหาสาเหตุได้
บางครั้ง การดูคำขอและการตอบกลับ HTTP แบบดิบเมื่อ JSP ไม่ทำงานตามที่ตั้งใจไว้ก็มีประโยชน์เช่นกัน หากคุณคุ้นเคยกับโครงสร้างของ HTTP คุณสามารถสังเกตคำขอและการตอบกลับได้โดยตรง และดูว่าเกิดอะไรขึ้นกับโมดูลส่วนหัวเหล่านี้
เราจะเปิดเผยเคล็ดลับเพิ่มเติมสองประการสำหรับการดีบัก JSP:
ใช้เบราว์เซอร์เพื่อแสดงเนื้อหาของหน้าต้นฉบับเพื่อแยกแยะว่ามีปัญหาด้านรูปแบบหรือไม่ ปกติตัวเลือกนี้จะอยู่ในเมนู View
ตรวจสอบให้แน่ใจว่าเบราว์เซอร์ไม่ได้บันทึกเอาต์พุตคำขอก่อนหน้าเมื่อบังคับให้โหลดหน้าซ้ำ หากคุณใช้เบราว์เซอร์ Netscape Navigator ให้ใช้ Shift-Reload หากคุณใช้เบราว์เซอร์ IE ให้ใช้ Shift-Refresh