Servlet的调试
以下內(nèi)容引用自http://wiki.jikexueyuan.com/project/servlet/debugging.html:
測(cè)試/調(diào)試Servlet始終是困難的。Servlets往往涉及大量的客戶端/服務(wù)器交互,可能會(huì)出現(xiàn)錯(cuò)誤但是又難以重現(xiàn)。
這里有一些提示和建議,可以幫助調(diào)試。
一、System.out.println()
System.out.println()作為一個(gè)標(biāo)記用來(lái)測(cè)試某一代碼片段是否被執(zhí)行,使用方法非常簡(jiǎn)單。也可以輸出變量值。另外:
-
由于System對(duì)象是核心Java對(duì)象的一部分,它可以用于任何不需要安裝任何額外類(lèi)的地方。這包括Servlets、JSP、RMI、EJB's、普通的Beans和類(lèi),以及獨(dú)立的應(yīng)用程序。
- 與在斷點(diǎn)處停止相比,寫(xiě)入System.out不會(huì)對(duì)應(yīng)用程序的正常執(zhí)行流程有太多干擾,這使得它在時(shí)序重要的時(shí)候顯得非常有價(jià)值。
以下使用System.out.println()的語(yǔ)法:
System.out.println("Debugging message");通過(guò)上述語(yǔ)法生成的所有消息將被記錄在Web服務(wù)器的日志文件中。
二、消息記錄
利用標(biāo)準(zhǔn)日志記錄方法,使用適當(dāng)?shù)娜罩居涗浄椒▉?lái)記錄所有調(diào)試、警告和錯(cuò)誤消息是非常好的想法,使用的是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 methodsServletContext context = getServletContext( );if (par == null || par.equals(""))//log version with Throwable parametercontext.log("No message received:",new IllegalStateException("Missing parameter"));elsecontext.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目錄中找到。
這些日志文件確實(shí)為新出現(xiàn)的錯(cuò)誤或問(wèn)題的頻率給出了指示。正因?yàn)槿绱?#xff0c;在通常不會(huì)出現(xiàn)的異常catch子句中使用log()函數(shù)是很好的。
三、使用JDB調(diào)試器
可以使用調(diào)試applet或應(yīng)用程序的相同的jdb命令來(lái)調(diào)試Servlet。
為了調(diào)試一個(gè)Servlet,可以調(diào)試sun.servlet.http.HttpServer,然后把它看成是HttpServer執(zhí)行Servlet來(lái)響應(yīng)來(lái)自瀏覽器端的HTTP請(qǐng)求。這與調(diào)試applet小程序的方式非常相似。與調(diào)試applet不同的是,被調(diào)試的實(shí)際程序是sun.applet.AppletViewer。
大多數(shù)調(diào)試器會(huì)自動(dòng)隱藏了解如何調(diào)試applet的細(xì)節(jié)。直到他們?yōu)镾ervlet做同樣的事情,必須做以下操作來(lái)幫助調(diào)試器:
-
設(shè)置調(diào)試器的類(lèi)路徑,以便它可以找到sun.servlet.http.Http-Server和相關(guān)的類(lèi)。
- 設(shè)置調(diào)試器的類(lèi)路徑,以便它可以找到Servlet和支持的類(lèi),通常是在server_root/servlets和server_root/classes中。
通常不會(huì)希望server_root/servlets在classpath中,因?yàn)樗鼤?huì)禁用Servlet的重載。然而這種包含對(duì)于調(diào)試是有用的。在HttpServer中的自定義的Servlet加載器加載Servlet之前,它允許調(diào)試器在Servlet中設(shè)置斷點(diǎn)。
一旦設(shè)置了正確的類(lèi)路徑,就可以開(kāi)始調(diào)試sun.servlet.http.HttpServer。可以在任何想要調(diào)試的Servlet中設(shè)置斷點(diǎn),然后使用Web瀏覽器為給定的Servlet(http://localhost:8080/servlet/ServletToDebug) 向HttpServer發(fā)出請(qǐng)求。會(huì)看到程序執(zhí)行到設(shè)置的斷點(diǎn)處停止。
四、使用注釋
代碼中的注釋有助于以各種方式調(diào)試程序。注釋可用于調(diào)試過(guò)程中的許多其他方式中。
Servlet使用Java注釋,單行注釋(//...)和多行注釋(/*...*/)可用于暫時(shí)移除部分Java代碼。如果bug消失,仔細(xì)看看之前注釋的代碼并找出問(wèn)題所在。
五、客戶端和服務(wù)器端頭信息
有時(shí),當(dāng)一個(gè)Servlet并沒(méi)有像預(yù)期那樣工作時(shí),查看原始的HTTP請(qǐng)求和響應(yīng)是非常有用的。如果對(duì)HTTP結(jié)構(gòu)很熟悉,可以閱讀請(qǐng)求和響應(yīng),看看這些頭信息中究竟是什么。
六、重要的調(diào)試技巧
這里是Servlet調(diào)試中的一些調(diào)試技巧列表:
-
請(qǐng)注意server _ root/classes不會(huì)重載,而server_root/servlets可能會(huì)。
-
要求瀏覽器顯示它所顯示的頁(yè)面的原始內(nèi)容。這有助于識(shí)別格式的問(wèn)題。它通常是視圖菜單下的一個(gè)選項(xiàng)。
-
通過(guò)強(qiáng)制執(zhí)行完全重載頁(yè)面,來(lái)確保瀏覽器還沒(méi)有緩存前一個(gè)請(qǐng)求的輸出。在Netscape Navigator中,使用Shift-Reload;在 IE 瀏覽器中,請(qǐng)使用Shift-Refresh(Ctrl+F5更快)。
- 確認(rèn)Servlet的init()方法接受一個(gè)ServletConfig參數(shù)并立即調(diào)用super.init(config)。
?
測(cè)試工程:https://github.com/easonjim/5_java_example/tree/master/servletbasics/test17
轉(zhuǎn)載于:https://www.cnblogs.com/EasonJim/p/6985944.html
總結(jié)
以上是生活随笔為你收集整理的Servlet的调试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Vivado2015.4使用教程(一个完
- 下一篇: 【USACO】电子游戏 有条件的背包