Servlet – 调试
构建 servlet 最困难的组件之一是测试和调试。因为 servlet 包含大量客户端/服务器交互,所以它们很容易出错——尽管它们很难出现。由于 servlet 在强多线程且通常很复杂的 Web 服务器中运行,因此它们在普通调试器中无法函数,因此可能难以追踪非明显故障的原因。
您还可以按照以下步骤利用服务器的交互式显示来调试 servlet:
- 要构建您的 servlet,请使用 Qshell 解释器中的 javac -g 命令。
- 将源代码(Java文件)和编译后的代码(.class 文件)放在类路径目录中。
- 启动服务器。
- 在 servlet 运行的作业上,执行 Start Service Job (STRSRVJOB) 命令。
- STRDBG CLASS(myServlet),其中 myServlet 是您的 servlet 的名称。有必要显示来源。
- 按 F12 在 servlet 中设置断点。
- 要更新修改,如果启用了自动类重新加载(这是默认配置),请单击 Web 浏览器中的刷新按钮。您的应用程序的状态不会丢失。
- 如果未启用自动类重新加载,您将丢失程序的状态。重新启动服务器以应用修改。
一些可以帮助您调试的提示和建议:
- 通过使用 System.out.println()
- 消息日志
- 使用 JDB 调试器
- 使用评论
- 客户端和服务器头
使用 System.out.println() 命令
System.out.println() 是一个标记,用于查看给定的代码段是否已运行。变量的值也可以打印出来。此外:\
因为 System object 是核心Java对象的一部分,所以它们可以在任何地方使用,而不需要安装额外的类。 Servlet、JSP、RMI、EJB、通用 Bean 和类以及独立应用程序都是这方面的示例。
在断点处以各种暂停写入系统。它不会干扰应用程序的通常执行流程,这意味着当它非常有益时,时间是至关重要的。
语法:使用 System.out.println() 命令
System.out.println("Debugging message");
上述语法创建的所有消息都将记录在网络服务器的日志文件中。
消息日志
使用适当的日志记录机制来捕获所有调试、警告和错误消息,这是一个好主意;建议使用 log4J 来捕获所有消息。 Servlet API 中的 log()函数还提供了一种简单的输出方式:
例子:
Java
// Java Program to Illustrate log4J for Capturing
// All Messages Logs
// Importing required classes
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// Class
// Extending HttpServlet class
public class GFG extends HttpServlet {
// Method 1
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, java.io.IOException
{
String par = request.getParameter("par1");
// Calling 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();
// Title to be displayed
String title = "Geeksforgeeks Context Log program ";
String docType
= "\n";
out.println(
docType + "\n"
+ "" + title + " \n"
+ "\n"
+ "" + title + "
\n"
+ "Messages sent successfully
\n"
+ "");
}
}
XML
GFG
GFG
GFG
/GFG
GFG.java
文件: web.xml
XML
GFG
GFG
GFG
/GFG
GFG.java
输出:运行 GFG。 Java文件,你会得到以下输出:
使用 JDB 调试器
要调试 Servlet,请使用 applet 或应用程序调试jdb 命令。
我们可以使用 sun.servlet.http.HttpServer 来调试一个 Servlet,然后将其作为 HttpServer Servlet 运行以响应浏览器端的 HTTP 请求。这个简单的调试小程序软件类似。调试小程序时,真正被调试的应用程序是sun.applet.AppletViewer 。
在大多数调试器中,默认情况下,如何调试小程序的详细信息通常是隐藏的。同样,使用调试器,您必须对 servlet 执行以下操作:
- 设置调试器的类路径,以便可以找到 sun.servlet.http.Http-Server 和相关的类。
- 设置调试器的类路径以查找您的 servlet 和伴随的类,它们通常位于服务器根/servlets 和服务器根/servlet 中的服务器根/类不应在您的类路径中,因为它会阻止 servlet 重新加载。另一方面,这种包含有利于调试。它使您的调试器能够在 HttpServer 的专有 servlet 加载器加载它之前在 servlet 中设置断点。
指定正确的类路径后,开始调试 sun.servlet.http.HttpServer。在要调试的 servlet 中设置断点后,您可以使用 Web 浏览器向 HttpServer 请求提供的 servlet (http://localhost:8080/servlet/ServletToDebug)。在您的断点处,您应该观察到执行停止。
使用评论
代码中的注释以多种方式帮助调试。可以以多种方式使用注释来帮助调试过程。
临时删除部分Java代码,使用Java Servlet注释和单行注释(//…)、多行注释(/*…*/)。如果错误消失了,您现在要做的就是查看注释代码以找出问题所在。
客户端和服务器头
当 servlet 无法按预期运行时,检查原始 HTTP 请求和响应有时会有所帮助。如果您知道 HTTP 的工作原理,您可以阅读请求和响应,并准确了解标头的情况。
Note: Do remember certain important keypoints for debugging. Here is a list of some other servlet debugging tips:
- Keep in mind that server root/classes do not reload, although server root/servlets very certainly do.
- Request that a browser displays the raw content of the page it is now viewing. This can aid in the detection of formatting issues. Under the View menu, it’s generally an option.
- By requiring a full refresh of the website, you can ensure that the browser isn’t caching the results of a prior request. Use Shift-Reload in Netscape Navigator and Shift-Refresh in Internet Explorer.
- Check that the init() function of your servlet accepts a ServletConfig argument and immediately calls super.init(config).