杰瑞科技汇

Java Servlet 示例如何快速上手?

准备工作:开发环境

在开始之前,请确保您已经安装并配置好以下环境:

Java Servlet 示例如何快速上手?-图1
(图片来源网络,侵删)
  1. JDK (Java Development Kit): 版本 8 或更高。
  2. Servlet API: 如果您使用像 Eclipse 或 IntelliJ IDEA 这样的 IDE,通常可以自动管理,如果是手动构建,需要下载 servlet-api.jar
  3. Web 服务器: 最常用的是 Apache Tomcat,版本 9.x 或 10.x 都可以。
  4. 构建工具 (推荐): Maven 或 Gradle,用于管理项目依赖和构建 WAR 包,这里我们以 Maven 为例。

示例 1:第一个 Servlet - "Hello, World!"

这是一个最简单的 Servlet,它只响应一个 GET 请求,并在浏览器中显示 "Hello, World!"。

项目结构 (使用 Maven)

我们使用 Maven 的标准 Web 应用结构。

hello-servlet-app/
├── pom.xml                 // Maven 项目配置文件
└── src/
    └── main/
        ├── java/
        │   └── com/
        │       └── example/
        │           └── servlet/
        │               └── HelloServlet.java  // 我们的 Servlet 类
        ├── resources/
        └── webapp/
            ├── WEB-INF/
            │   └── web.xml                 // Servlet 部署描述符 (传统方式)
            └── index.html                  // 一个简单的首页

pom.xml 文件

这个文件定义了项目的依赖和构建配置。

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>hello-servlet-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging> <!-- 打包成 WAR 文件 -->
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!-- Servlet API 依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope> <!-- 由服务器提供,编译时需要,运行时不需要 -->
        </dependency>
    </dependencies>
    <build>
        <finalName>hello-servlet-app</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.2</version>
            </plugin>
        </plugins>
    </build>
</project>

HelloServlet.java 源代码

这是核心的 Servlet 类。

Java Servlet 示例如何快速上手?-图2
(图片来源网络,侵删)
package com.example.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
// 1. 继承 HttpServlet
public class HelloServlet extends HttpServlet {
    // 2. 重写 doGet 方法来处理 GET 请求
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 3. 设置响应内容类型为 HTML
        response.setContentType("text/html;charset=UTF-8");
        // 4. 获取 PrintWriter 对象,用于向客户端发送响应
        PrintWriter out = response.getWriter();
        // 5. 写入 HTML 内容
        out.println("<html>");
        out.println("<head><title>第一个 Servlet</title></head>");
        out.println("<body>");
        out.println("<h1>你好,世界!</h1>");
        out.println("<p>这是一个由 Java Servlet 生成的页面。</p>");
        out.println("</body>");
        out.println("</html>");
    }
    // 同样,可以重写 doPost 方法来处理 POST 请求
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response); // 通常让 doPost 调用 doGet
    }
}

web.xml 部署描述符

这个文件告诉 Web 服务器我们的 HelloServlet 类是什么,以及它应该处理哪个 URL。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- Servlet 声明 -->
    <servlet>
        <servlet-name>HelloWorld</servlet-name>    <!-- Servlet 的内部名称 -->
        <servlet-class>com.example.servlet.HelloServlet</servlet-class> <!-- Servlet 类的全限定名 -->
    </servlet>
    <!-- Servlet 映射 -->
    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name> <!-- 引用上面声明的 servlet-name -->
        <url-pattern>/hello</url-pattern>       <!-- 浏览器访问的 URL 路径 -->
    </servlet-mapping>
</web-app>

运行和测试

  1. 构建项目: 在项目根目录下运行 mvn clean package,这会在 target 目录下生成一个 hello-servlet-app.war 文件。
  2. 部署到 Tomcat:
    • 找到 Tomcat 的 webapps 目录。
    • 将生成的 hello-servlet-app.war 文件复制到 webapps 目录下。
    • 启动 Tomcat 服务器。
  3. 访问: 打开浏览器,访问 http://localhost:8080/hello-servlet-app/hello

预期结果: 您会看到一个标题为 "第一个 Servlet",内容为 "你好,世界!"的网页。


示例 2:处理表单数据

这个例子将创建一个 HTML 表单,用户可以在其中输入姓名,提交后由 Servlet 处理并显示一个个性化的欢迎消息。

修改 webapp/index.html

<!DOCTYPE html>
<html>
<head>表单提交示例</title>
</head>
<body>
    <h1>请输入您的姓名</h1>
    <form action="welcome" method="post">
        姓名: <input type="text" name="username">
        <input type="submit" value="提交">
    </form>
</body>
</html>
  • action="welcome": 指定表单提交到的 URL。
  • method="post": 使用 POST 方法提交数据。
  • name="username": 输入框的名称,Servlet 将通过这个名称获取数据。

创建 WelcomeServlet.java

package com.example.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class WelcomeServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        // 2. 获取表单数据
        // request.getParameter() 的参数 name 必须与 HTML input 的 name 属性一致
        String username = request.getParameter("username");
        // 3. 获取 PrintWriter 对象
        PrintWriter out = response.getWriter();
        // 4. 生成响应
        out.println("<html>");
        out.println("<head><title>欢迎页面</title></head>");
        out.println("<body>");
        if (username != null && !username.trim().isEmpty()) {
            out.println("<h1>欢迎您, " + username + "!</h1>");
        } else {
            out.println("<h1>您没有输入姓名。</h1>");
        }
        out.println("<a href='index.html'>返回</a>");
        out.println("</body>");
        out.println("</html>");
    }
}

修改 web.xml

添加 WelcomeServlet 的映射。

Java Servlet 示例如何快速上手?-图3
(图片来源网络,侵删)
<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
    <!-- HelloServlet 的映射保持不变 -->
    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>com.example.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <!-- 新增 WelcomeServlet 的声明和映射 -->
    <servlet>
        <servlet-name>WelcomeServlet</servlet-name>
        <servlet-class>com.example.servlet.WelcomeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>WelcomeServlet</servlet-name>
        <url-pattern>/welcome</url-pattern>
    </servlet-mapping>
</web-app>

重新部署和测试

  1. 重新构建并替换 webapps 目录下的 WAR 文件。
  2. 访问 http://localhost:8080/hello-servlet-app/index.html
  3. 在输入框中输入您的名字,点击 "提交"。
  4. 您将被带到 /welcome 页面,并看到个性化的欢迎消息。

示例 3:使用 HttpSession 进行会话管理

这个例子将记录用户访问网站的次数,每次刷新页面,访问次数都会增加,直到关闭浏览器。

创建 SessionServlet.java

package com.example.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class SessionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        // 1. 获取或创建 HttpSession 对象
        // 如果请求中已有 session,则返回它;否则,创建一个新的。
        HttpSession session = request.getSession();
        // 2. 从 session 中获取访问计数
        //getAttribute 返回 Object,需要类型转换
        Integer visitCount = (Integer) session.getAttribute("visitCount");
        // 3. 如果是第一次访问,visitCount 为 null
        if (visitCount == null) {
            visitCount = 1;
        } else {
            visitCount++;
        }
        // 4. 将新的访问计数存回 session
        session.setAttribute("visitCount", visitCount);
        // 5. 生成响应
        out.println("<html>");
        out.println("<head><title>会话示例</title></head>");
        out.println("<body>");
        out.println("<h1>欢迎回来!</h1>");
        out.println("<p>您是第 <strong>" + visitCount + "</strong> 次访问本页面。</p>");
        out.println("<p>Session ID: " + session.getId() + "</p>");
        out.println("<p>Session 创建时间: " + new java.util.Date(session.getCreationTime()) + "</p>");
        out.println("<p>Session 最后访问时间: " + new java.util.Date(session.getLastAccessedTime()) + "</p>");
        out.println("</body>");
        out.println("</html>");
    }
}

修改 web.xml

添加 SessionServlet 的映射。

<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
    <!-- ... 其他 servlet ... -->
    <!-- 新增 SessionServlet 的声明和映射 -->
    <servlet>
        <servlet-name>SessionServlet</servlet-name>
        <servlet-class>com.example.servlet.SessionServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionServlet</servlet-name>
        <url-pattern>/session</url-pattern>
    </servlet-mapping>
</web-app>

测试

  1. 重新部署应用。
  2. 访问 http://localhost:8080/hello-servlet-app/session
  3. 您会看到 "您是第 1 次访问本页面"。
  4. 刷新页面,计数会变成 2, 3, 4 ...
  5. 关闭浏览器,然后重新打开访问 /session,计数会重新从 1 开始,因为 HttpSession 默认依赖于浏览器的 Cookie,关闭浏览器后 Cookie 失效,Session 也就失效了。

现代 Servlet 开发 (注解方式)

从 Servlet 3.0 开始,推荐使用注解来代替 web.xml,使配置更简洁。

如何转换示例 1

  1. 删除 web.xml (可选,如果所有配置都使用注解)。
  2. 修改 HelloServlet.java:
package com.example.servlet;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
import java.io.IOException;
// 使用 @WebServlet 注解来替代 web.xml 中的 <servlet> 和 <servlet-mapping>
// urlPatterns 是一个数组,可以映射多个 URL
@WebServlet(urlPatterns = {"/hello", "/hello-world"})
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            out.println("<html><head><title>注解方式</title></head>");
            out.println("<body><h1>你好,世界!(注解版)</h1></body></html>");
        }
    }
}

您只需要将这个类部署到 Tomcat,就可以通过 /hello/hello-world 访问到它了,无需 web.xml

  • Servlet 生命周期: init() -> service() -> destroy()
  • 核心方法:
    • doGet(): 处理 GET 请求。
    • doPost(): 处理 POST 请求。
  • 核心对象:
    • HttpServletRequest: 代表客户端的请求,包含请求头、请求参数、Cookie 等。
    • HttpServletResponse: 代表服务器的响应,用于设置响应状态码、响应头、向客户端输出内容。
    • HttpSession: 用于在多个请求之间保存用户的状态信息。
  • 配置方式:
    • 传统方式: 在 web.xml 中进行声明和映射。
    • 现代方式: 使用 @WebServlet, @WebServlet 等注解,更简洁。

希望这些例子能帮助您理解 Java Servlet 的基本概念和用法!

分享:
扫描分享到社交APP
上一篇
下一篇