杰瑞科技汇

Java Servlet实例如何快速上手?

目录

  1. Servlet 简介
  2. 环境准备
    • JDK
    • Servlet 容器 (Tomcat)
    • IDE (IntelliJ IDEA 或 Eclipse)
    • 构建工具 (Maven - 强烈推荐)
  3. 第一个 Servlet - "Hello, World!"
    • 步骤 1: 创建 Maven Web 项目
    • 步骤 2: 添加 Servlet 依赖
    • 步骤 3: 编写 Servlet 代码
    • 步骤 4: 配置 web.xml
    • 步骤 5: 部署与运行
  4. 用户登录验证
    • 步骤 1: 创建 JSP 页面 (登录表单)
    • 步骤 2: 编写处理登录的 Servlet
    • 步骤 3: 创建登录成功/失败的 JSP 页面
    • 步骤 4: 配置 web.xml
    • 步骤 5: 运行测试
  5. 现代实践:使用注解配置 Servlet (Servlet 3.0+)

Servlet 简介

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 响应之间的中间层。

Java Servlet实例如何快速上手?-图1
(图片来源网络,侵删)

核心作用:

  • 接收并解析客户端(如浏览器)发送的 HTTP 请求。
  • 处理业务逻辑(查询数据库、计算数据)。
  • 生成动态内容。
  • 将响应发送回客户端。

生命周期: Servlet 的生命周期由容器(如 Tomcat)管理,主要包括三个阶段:

  1. 初始化 (init):当 Servlet 第一次被请求时,容器会调用其 init() 方法,该方法在整个生命周期中只执行一次。
  2. 处理请求 (service):对于每个请求,容器都会调用 service() 方法。service() 方法会根据请求的类型(GET, POST 等)调用相应的 doGet(), doPost(), doPut() 等方法。
  3. 销毁 (destroy):当 Web 应用被卸载或服务器关闭时,容器会调用 destroy() 方法,释放资源。

环境准备

在开始之前,请确保你已经安装并配置好以下软件:

  1. JDK (Java Development Kit): 版本 8 或更高版本。
  2. Servlet 容器: 我们使用 Apache Tomcat,这是最流行的 Servlet 容器之一,请下载并解压 Tomcat。
  3. IDE: 推荐 IntelliJ IDEA (社区版免费)Eclipse IDE for Enterprise Java and Web Developers
  4. 构建工具: Maven,Maven 可以帮助我们管理项目依赖(如 Servlet API)和构建流程,是现代 Java 项目的标准。

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

我们将创建一个简单的 Servlet,当访问特定 URL 时,它会在浏览器上显示 "Hello, World!"。

Java Servlet实例如何快速上手?-图2
(图片来源网络,侵删)

步骤 1: 创建 Maven Web 项目

在 IntelliJ IDEA 中:

  1. File -> New -> Project
  2. 选择 Maven,然后勾选 Create from archetype
  3. 在列表中找到并选择 maven-archetype-webapp,点击 Next
  4. 输入 GroupId (com.example) 和 ArtifactId (servlet-demo),点击 Finish

项目创建后,你会看到一个 src/main/webapp 目录,里面有一个 index.jsp 文件和一个 WEB-INF 目录。

步骤 2: 添加 Servlet 依赖

打开 pom.xml 文件,在 <dependencies> 标签内添加 Servlet API 的依赖,我们使用 provided scope,因为 Servlet API 会被 Tomcat 这样的容器在运行时提供。

<dependencies>
    <!-- Servlet API 依赖 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version> <!-- 使用较新的版本 -->
        <scope>provided</scope>
    </dependency>
</dependencies>

点击 IDEA 右下角的 "Load Maven Changes" 或让 IDEA 自动加载。

Java Servlet实例如何快速上手?-图3
(图片来源网络,侵删)

步骤 3: 编写 Servlet 代码

  1. src/main/java 目录下创建包,com.example.servlet
  2. 在该包下创建一个 Java 类 HelloServlet
package com.example.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
// 使用注解配置 (现代方式,后面会详细介绍)
@WebServlet(name = "HelloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
    // 处理 GET 请求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置响应内容类型为 HTML
        resp.setContentType("text/html;charset=UTF-8");
        // 获取 PrintWriter 对象,用于向客户端输出响应
        PrintWriter out = resp.getWriter();
        // 构造 HTML 响应
        out.println("<html>");
        out.println("<head><title>Hello Servlet</title></head>");
        out.println("<body>");
        out.println("<h1>Hello, World! from Servlet!</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

代码解释:

  • @WebServlet: 这是一个注解,用于将当前类声明为一个 Servlet。name 是 Servlet 的名称,urlPatterns 是一个 URL 模式数组,用于映射访问路径,访问 http://yourdomain/yourapp/hello 时就会触发这个 Servlet。
  • HttpServlet: 我们继承 HttpServlet,因为它提供了处理 HTTP 请求的基础功能。
  • doGet: 当 Servlet 收到 GET 请求时,这个方法会被调用。
  • resp.setContentType: 设置响应的 MIME 类型为 text/html,并指定字符集为 UTF-8,防止中文乱码。
  • resp.getWriter(): 获取一个 PrintWriter 对象,我们可以用它来向浏览器写入文本内容。

步骤 4: 配置 web.xml (传统方式)

虽然我们上面用了注解,但了解一下传统的 web.xml 配置方式也很重要,如果你的项目是 Servlet 3.0 之前版本,或者团队有规范要求,就需要在 src/main/webapp/WEB-INF/web.xml 中配置。

<?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>HelloServlet</servlet-name>
        <servlet-class>com.example.servlet.HelloServlet</servlet-class>
    </servlet>
    <!-- Servlet 映射 -->
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

注意:如果你使用了 @WebServlet 注解,并且你的 Tomcat 版本支持(3.0+),web.xml 中的这部分配置就可以省略,注解方式是更现代和推荐的做法。

步骤 5: 部署与运行

  1. 配置 Tomcat:

    • 在 IntelliJ IDEA 中,点击右上角的 "Add Configuration"。
    • 点击 号,选择 Tomcat Server -> Local
    • 在 "Deployment" 标签页,点击 号,选择 Artifact,然后选择你的 servlet-demo:war exploded
    • 在 "Server" 标签页,配置 Tomcat 的路径(如果你之前下载并解压了 Tomcat,可以点击 Configure 添加)。
    • 点击 OK 保存配置。
  2. 运行:

    • 点击绿色的 "Run" 按钮。
    • IDEA 会启动 Tomcat 并部署你的应用,浏览器会自动打开 http://localhost:8080/servlet-demo/ (这是默认的 index.jsp)。
  3. 测试:

    • 在浏览器地址栏输入: http://localhost:8080/servlet-demo/hello
    • 你应该能看到页面显示 "Hello, World! from Servlet!"。

实例二:用户登录验证

这个例子将展示 Servlet 如何处理表单数据、进行逻辑判断,并转发到不同的页面。

步骤 1: 创建 JSP 页面 (登录表单)

src/main/webapp 目录下创建 login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>登录页面</title>
</head>
<body>
    <h2>用户登录</h2>
    <%-- 如果有错误信息,显示出来 --%>
    <% if (request.getAttribute("error") != null) { %>
        <p style="color: red;"><%= request.getAttribute("error") %></p>
    <% } %>
    <form action="login" method="post">
        用户名: <input type="text" name="username"><br>
        密码:   <input type="password" name="password"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

步骤 2: 编写处理登录的 Servlet

com.example.servlet 包下创建 LoginServlet

package com.example.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 获取表单提交的参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        // 2. 简单的验证逻辑 (实际项目中应该查询数据库)
        if ("admin".equals(username) && "password123".equals(password)) {
            // 登录成功,将用户名存入 session
            req.getSession().setAttribute("user", username);
            // 转发到欢迎页面
            req.getRequestDispatcher("welcome.jsp").forward(req, resp);
        } else {
            // 登录失败,设置错误信息并转发回登录页面
            req.setAttribute("error", "用户名或密码错误!");
            req.getRequestDispatcher("login.jsp").forward(req, resp);
        }
    }
}

代码解释:

  • doPost: 处理 POST 请求(通常由表单提交触发)。
  • req.getParameter(): 获取表单中 name 属性为 usernamepassword 的输入值。
  • req.getRequestDispatcher().forward(): 请求转发,服务器端的行为,将请求从一个组件(Servlet)传递到另一个组件(JSP),客户端的 URL 不会改变。
  • req.getSession().setAttribute(): 将用户信息存入 HttpSession 对象,这样用户在整个会话期间都可以访问,实现登录状态保持。

步骤 3: 创建登录成功/失败的 JSP 页面

src/main/webapp 下创建 welcome.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page session="true" %>
<html>
<head>欢迎页面</title>
</head>
<body>
    <h2>欢迎, <%= session.getAttribute("user") %>!</h2>
    <p>您已成功登录。</p>
    <a href="logout">退出登录</a>
</body>
</html>

为了完善功能,我们再创建一个简单的退出 Servlet。

LogoutServlet.java:

package com.example.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession(false); // false表示如果不存在session则不创建
        if (session != null) {
            session.invalidate(); // 销毁session
        }
        resp.sendRedirect("login.jsp"); // 重定向到登录页
    }
}

步骤 4: 配置 web.xml (如果需要)

在这个例子中,我们全部使用了注解 @WebServlet,所以不需要修改 web.xmllogin.jsp 作为首页,通常可以在 Tomcat 配置或 web.xml 中设置欢迎列表。

<!-- 在 web.xml 中添加欢迎列表 -->
<welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
</welcome-file-list>

这样,当访问 http://localhost:8080/servlet-demo/ 时,会自动跳转到 login.jsp

步骤 5: 运行测试

  1. 确保你的 Tomcat 配置中部署了项目。
  2. 启动 Tomcat。
  3. 访问 http://localhost:8080/servlet-demo/,会看到登录页面。
  4. 输入错误的用户名/密码,会看到错误提示。
  5. 输入正确的用户名 admin 和密码 password123,会跳转到欢迎页面。
  6. 点击 "退出登录",会销毁 session 并返回登录页面。

现代实践:使用注解配置 Servlet (Servlet 3.0+)

从 Servlet 3.0 规范开始,引入了注解来简化配置,我们已经在前面的例子中大量使用了 @WebServlet

主要注解:

  • @WebServlet: 用于声明一个 Servlet。

    • name: Servlet 名称。
    • urlPatterns: URL 映射模式数组。
    • value: urlPatterns 的简写,但不能同时使用 valueurlPatterns
    • loadOnStartup: Servlet 的加载顺序(整数),值越小越先加载,负数表示在第一次请求时加载。
  • @WebListener: 用于声明一个监听器(如 ServletContextListener, HttpSessionListener)。

  • @WebFilter: 用于声明一个过滤器。

优点:

  • 配置简化: 无需在 web.xml 中进行繁琐的 XML 配置。
  • 类型安全: 编译器可以检查注解的正确性。
  • 内聚性: Servlet 的类信息和其配置信息在同一个文件中,更易于维护。

通过这两个实例,你应该已经掌握了 Java Servlet 的核心概念和基本用法:

  1. 创建 Servlet: 继承 HttpServlet 并重写 doGetdoPost 方法。
  2. 配置映射: 使用 @WebServlet 注解或 web.xml 将 URL 映射到 Servlet。
  3. 处理请求: 使用 HttpServletRequest 获取请求参数、请求头等信息。
  4. 生成响应: 使用 HttpServletResponse 设置响应类型、状态码,并输出响应体。
  5. 数据共享: 使用 request (一次请求内)、session (一次会话内) 和 ServletContext (整个应用生命周期内) 对象在不同组件间共享数据。
  6. 导航: 使用 forward (请求转发) 和 sendRedirect (重定向) 将用户引导到不同的页面。

虽然现代 Web 开发中,Spring MVC 等框架因其更强大的功能(如 IoC, AOP, RESTful 支持)已成为主流,但 Servlet 依然是 Java Web 技术的基石,理解 Servlet 的工作原理对于学习任何 Java Web 框架都至关重要。

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