Servlet 通过 HttpServletRequest
对象处理HTML表单提交的数据,支持GET和POST请求。本指南将展示如何获取表单数据并生成动态响应。
目录
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. 部署与测试
部署步骤
- 编译:
javac -cp /path/to/tomcat/lib/servlet-api.jar UserServlet.java
将 .class
文件放入 myapp/WEB-INF/classes/
。
- 添加HTML:将
form.html
放入myapp/
。 - 部署:将
myapp
放入Tomcat的webapps
目录。 - 启动Tomcat:
- Windows:
bin\startup.bat
- Linux/Mac:
bin/startup.sh
测试
- 访问:
http://localhost:8080/myapp/form.html
。 - 输入用户名和邮箱,分别测试GET和POST提交。
- 检查响应页面是否正确显示提交数据。
6. 常见问题与解决
- 中文乱码:在POST中添加:
request.setCharacterEncoding("UTF-8");
- 空值处理:检查
null
或空字符串:
if (username == null || username.trim().isEmpty()) { ... }
- 多值参数:使用
getParameterValues()
处理复选框等:
String[] hobbies = request.getParameterValues("hobby");
7. 参考资料
出站链接
- Servlet API – 官方规范。
- Tomcat文档 – 请求处理。
- Java EE教程 – 表单处理。
其他资源
- 《Head First Servlets and JSP》 – 表单处理章节。
- X社区:搜索 #ServletFormData 获取示例。
这篇指南提供了Servlet处理表单数据的完整流程。如果您需要更复杂的功能(如文件上传、JSON响应或数据库集成),请告诉我!
发表回复