開(kāi)發(fā)使用過(guò)程中始終是難以測(cè)試/調(diào)試servlet。 Servlet往往涉及大量的客戶(hù)端/服務(wù)器交互,可能會(huì)出現(xiàn)錯(cuò)誤但難以重現(xiàn)。 這里有一些提示和建議,可以幫助你調(diào)試。 System.out.println()System.out.println() 是作為一個(gè)標(biāo)記,以測(cè)試是否有一定的一段代碼被執(zhí)行或不使用。我們可以打印出變量的值。此外:
以下是使用System.out.println()的語(yǔ)法: System.out.println("Debugging message"); 通過(guò)上面的語(yǔ)法生成的消息將被記錄在Web服務(wù)器日志文件。 消息日志:這是非常好的想法,使用適當(dāng)?shù)娜罩居涗浄椒▉?lái)記錄所有調(diào)試,警告和錯(cuò)誤消息,使用標(biāo)準(zhǔn)的日志方法。推薦使用Log4j來(lái)記錄所有的消息。 Servlet API還提供了一個(gè)簡(jiǎn)單的方法,使用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 - by www. }
ServletContext中文本消息記錄到servlet容器的日志文件。對(duì)于Tomcat,這些日志可在<Tomcat-installation-directory>/logs目錄中找到。
使用JDB調(diào)試器:可以具有相同的jdb命令您使用調(diào)試applet或應(yīng)用程序的調(diào)試Servlet。 為了調(diào)試一個(gè)servlet,我們可以調(diào)試sun.servlet.http.HttpServer,然后看HttpServer的執(zhí)行Servlet的響應(yīng)HTTP請(qǐng)求從瀏覽器。這是調(diào)試applets小程序非常相似。與applet不同的是,實(shí)際被調(diào)試的程序是sun.applet.AppletViewer。 大多數(shù)調(diào)試器會(huì)自動(dòng)知道如何調(diào)試applet隱藏這個(gè)細(xì)節(jié)。對(duì)于servlet同樣的,你一定要幫調(diào)試器通過(guò)執(zhí)行以下操作:
通常你不會(huì)希望server_root/Servlet在classpath中,因?yàn)樗鼤?huì)禁用servlet的重新加載。這種包容性,對(duì)于調(diào)試非常有用。它允許在一個(gè)servlet調(diào)試器設(shè)置斷點(diǎn)之前自定義servlet加載器在HttpServer加載的servlet。 如果已經(jīng)設(shè)置了正確的classpath,就可以開(kāi)始調(diào)試sun.servlet.http.HttpServer??梢栽诟信d趣的servlet代碼中調(diào)試設(shè)置斷點(diǎn),然后使用Web瀏覽器請(qǐng)求給定的servlet(http://localhost:8080/servlet/ServletToDebug)。您應(yīng)該看程序執(zhí)行到停止的斷點(diǎn)。 使用注釋:代碼中的注釋可以幫助調(diào)試過(guò)程中的各種方式。注釋可用于很多其他的方法在調(diào)試過(guò)程中。 該Servlet使用Java注釋和多行單行(//...)(/* ...*/)注釋可用于暫時(shí)刪除Java代碼部分作用。如果錯(cuò)誤消失,仔細(xì)看看你剛才注釋的代碼,并找出問(wèn)題。 客戶(hù)端和服務(wù)器端頭:有時(shí),當(dāng)一個(gè)Servlet并沒(méi)有像預(yù)期的那樣,它是非常有用的,看看原始的HTTP請(qǐng)求和響應(yīng)。如果你熟悉HTTP的結(jié)構(gòu),你可以閱讀的請(qǐng)求和響應(yīng),看看這些響應(yīng)頭究竟會(huì)發(fā)生什么事情。 重要的調(diào)試技巧:下面是更多一些的servlet調(diào)試的調(diào)試技巧的列表:
|
|