Servlet 调试是开发过程中识别和修复代码问题的关键步骤。本文将介绍如何在Servlet开发中进行调试,包括日志记录、断点调试和异常处理。


目录

  1. 调试概述
  2. 使用日志记录
  3. 断点调试
  4. 异常跟踪
  5. 完整示例
  6. 部署与测试
  7. 参考资料

1. 调试概述

  • 定义:调试是检查Servlet运行时行为、定位错误的过程。
  • 方法
  • 日志:记录运行信息。
  • 断点:在IDE中暂停执行。
  • 异常栈:分析错误原因。
  • 工具:IDE(如IntelliJ IDEA、Eclipse)、日志框架(如SLF4J)。

2. 使用日志记录

配置日志

使用SLF4J和Logback:

  • 添加依赖(Maven):
  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.36</version>
  </dependency>
  <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.11</version>
  </dependency>
  • 配置 logback.xml(放入 WEB-INF/classes/):
  <configuration>
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
          <encoder>
              <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
          </encoder>
      </appender>
      <root level="debug">
          <appender-ref ref="CONSOLE"/>
      </root>
  </configuration>

记录日志

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private static final Logger logger = LoggerFactory.getLogger(MyServlet.class);
logger.debug("处理请求: {}", request.getParameter("name"));

3. 断点调试

在IDE中设置

  • IntelliJ IDEA
  1. 在代码行左侧点击设置断点(红点)。
  2. 以“Debug”模式运行Tomcat(点击虫子图标)。
  3. 访问Servlet,程序在断点暂停。
  • 功能
  • 查看变量值。
  • 单步执行(Step Over/Into)。

示例

doGet 中设置断点:

String name = request.getParameter("name"); // 断点

4. 异常跟踪

捕获和打印栈

try {
    int value = Integer.parseInt(request.getParameter("num"));
} catch (NumberFormatException e) {
    logger.error("参数转换错误", e);
    response.sendError(400, "无效数字");
}

Tomcat日志

  • 检查 logs/localhost.logcatalina.out 查看异常。

5. 完整示例

以下是一个带调试功能的Servlet。

Servlet:DebugServlet.java

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DebugServlet extends HttpServlet {
    private static final Logger logger = LoggerFactory.getLogger(DebugServlet.class);

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        logger.info("收到GET请求,IP: {}", request.getRemoteAddr());
        String name = request.getParameter("name");
        logger.debug("参数name: {}", name);

        try {
            int num = Integer.parseInt(request.getParameter("num"));
            logger.debug("解析数字: {}", num);
            out.println("<h1>欢迎, " + name + "!</h1>");
            out.println("<p>数字: " + num + "</p>");
        } catch (NumberFormatException e) {
            logger.error("数字解析失败", e);
            out.println("<h1>错误: 请输入有效数字</h1>");
        } catch (Exception e) {
            logger.error("未知错误", e);
            out.println("<h1>服务器错误</h1>");
        }
        out.println("<a href=\"/myapp/debug.html\">返回</a>");
    }
}

HTML:debug.html

<!DOCTYPE html>
<html>
<head><title>调试测试</title></head>
<body>
    <h2>调试Servlet</h2>
    <form method="GET" action="/myapp/debug">
        姓名: <input type="text" name="name"><br>
        数字: <input type="text" name="num"><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

配置:web.xml

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <servlet>
        <servlet-name>DebugServlet</servlet-name>
        <servlet-class>DebugServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DebugServlet</servlet-name>
        <url-pattern>/debug</url-pattern>
    </servlet-mapping>
</web-app>

6. 部署与测试

部署

  1. 编译:
   javac -cp /path/to/tomcat/lib/servlet-api.jar:/path/to/slf4j-api.jar:/path/to/logback-classic.jar DebugServlet.java
  1. .class 文件放入 myapp/WEB-INF/classes/
  2. debug.htmllogback.xml 放入 myapp/
  3. 将SLF4J和Logback JAR放入 WEB-INF/lib/
  4. 更新 web.xml
  5. 部署 myapp 到Tomcat的 webapps 目录。
  6. 启动Tomcat。

测试

  • 访问:http://localhost:8080/myapp/debug.html
  • 输入“Alice”和“123”:显示欢迎信息,日志记录请求。
  • 输入“Alice”和“abc”:显示错误,日志记录异常。
  • 在IDE中设置断点,观察变量值。

7. 参考资料

出站链接

其他资源

  • 《Java Debugging with IntelliJ》 – IDE调试指南。
  • X社区:搜索 #ServletDebug 获取示例。

这篇指南展示了Servlet调试的多种方法。如果需要更深入内容(如远程调试或性能分析),请告诉我!