杰瑞科技汇

Java Servlet配置有哪些关键步骤?

核心概念:Servlet 容器

在配置之前,首先要明白 Servlet 是运行在 Servlet 容器 中的,常见的 Servlet 容器有:

Java Servlet配置有哪些关键步骤?-图1
(图片来源网络,侵删)
  • Tomcat: 最流行、使用最广泛的容器。
  • Jetty: 轻量级、高性能,常用于嵌入式系统。
  • WildFly/JBoss: 全功能的 Java EE 应用服务器。

Servlet 容器负责加载和管理 Servlet,处理网络请求,并将请求分发给正确的 Servlet 来处理。


传统 web.xml 部署描述符配置 (Servlet 2.5 及之前)

这是最早、最传统的配置方式,所有的配置信息都写在 WEB-INF/web.xml 文件中。

环境要求

  • Java Development Kit (JDK)
  • Servlet 容器 (如 Tomcat)
  • 一个支持 Servlet API 的项目结构。

项目结构

一个典型的 Java Web 项目结构如下:

my-webapp/
├── src/
│   └── com/
│       └── example/
│           └── MyFirstServlet.java
├── WEB-INF/
│   ├── web.xml          <-- 核心配置文件
│   └── lib/             <-- 存放依赖的 JAR 包
└── webapp/              <-- 静态资源 (HTML, CSS, JS)
    └── index.html

编写 Servlet 代码

Servlet 必须继承 HttpServlet 并重写 doGetdoPost 方法。

Java Servlet配置有哪些关键步骤?-图2
(图片来源网络,侵删)
// src/com/example/MyFirstServlet.java
package com.example;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyFirstServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应内容类型为 HTML
        response.setContentType("text/html;charset=UTF-8");
        // 获取输出流
        PrintWriter out = response.getWriter();
        // 向客户端输出内容
        out.println("<html>");
        out.println("<head><title>Hello Servlet</title></head>");
        out.println("<body>");
        out.println("<h1>你好,世界!这是通过 web.xml 配置的 Servlet。</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

配置 web.xml

这是配置的核心,你需要定义 Servlet 和 Servlet 映射。

<!-- 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 API 版本填写 -->
    <!-- 1. 定义 Servlet -->
    <servlet>
        <!-- Servlet 的逻辑名称,内部使用,可以任意取 -->
        <servlet-name>MyFirstServlet</servlet-name>
        <!-- Servlet 的全限定类名 (包名 + 类名) -->
        <servlet-class>com.example.MyFirstServlet</servlet-class>
    </servlet>
    <!-- 2. 将 Servlet 映射到一个 URL -->
    <servlet-mapping>
        <!-- 必须和上面定义的 <servlet-name> 一致 -->
        <servlet-name>MyFirstServlet</servlet-name>
        <!-- 访问这个 Servlet 的 URL 模式 -->
        <url-pattern>/hello</url-pattern>
        <!-- 可以映射多个 URL 模式 -->
        <!-- <url-pattern>/greet</url-pattern> -->
    </servlet-mapping>
</web-app>

部署和访问

  1. 将项目打包成 .war 文件。
  2. .war 文件放入 Tomcat 的 webapps 目录下。
  3. 启动 Tomcat。
  4. 在浏览器中访问 http://localhost:8080/你的项目名/hello,你就能看到 Servlet 输出的 HTML 内容。

使用注解配置 (Servlet 3.0 及之后)

从 Servlet 3.0 规范开始,引入了注解,这使得配置变得更加简洁和方便,目前这是 强烈推荐 的方式。

环境要求

  • JDK
  • Servlet 3.0 或更高版本 的容器 (如 Tomcat 7+)。
  • 支持 Java 5+ 的 IDE。

编写 Servlet 代码

代码基本相同,只是在类声明上添加 @WebServlet 注解。

// src/com/example/MyAnnotatedServlet.java
package com.example;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; // 导入注解
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// @WebServlet 注解替代了 web.xml 中的 <servlet> 和 <servlet-mapping>
@WebServlet(name = "MyAnnotatedServlet", urlPatterns = {"/annotated", "/greeting"})
public class MyAnnotatedServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>Annotation Servlet</title></head>");
        out.println("<body>");
        out.println("<h1>你好,世界!这是通过注解配置的 Servlet。</h1>");
        out.println("<p>你可以通过 /annotated 或 /greeting 访问我。</p>");
        out.println("</body>");
        out.println("</html>");
    }
}

web.xml 的变化

使用注解后,web.xml 文件就不再是必需的了,如果你的项目没有特殊的配置需求(比如欢迎页面、过滤器、监听器等),甚至可以完全删除 web.xml

Java Servlet配置有哪些关键步骤?-图3
(图片来源网络,侵删)

如果你需要保留 web.xml,那么注解配置和 web.xml 配置可以并存,但请注意,web.xml 中的配置会覆盖注解配置,这是一种常见的陷阱。

部署和访问

部署过程和方式一完全相同,访问 http://localhost:8080/你的项目名/annotatedhttp://localhost:8080/你的项目名/greeting 即可。


在 Spring Boot 中配置 Servlet

在现代的 Spring Boot 应用中,Servlet 的配置方式又有所不同,Spring Boot 采用 “约定优于配置”编程式配置 的思想。

环境要求

  • Spring Boot 项目 (通常通过 Spring Initializr 创建)。

编写 Servlet 代码

Servlet 类本身没有变化,依然是标准的 Java Servlet。

// src/main/java/com/example/demo/MySpringBootServlet.java
package com.example.demo;
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;
// 可以保留注解,但 Spring Boot 会通过编程方式注册它
@WebServlet(name = "MySpringBootServlet", urlPatterns = {"/spring"})
public class MySpringBootServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.getWriter().println("<h1>Hello from Servlet in Spring Boot!</h1>");
    }
}

编程式注册 Servlet

这是 Spring Boot 的关键步骤,你需要创建一个配置类,并使用 @Bean 方法来注册你的 Servlet。

// src/main/java/com/example/demo/ServletConfig.java
package com.example.demo;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ServletConfig {
    @Bean
    public ServletRegistrationBean<MySpringBootServlet> myServletRegistrationBean() {
        // 创建一个 ServletRegistrationBean
        // 参数1: 你的 Servlet 实例
        // 参数2: Servlet 的 URL 模式
        ServletRegistrationBean<MySpringBootServlet> registrationBean = 
            new ServletRegistrationBean<>(new MySpringBootServlet(), "/spring");
        // 可以设置 Servlet 的名称 (可选)
        registrationBean.setName("mySpringBootServlet");
        return registrationBean;
    }
}

注意: 如果你使用 @WebServlet 注解,Spring Boot 默认会自动扫描并注册 它,ServletConfig 类可能不是必需的,如果你想自定义注册顺序、初始化参数等,或者使用非注解方式编写的 Servlet,那么编程式注册就是必须的。

部署和访问

Spring Boot 应用通常打包成一个可执行的 JAR 文件,运行这个 JAR 文件后,应用会内嵌一个 Servlet 容器(默认是 Tomcat)。 访问 http://localhost:8080/spring 即可。


总结与对比

特性 web.xml 配置 注解 (@WebServlet) 配置 Spring Boot 编程式配置
出现版本 Servlet 2.3 及之前 Servlet 3.0 及之后 Spring Boot 框架
配置位置 WEB-INF/web.xml 文件 Java 类的注解 Java 配置类的 @Bean 方法
可读性 集中管理,但 XML 较繁琐 代码和配置在一起,简洁 代码和配置在一起,非常灵活
维护性 修改配置需重新打包部署 修改代码需重新编译打包 修改代码需重新编译打包
灵活性 较低,修改 XML 即可 较高,与 Java 代码耦合 最高,可以动态注册、设置依赖等
适用场景 遗留系统、严格的 XML 环境管理 现代 Java Web 应用的首选 Spring/Spring Boot 应用
依赖 任何 Servlet 容器 Servlet 3.0+ 容器 Spring Boot 框架

最佳实践建议

  1. 新项目一律使用注解 (@WebServlet):这是业界标准,简洁、直观,与代码紧密结合,避免了维护 web.xml 的麻烦。
  2. Spring Boot 项目使用编程式配置:虽然 Spring Boot 会自动注册带注解的 Servlet,但为了更明确地控制和管理(配置 Servlet 的初始化参数、映射多个 URL 模式、控制加载顺序等),推荐使用 ServletRegistrationBean 进行编程式注册,这种方式提供了最大的灵活性。
  3. web.xml 用于全局配置:如果你的项目中有多个 Servlet、Filter、Listener,并且它们之间有复杂的依赖关系,或者需要配置整个应用的全局属性(如会话超时、欢迎页面等),web.xml 仍然是一个有用的工具,可以将它看作是应用的“中央配置中心”。

希望这份详细的指南能帮助你完全理解 Java Servlet 的各种配置方式!

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