📜  Servlet – 调试

📅  最后修改于: 2022-05-13 01:55:38.638000             🧑  作者: Mango

Servlet – 调试

构建 servlet 最困难的组件之一是测试和调试。因为 servlet 包含大量客户端/服务器交互,所以它们很容易出错——尽管它们很难出现。由于 servlet 在强多线程且通常很复杂的 Web 服务器中运行,因此它们在普通调试器中无法函数,因此可能难以追踪非明显故障的原因。

您还可以按照以下步骤利用服务器的交互式显示来调试 servlet:

  1. 要构建您的 servlet,请使用 Qshell 解释器中的 javac -g 命令。
  2. 将源代码(Java文件)和编译后的代码(.class 文件)放在类路径目录中。
  3. 启动服务器。
  4. 在 servlet 运行的作业上,执行 Start Service Job (STRSRVJOB) 命令。
  5. STRDBG CLASS(myServlet),其中 myServlet 是您的 servlet 的名称。有必要显示来源。
  6. 按 F12 在 servlet 中设置断点。
  7. 要更新修改,如果启用了自动类重新加载(这是默认配置),请单击 Web 浏览器中的刷新按钮。您的应用程序的状态不会丢失。
  8. 如果未启用自动类重新加载,您将丢失程序的状态。重新启动服务器以应用修改。

一些可以帮助您调试的提示和建议:

  1. 通过使用 System.out.println()
  2. 消息日志
  3. 使用 JDB 调试器
  4. 使用评论
  5. 客户端和服务器头

使用 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 的工作原理,您可以阅读请求和响应,并准确了解标头的情况。