English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Testare/buggerare un programma JSP o servlet è sempre così difficile. I programmi JSP e Servlets tendono a implicare un gran numero di interazioni client/server, il che potrebbe portare a errori e rendere difficile la riproduzione dell'ambiente di errore.
Di seguito saranno fornite alcune tecniche e suggerimenti per aiutarti a debuggare il programma.
System.out.println() può facilmente segnalare se un segmento di codice è stato eseguito. Naturalmente, possiamo anche stampare vari valori. Inoltre:
Da quando l'oggetto System è diventato un oggetto core di Java, può essere utilizzato ovunque senza dover introdurre ulteriori classi. L'uso include Servlets, JSP, RMI, EJB's, Beans, classi e applicazioni indipendenti.
Contrariamente a fermare l'esecuzione in un punto di interruzione, l'output con System.out non ha un impatto significativo sul flusso di esecuzione dell'applicazione, un tratto molto utile in applicazioni con meccanismi di temporizzazione molto importanti.
Di seguito è riportata la sintassi di System.out.println():
System.out.println("Messaggio di debug");
Questo è un esempio semplice di utilizzo di System.out.print():
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head><title>System.out.println</title></head> <body> <c:forEach var="counter" begin="1" end="10" step="1" > <c:out value="${counter-5}"/></br> <% System.out.println("counter= "); pageContext.findAttribute("counter"); %> </c:forEach> </body> </html>
Ora, se si esegue l'istanza sopra indicata, produrrà i seguenti risultati:
-4 -3 -2 -1 0 1 2 3 4 5
Se si utilizza il server Tomcat, si può trovare il seguente contenuto aggiuntivo nel file stdout.log nella directory logs:
counter=1 counter=2 counter=3 counter=4 counter=5 counter=6 counter=7 counter=8 counter=9 counter=10
Utilizzando questo metodo, possiamo scrivere variabili e altre informazioni nel sistema di logging, utilizzate per analizzare e trovare le cause profonde dei problemi.
Il framework di logging J2SE può fornire servizi di registrazione per qualsiasi classe che esegue nel JVM. Pertanto, possiamo utilizzare questo framework per registrare qualsiasi informazione.
Riscriviamo il codice sopra utilizzando l'API logger di JDK:
<%@taglib prefix="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" begin="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( message ); %> </c:forEach> </body> </html>
Il risultato della sua esecuzione è simile a quello precedente, ma può ottenere informazioni aggiuntive che vengono scritte nel file stdout.log. In questo caso abbiamo utilizzato il metodo info del logger. Di seguito forniamo un'anteprima del file stdout.log:
24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=1 myCount=-4 24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=2 myCount=-3 24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=3 myCount=-2 24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=4 myCount=-1 24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=5 myCount=0 24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=6 myCount=1 24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=7 myCount=2 24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=8 myCount=3 24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=9 myCount=4 24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=10 myCount=5
I messaggi possono essere inviati con diverse priorità utilizzando i metodi sever(), warning(), info(), config(), fine(), finer(), finest(). Il metodo finest() viene utilizzato per registrare le migliori informazioni, mentre il metodo sever() viene utilizzato per registrare le informazioni più gravi.
Utilizzare il framework Log4J per registrare messaggi in diversi file, i messaggi sono classificati in base alla gravità e all'importanza.
NetBeans è una struttura ad albero, un ambiente di sviluppo Java open source che supporta la sviluppo di applicazioni Java indipendenti e applicazioni web, supporta anche il debug di JSP.
NetBeans supporta le seguenti funzionalità di debug di base:
Breakpoint
Tracciamento passo-passo
Punti di osservazione
Per ulteriori informazioni, consultare la guida utente di NetBeans.
È possibile utilizzare il comando jdb per debugare JSP e servlets, proprio come si farebbe con un'applicazione comune.
Di solito, debugiamo direttamente l'oggetto sun.servlet.http.HttpServer per vedere come JSP/Servlets eseguono le richieste HTTP. Questo è molto simile al debug degli applets. La differenza è che il programma di applet che viene effettivamente debuggato è sun.applet.AppletViewer.
La maggior parte dei debuger possono automaticamente ignorare alcuni dettagli durante la debug di applets, perché sanno come debugare gli applets. Se si desidera trasferire l'oggetto di debug su JSP, è necessario fare due punti:
设置调试器的classpath,让它能够找到sun.servlet.http.Http-Server 和相关的类。
设置调试器的classpath,让它能够找到您的JSP文件和相关的类。
设置好classpath后,开始调试sun.servlet.http.Http-Server 。您可以在JSP文件的任意地方设置断点,只要你喜欢,然后使用浏览器发送一个请求给服务器就应该可以看见程序停在了断点处。
程序中的注释在很多方面都对程序的调试起到一定的帮助作用。注释可以用在调试程序的很多方面中。
JSP使用Java注释。如果一个BUG消失了,就请仔细查看您刚注释过的代码,通常都能找出原因。
有时候,当JSP没有按照预定的方式运行时,查看未加工的HTTP请求和响应也是很有用的。如果对HTTP的结构很熟悉的话,您可以直接观察request和response然后看看这些头模块到底怎么了。
这里我们再透露两个调试JSP的小技巧:
使用浏览器显示原始的页面内容,用来区分是否是格式问题。这个选项通常在View菜单下。
确保浏览器在强制重新载入页面时没有捕获先前的request输出。若使用的是Netscape Navigator浏览器,则用Shift-Reload;若使用的是IE浏览器,则用Shift-Refresh。