本示例演示了如何使用 Servlet 的doPost()方法来处理 POST 请求

在我们以前的教程的 Java Servlet 实现示例中我展示了doGet()方法的使用。 现在,我将向您展示如何使用doPost()方法来处理表单 POST 提交。 Java Servlet 可以处理各种类型的请求。 下面的列表显示了所有方法及其用途

方法 SERVLET 方法 目的
GET doGet() 在指定的 URL 检索资源
HEAD doHead() 与 GET 相同,只返回标头
POST doPost() 通常用于 Web 表单提交
PUT doPut() 将提供的实体存储在 URL
DELETE doDelete() 删除 URL 标识的资源
OPTIONS doOptions() 返回允许的 HTTP 方法
TRACE doTrace() 用于诊断

项目结构

在我们的项目中,我们确实需要三个文件。pom.xml – 设置 Maven 依赖关系和构建属性,web.xml – 将 Servlet 和 Servlet 本身配置为 java 类

Java Servlet POST 示例 - 图1

Servlet POST 示例项目结构

pom.xml文件

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>net.javatutorial.tutorials</groupId>
  5. <artifactId>ServletPOSTExample</artifactId>
  6. <version>1</version>
  7. <packaging>war</packaging>
  8. <name>Servlet POST Example</name>
  9. <url>https://javatutorial.net</url>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>javax.servlet</groupId>
  16. <artifactId>javax.servlet-api</artifactId>
  17. <version>3.1.0</version>
  18. <scope>provided</scope>
  19. </dependency>
  20. </dependencies>
  21. <build>
  22. <finalName>servletpost</finalName>
  23. <sourceDirectory>src/main/java</sourceDirectory>
  24. <plugins>
  25. <plugin>
  26. <groupId>org.apache.maven.plugins</groupId>
  27. <artifactId>maven-war-plugin</artifactId>
  28. <version>2.3</version>
  29. <configuration>
  30. <warSourceDirectory>src/main/webapp</warSourceDirectory>
  31. </configuration>
  32. </plugin>
  33. <plugin>
  34. <groupId>org.apache.maven.plugins</groupId>
  35. <artifactId>maven-compiler-plugin</artifactId>
  36. <version>3.1</version>
  37. <configuration>
  38. <source>1.8</source>
  39. <target>1.8</target>
  40. </configuration>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>

与上一教程一样,我们将 Servlet 的依赖项javax.servlet-apimaven-war-plugin的依赖关系用于构建网络应用

web.xml文件中映射 Servlet

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. version="3.1">
  6. <display-name>Simple Servlet Application</display-name>
  7. <servlet>
  8. <servlet-name>servletPost</servlet-name>
  9. <servlet-class>net.javatutorial.tutorials.ServletPOST</servlet-class>
  10. <load-on-startup>1</load-on-startup>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>servletPost</servlet-name>
  14. <url-pattern>/welcome</url-pattern>
  15. </servlet-mapping>
  16. </web-app>

Servlet 被赋予一个名为ServletPost的名称,该名称指向 Java 类ServletPOST

在 servlet 映射中,我们将 url /welcome分配给 servlet

Servlet 类

  1. package net.javatutorial.tutorials;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. public class ServletPOST extends HttpServlet {
  9. private static final long serialVersionUID = -1641096228274971485L;
  10. @Override
  11. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  12. throws ServletException, IOException {
  13. // set response headers
  14. response.setContentType("text/html");
  15. response.setCharacterEncoding("UTF-8");
  16. // create HTML form
  17. PrintWriter writer = response.getWriter();
  18. writer.append("<!DOCTYPE html>\r\n")
  19. .append("<html>\r\n")
  20. .append(" <head>\r\n")
  21. .append(" <title>Form input</title>\r\n")
  22. .append(" </head>\r\n")
  23. .append(" <body>\r\n")
  24. .append(" <form action=\"welcome\" method=\"POST\">\r\n")
  25. .append(" Enter your name: \r\n")
  26. .append(" <input type=\"text\" name=\"user\" />\r\n")
  27. .append(" <input type=\"submit\" value=\"Submit\" />\r\n")
  28. .append(" </form>\r\n")
  29. .append(" </body>\r\n")
  30. .append("</html>\r\n");
  31. }
  32. @Override
  33. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  34. throws ServletException, IOException {
  35. String user = request.getParameter("user");
  36. response.setContentType("text/html");
  37. response.setCharacterEncoding("UTF-8");
  38. // create HTML response
  39. PrintWriter writer = response.getWriter();
  40. writer.append("<!DOCTYPE html>\r\n")
  41. .append("<html>\r\n")
  42. .append(" <head>\r\n")
  43. .append(" <title>Welcome message</title>\r\n")
  44. .append(" </head>\r\n")
  45. .append(" <body>\r\n");
  46. if (user != null && !user.trim().isEmpty()) {
  47. writer.append(" Welcome " + user + ".\r\n");
  48. writer.append(" You successfully completed this javatutorial.net example.\r\n");
  49. } else {
  50. writer.append(" You did not entered a name!\r\n");
  51. }
  52. writer.append(" </body>\r\n")
  53. .append("</html>\r\n");
  54. }
  55. }

在上面的代码中,doGet()方法用于显示表单。 客户端(浏览器)使用 GET 请求调用网址 http://yoururl.com:8080/servletpost/welcome ,它显示以下形式

Java Servlet POST 示例 - 图2

输入表单

该 servlet 在客户端的浏览器中呈现为 HTML,如下所示:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Form input</title>
  5. </head>
  6. <body>
  7. <form action="welcome" method="POST">
  8. Enter your name:
  9. <input type="text" name="user" />
  10. <input type="submit" value="Submit" />
  11. </form>
  12. </body>
  13. </html>

提交后,将调用 servlet 中的doPost()方法。 在这里,我们根据用户的输入来建立响应。 如果正确填写了姓名字段,则用户会收到问候消息

Java Servlet POST 示例 - 图3

响应后

…或警告消息(如果表单中的名称字段留空)

Java Servlet POST 示例 - 图4

如果缺少名称,则会出现错误消息

您可以在我们的 GitHub 存储库中找到项目源