Servlet 通过 HttpServletRequest 对象处理HTML表单提交的数据,支持GET和POST请求。本指南将展示如何获取表单数据并生成动态响应。


目录

  1. 表单数据简介
  2. 处理GET请求数据
  3. 处理POST请求数据
  4. 综合示例
  5. 部署与测试
  6. 常见问题与解决
  7. 参考资料

1. 表单数据简介

  • 来源:HTML表单通过 <form> 标签提交数据。
  • 方法
  • GET:数据附加在URL中,适合简单查询。
  • POST:数据在请求体中,适合敏感或大数据。
  • 获取方法request.getParameter(name) 返回表单字段值。

2. 处理GET请求数据

GET请求将表单数据编码为URL查询字符串(如 ?key1=value1&key2=value2)。

示例代码:GetServlet.java

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

public class GetServlet 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 username = request.getParameter("username");
        String email = request.getParameter("email");

        out.println("<html><body>");
        out.println("<h1>GET 请求数据</h1>");
        out.println("<p>用户名: " + (username != null ? username : "未填写") + "</p>");
        out.println("<p>邮箱: " + (email != null ? email : "未填写") + "</p>");
        out.println("</body></html>");
    }
}

HTML表单

<form method="GET" action="/myapp/get">
    用户名: <input type="text" name="username"><br>
    邮箱: <input type="text" name="email"><br>
    <input type="submit" value="提交">
</form>

3. 处理POST请求数据

POST请求将数据放在HTTP请求体中,适合提交复杂或私密信息。

示例代码:PostServlet.java

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

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

        String username = request.getParameter("username");
        String email = request.getParameter("email");

        out.println("<html><body>");
        out.println("<h1>POST 请求数据</h1>");
        out.println("<p>用户名: " + (username != null ? username : "未填写") + "</p>");
        out.println("<p>邮箱: " + (email != null ? email : "未填写") + "</p>");
        out.println("</body></html>");
    }
}

HTML表单

<form method="POST" action="/myapp/post">
    用户名: <input type="text" name="username"><br>
    邮箱: <input type="text" name="email"><br>
    <input type="submit" value="提交">
</form>

4. 综合示例

以下是一个支持GET和POST的Servlet,结合表单页面。

HTML:form.html

<!DOCTYPE html>
<html>
<head><title>用户信息</title></head>
<body>
    <h2>GET 提交</h2>
    <form method="GET" action="/myapp/user">
        用户名: <input type="text" name="username"><br>
        邮箱: <input type="text" name="email"><br>
        <input type="submit" value="GET提交">
    </form>

    <h2>POST 提交</h2>
    <form method="POST" action="/myapp/user">
        用户名: <input type="text" name="username"><br>
        邮箱: <input type="text" name="email"><br>
        <input type="submit" value="POST提交">
    </form>
</body>
</html>

Servlet:UserServlet.java

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

public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        handleRequest(request, response, "GET");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        handleRequest(request, response, "POST");
    }

    private void handleRequest(HttpServletRequest request, HttpServletResponse response, String method)
            throws IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String username = request.getParameter("username");
        String email = request.getParameter("email");

        out.println("<html><body>");
        out.println("<h1>" + method + " 提交结果</h1>");
        out.println("<p>用户名: " + (username != null && !username.isEmpty() ? username : "未填写") + "</p>");
        out.println("<p>邮箱: " + (email != null && !email.isEmpty() ? email : "未填写") + "</p>");
        out.println("<a href=\"/myapp/form.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>UserServlet</servlet-name>
        <servlet-class>UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>UserServlet</servlet-name>
        <url-pattern>/user</url-pattern>
    </servlet-mapping>
</web-app>

5. 部署与测试

部署步骤

  1. 编译
   javac -cp /path/to/tomcat/lib/servlet-api.jar UserServlet.java

.class 文件放入 myapp/WEB-INF/classes/

  1. 添加HTML:将 form.html 放入 myapp/
  2. 部署:将 myapp 放入Tomcat的 webapps 目录。
  3. 启动Tomcat
  • Windows:bin\startup.bat
  • Linux/Mac:bin/startup.sh

测试

  1. 访问:http://localhost:8080/myapp/form.html
  2. 输入用户名和邮箱,分别测试GET和POST提交。
  3. 检查响应页面是否正确显示提交数据。

6. 常见问题与解决

  • 中文乱码:在POST中添加:
  request.setCharacterEncoding("UTF-8");
  • 空值处理:检查 null 或空字符串:
  if (username == null || username.trim().isEmpty()) { ... }
  • 多值参数:使用 getParameterValues() 处理复选框等:
  String[] hobbies = request.getParameterValues("hobby");

7. 参考资料

出站链接

其他资源

  • 《Head First Servlets and JSP》 – 表单处理章节。
  • X社区:搜索 #ServletFormData 获取示例。

这篇指南提供了Servlet处理表单数据的完整流程。如果您需要更复杂的功能(如文件上传、JSON响应或数据库集成),请告诉我!