Servlet的调试
以下内容引用自http://wiki.jikexueyuan.com/project/servlet/debugging.html:
测试/调试Servlet始终是困难的。Servlets往往涉及大量的客户端/服务器交互,可能会出现错误但是又难以重现。
这里有一些提示和建议,可以帮助调试。
一、System.out.println()
System.out.println()作为一个标记用来测试某一代码片段是否被执行,使用方法非常简单。也可以输出变量值。另外:
由于System对象是核心Java对象的一部分,它可以用于任何不需要安装任何额外类的地方。这包括Servlets、JSP、RMI、EJB's、普通的Beans和类,以及独立的应用程序。
- 与在断点处停止相比,写入System.out不会对应用程序的正常执行流程有太多干扰,这使得它在时序重要的时候显得非常有价值。
以下使用System.out.println()的语法:
System.out.println("Debugging message");
通过上述语法生成的所有消息将被记录在Web服务器的日志文件中。
二、消息记录
利用标准日志记录方法,使用适当的日志记录方法来记录所有调试、警告和错误消息是非常好的想法,使用的是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 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
目录中找到。
这些日志文件确实为新出现的错误或问题的频率给出了指示。正因为如此,在通常不会出现的异常catch子句中使用log()函数是很好的。
三、使用JDB调试器
可以使用调试applet或应用程序的相同的jdb命令来调试Servlet。
为了调试一个Servlet,可以调试sun.servlet.http.HttpServer,然后把它看成是HttpServer执行Servlet来响应来自浏览器端的HTTP请求。这与调试applet小程序的方式非常相似。与调试applet不同的是,被调试的实际程序是sun.applet.AppletViewer。
大多数调试器会自动隐藏了解如何调试applet的细节。直到他们为Servlet做同样的事情,必须做以下操作来帮助调试器:
设置调试器的类路径,以便它可以找到sun.servlet.http.Http-Server和相关的类。
- 设置调试器的类路径,以便它可以找到Servlet和支持的类,通常是在server_root/servlets和server_root/classes中。
通常不会希望server_root/servlets在classpath中,因为它会禁用Servlet的重载。然而这种包含对于调试是有用的。在HttpServer中的自定义的Servlet加载器加载Servlet之前,它允许调试器在Servlet中设置断点。
一旦设置了正确的类路径,就可以开始调试sun.servlet.http.HttpServer。可以在任何想要调试的Servlet中设置断点,然后使用Web浏览器为给定的Servlet(http://localhost:8080/servlet/ServletToDebug
) 向HttpServer发出请求。会看到程序执行到设置的断点处停止。
四、使用注释
代码中的注释有助于以各种方式调试程序。注释可用于调试过程中的许多其他方式中。
Servlet使用Java注释,单行注释(//...)和多行注释(/*...*/)可用于暂时移除部分Java代码。如果bug消失,仔细看看之前注释的代码并找出问题所在。
五、客户端和服务器端头信息
有时,当一个Servlet并没有像预期那样工作时,查看原始的HTTP请求和响应是非常有用的。如果对HTTP结构很熟悉,可以阅读请求和响应,看看这些头信息中究竟是什么。
六、重要的调试技巧
这里是Servlet调试中的一些调试技巧列表:
请注意server _ root/classes不会重载,而server_root/servlets可能会。
要求浏览器显示它所显示的页面的原始内容。这有助于识别格式的问题。它通常是视图菜单下的一个选项。
通过强制执行完全重载页面,来确保浏览器还没有缓存前一个请求的输出。在Netscape Navigator中,使用Shift-Reload;在 IE 浏览器中,请使用Shift-Refresh(Ctrl+F5更快)。
- 确认Servlet的init()方法接受一个ServletConfig参数并立即调用super.init(config)。
测试工程:https://github.com/easonjim/5_java_example/tree/master/servletbasics/test17
转载于:https://www.cnblogs.com/EasonJim/p/6985944.html
Servlet的调试相关推荐
- Eclipse tomcat Web页面调试
Visual Age for Java是IBM所开发的Java IDE开发环境.早在几年前,就已经占了Java开发平台的半壁江山,而近来已有好长时间没出新版本了,原因在于IBM全心投入了Eclipse ...
- JSP 与 Servlet重要部分
1.讲下servlet的执行流程. Servlet的执行流程也就是servlet的生命周期,当服务器启动的时候生命周期开始,然后通过init()<启动顺序根据web.xml里的startup-o ...
- java调试器jdb_Java调试教程-Java调试器(JDB)概述
Java调试教程-Java调试器(JDB)概述 (2010-12-24 10:44:44) 标签: 杂谈 摘要 虽然现在有一些很好的调试工具,然而 Java 调试器 (JDB) 提供了一些优点.最重要 ...
- linux eclipse web插件,使用Tomcat插件开发WEB应用
在Eclipse中,可以安装Tomcat插件,实现WEB应用的开发调试工作,Tomcat插件还可以支持WEB应用的热部署. 一.安装配置Tomcat插件 可以通过拷贝安装和Links方式安装Tomca ...
- java判断时间区间 隔天_Java初中级程序员面试题宝典
Java基础部分 &与&&区别? &和&&都是逻辑运算符,都是判断两边同时真则为真,否则为假:但是&&当第一个条件不成之后,后面的条件都 ...
- 《Tomcat权威指南》读书笔记
第一章 Tomcat的开幕式 1.Tomcat是以Java编写的,这表示在能够构建和测试它之前,必须安装最新的.完整的JAVA运行环境(JRE,Java runtime). 2.Catalina To ...
- 2018年在武汉面试java软件开发所遇到的一些问题
前言: 本人就我自己在面试中遇到的一些问题做了一个总结,在面试过程中有的问题答上来了,有些回答的感觉不尽人意,有些的遇到的问题问我的一脸懵逼.所以写一个文档出来,以激励自己还有不足的地方,遇到一次不会 ...
- 2019年最全的java面试题总结
从网上下载搜罗了一些最常用的面试题,希望正在面试的小伙伴们能够早点找到称心如意的工作! Java基础部分 &与&&区别? &和&&都是逻辑运算符,都是判 ...
- 微信公众号token验证失败的一些总结
本文转载自: https://www.cnblogs.com/sunnor/p/5958272.html 作者:Sunnor 转载请注明该声明. 这几天准备弄一个微信公众号,在进行服务器配置的时候出现 ...
最新文章
- 糟心!苹果无人车裁员190人,程序员却首当其冲
- flashpaper打印机没有被正确安装_没有正确保存与安装,可导致80%的轴承提早失效...
- error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏的解决方案
- linux——系统日志的信息、采集、查看、保存
- Linux开发常见问题:GCC:链接器输入文件未使用,因为链接尚未完成
- python多线程实现方式_python中实现多线程有几种方式?
- python 字符串替换_学完Python打算出去找工作,怕找不到?看完这篇你可以提高通过率...
- python概念-Socket到底有多骚
- Android 学习笔记 Service服务与远程通信...(AIDL)
- (1)数据库和MySql初步认识
- (Network Analysis)graph centrality measures
- [BZOJ4816][SDOI2017]数字表格(反演)
- Unity_AR制作_80
- linux 分区 intel raid,linux on intel sata raid
- mounted钩子函数_解决Vue中mounted钩子函数获取节点高度出错问题
- 第五次网页前端培训(JavaScript)
- 计算机主机和外设的接口是,外设接口
- linux控制wifi的设备,WIFI控制的遥控车
- thinkpad怎么把计算机设置到桌面,联想ThinkPad笔记本Fn键关闭与启用方法
- HTML5的字体样式设置方法
热门文章
- 【Linux】一步一步学Linux——bzip2命令(65)
- java.util 常见_Java基础知识-java.util.concurrent包下常见类的使用
- 【算法】Bellman-Ford算法(单源最短路径问题)(判断负圈)
- 数据结构-----AVL树的旋转操作
- php递归多维数组为缩进列表,php – 缩进列表到多维数组
- Tensorflow—tfrecord数据集生成与使用
- windows + vscode 远程配置
- php使mysql显示错误_如何针对依赖用户输入的长查询在PHP中显示MySQL错误?
- Pixhawk原生固件以往代码版本的下载
- 最后一块石头的重量II