Servlet 是处理客户端HTTP请求的核心组件,通过 HttpServletRequest 对象获取请求信息,并使用 HttpServletResponse 生成响应。本文将介绍如何处理不同类型的HTTP请求。


目录

  1. HTTP 请求概述
  2. 处理GET请求
  3. 处理POST请求
  4. 其他HTTP方法
  5. 综合示例
  6. 部署与测试
  7. 参考资料

1. HTTP 请求概述

  • HTTP 请求:客户端(如浏览器)通过HTTP协议发送的请求,包括方法、头信息、参数等。
  • Servlet 处理
  • HttpServletRequest:提供请求数据(如参数、头、方法)。
  • HttpServletResponse:生成响应。
  • 常见方法
  • GET:获取数据,参数在URL中。
  • POST:提交数据,参数在请求体中。
  • PUT/DELETE:更新或删除资源。

2. 处理GET请求

GET请求通常用于查询数据,参数通过URL传递。

示例代码:GetRequestServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

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

        String id = request.getParameter("id");
        String queryString = request.getQueryString();

        out.println("<html><body>");
        out.println("<h1>GET 请求</h1>");
        out.println("<p>ID: " + (id != null ? id : "未提供") + "</p>");
        out.println("<p>查询字符串: " + (queryString != null ? queryString : "无") + "</p>");
        out.println("</body></html>");
    }
}

测试URL

http://localhost:8080/myapp/get?id=123


3. 处理POST请求

POST请求用于提交数据,参数在请求体中。

示例代码:PostRequestServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class PostRequestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8"); // 处理中文
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String name = request.getParameter("name");
        String message = request.getParameter("message");

        out.println("<html><body>");
        out.println("<h1>POST 请求</h1>");
        out.println("<p>姓名: " + (name != null ? name : "未提供") + "</p>");
        out.println("<p>消息: " + (message != null ? message : "未提供") + "</p>");
        out.println("</body></html>");
    }
}

对应HTML

<form method="POST" action="/myapp/post">
    姓名: <input type="text" name="name"><br>
    消息: <textarea name="message"></textarea><br>
    <input type="submit" value="提交">
</form>

4. 其他HTTP方法

Servlet 支持其他HTTP方法,如PUT和DELETE。

示例:PutRequestServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

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

        String resourceId = request.getParameter("resourceId");

        out.println("<html><body>");
        out.println("<h1>PUT 请求</h1>");
        out.println("<p>更新资源 ID: " + (resourceId != null ? resourceId : "未提供") + "</p>");
        out.println("</body></html>");
    }
}
  • 测试:使用工具如Postman发送PUT请求。

5. 综合示例

以下是一个支持多种HTTP方法的Servlet。

HTML:request.html

<!DOCTYPE html>
<html>
<head><title>HTTP 请求测试</title></head>
<body>
    <h2>GET 请求</h2>
    <form method="GET" action="/myapp/request">
        ID: <input type="text" name="id"><br>
        <input type="submit" value="GET提交">
    </form>

    <h2>POST 请求</h2>
    <form method="POST" action="/myapp/request">
        姓名: <input type="text" name="name"><br>
        消息: <input type="text" name="message"><br>
        <input type="submit" value="POST提交">
    </form>
</body>
</html>

Servlet:RequestServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class RequestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String id = request.getParameter("id");

        out.println("<html><body>");
        out.println("<h1>GET 请求</h1>");
        out.println("<p>ID: " + (id != null ? id : "未提供") + "</p>");
        out.println("<a href=\"/myapp/request.html\">返回</a>");
        out.println("</body></html>");
    }

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

        String name = request.getParameter("name");
        String message = request.getParameter("message");

        out.println("<html><body>");
        out.println("<h1>POST 请求</h1>");
        out.println("<p>姓名: " + (name != null ? name : "未提供") + "</p>");
        out.println("<p>消息: " + (message != null ? message : "未提供") + "</p>");
        out.println("<a href=\"/myapp/request.html\">返回</a>");
        out.println("</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>RequestServlet</servlet-name>
        <servlet-class>RequestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RequestServlet</servlet-name>
        <url-pattern>/request</url-pattern>
    </servlet-mapping>
</web-app>

6. 部署与测试

部署

  1. 编译:
   javac -cp /path/to/tomcat/lib/servlet-api.jar RequestServlet.java
  1. .class 文件放入 myapp/WEB-INF/classes/
  2. request.html 放入 myapp/
  3. 部署 myapp 到Tomcat的 webapps 目录。
  4. 启动Tomcat。

测试

  • 访问:http://localhost:8080/myapp/request.html
  • 测试GET:输入ID并提交。
  • 测试POST:输入姓名和消息并提交。

7. 参考资料

出站链接

其他资源

  • 《Servlet Programming》 – HTTP请求章节。
  • X社区:搜索 #ServletHTTP 获取示例。

这篇指南展示了Servlet处理客户端HTTP请求的实现,包括GET和POST。如果需要更多内容(如PUT/DELETE、请求头处理或JSON响应),请告诉我!