杰瑞科技汇

Java Web服务如何构建与高效运行?

我们将主要关注当前最主流、最高效的两种方式:

Java Web服务如何构建与高效运行?-图1
(图片来源网络,侵删)
  1. Spring Boot: 极大地简化了 Java Web 应用的创建和开发,是目前的事实标准。
  2. 传统 Servlet (使用 Maven/Gradle): 这是 Java Web 开发的传统方式,有助于理解底层原理,适合学习。

核心概念

在开始之前,先理解几个核心概念:

  • Web 服务: 在网络上运行的软件,通过标准的 Web 协议(主要是 HTTP)提供服务,它可以返回 HTML 页面(传统 Web 应用),也可以返回 JSON/XML 数据(现代 RESTful API)。
  • Servlet: Java EE(现在是 Jakarta EE)的核心技术,它是一个 Java 类,运行在 Web 服务器(如 Tomcat)中,用于接收和响应来自客户端的 HTTP 请求,你可以把它看作是处理 HTTP 请求的“处理器”。
  • Web 服务器 / Servlet 容器: 一个能运行和管理的 Java Web 应用(包括 Servlet)的程序,常见的有:
    • Tomcat: 最流行、轻量级的开源 Servlet 容器。
    • Jetty: 另一个轻量级、高性能的选择。
    • Undertow: 由 WildFly 提供的高性能服务器。
  • 构建工具: 用于自动化项目的编译、测试、打包、依赖管理等。
    • Maven: 最老牌、最成熟的工具,使用 XML 配置。
    • Gradle: 更现代的工具,使用 Groovy/Kotlin DSL,构建速度更快,配置更灵活。
  • 依赖管理: 管理项目所需的外部库(JAR 包),Maven 和 Gradle 都内置了强大的依赖管理功能,会自动从中央仓库下载所需的依赖。

使用 Spring Boot (推荐)

Spring Boot 的核心理念是“约定优于配置”,它通过“起步依赖”(Starters)自动为你配置好所需的一切,让你可以专注于业务逻辑。

项目创建

最简单的方式是使用 Spring Initializr (https://start.spring.io/)。

  • Project: 选择 MavenGradle
  • Language: Java
  • Spring Boot: 选择一个稳定的版本(如 3.x.x)。
  • Project Metadata:
    • Group: com.example
    • Artifact: demo-web-service
    • Name: demo-web-service
    • Packaging: Jar (Spring Boot 通常打包成可执行的 JAR)
    • Java: 选择你的 JDK 版本 (17 或 21 是目前主流)。
  • Dependencies: 添加必要的依赖。
    • Spring Web: 提供构建 Web 应用(包括 RESTful API)和 RESTful 服务所需的一切,它内嵌了 Tomcat 服务器。
    • Spring Boot DevTools: 提供开发时的自动重启和实时加载功能,提高开发效率。

点击 "GENERATE" 下载项目 ZIP 包,并用你的 IDE(如 IntelliJ IDEA 或 Eclipse)打开。

Java Web服务如何构建与高效运行?-图2
(图片来源网络,侵删)

编写代码

Spring Boot 使用注解来简化配置,我们将创建一个简单的 REST 控制器来处理 HTTP 请求。

src/main/java/com/example/demo/web/service/ 目录下,创建 HelloController.java 文件:

package com.example.demo.web.service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
// @RestController 是一个组合注解,相当于 @Controller + @ResponseBody
// 它告诉 Spring 这个类中的所有方法都返回的数据直接写入 HTTP 响应体中,而不是解析为视图名。
@RestController
public class HelloController {
    // @GetMapping 注解将 HTTP GET 请求映射到该方法上
    // value = "/hello" 定义了请求的路径
    // @RequestParam 将查询参数 "name" 绑定到方法的 "name" 参数上,defaultValue 提供了默认值
    @GetMapping("/hello")
    public String sayHello(@RequestParam(value = "name", defaultValue = "World") String name) {
        return String.format("Hello, %s!", name);
    }
}

运行 Web 服务

Spring Boot 应用非常简单,可以直接作为独立应用程序运行。

在 IDE 中,找到 DemoWebServiceApplication.java(通常在 src/main/java/com/example/demo/web/service/ 目录下),这是一个带有 @SpringBootApplication 注解的主类,右键点击它,选择 "Run"。

Java Web服务如何构建与高效运行?-图3
(图片来源网络,侵删)

或者,在项目根目录下,通过命令行运行 Maven 或 Gradle 命令:

  • Maven:
    ./mvnw spring-boot:run
  • Gradle:
    ./gradlew bootRun

验证服务

服务启动后,控制台会显示类似 "Tomcat started on port(s): 8080 (http)" 的信息。

打开你的浏览器或使用 API 工具(如 Postman、curl),访问以下 URL:

  • http://localhost:8080/hello
    • 响应: Hello, World!
  • http://localhost:8080/hello?name=Java
    • 响应: Hello, Java!

打包与独立运行

当你需要将应用部署到服务器时,可以将其打包成一个可执行的 JAR 文件。

  • Maven:

    ./mvnw clean package

    这会在 target/ 目录下生成一个 demo-web-service-0.0.1-SNAPSHOT.jar 文件。

  • Gradle:

    ./gradlew clean build

    这会在 build/libs/ 目录下生成一个 JAR 文件。

你可以在任何安装了 Java 运行时环境的机器上运行这个 JAR 文件:

# java -jar <你的jar文件名>
java -jartarget/demo-web-service-0.0.1-SNAPSHOT.jar

这个 JAR 文件是“胖 JAR”(Fat JAR),它包含了所有依赖和内嵌的 Tomcat 服务器,因此可以独立运行。


传统 Servlet 方式 (Maven + Tomcat)

这种方式更接近 Java Web 的传统工作方式,需要手动配置 Servlet 和 Web 服务器。

项目创建

使用你的 IDE 创建一个 "Maven Web App" 项目,这会自动生成一个标准的 Web 应用目录结构:

my-web-app/
├── pom.xml              // Maven 配置文件
└── src/
    └── main/
        ├── java/        // Java 源代码
        ├── resources/   // 配置文件、资源
        └── webapp/      // Web 内容
            ├── WEB-INF/
            │   └── web.xml  // 部署描述符,核心配置文件
            └── index.jsp    // 默认首页

配置 pom.xml

添加 Servlet API 的依赖,我们使用 provided 作用域,因为 Tomcat 服务器会提供这些类,我们只需要在编译时使用它们。

<dependencies>
    <!-- Servlet API -->
    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>5.0.0</version> <!-- 版本号根据你的 Tomcat 版本调整 -->
        <scope>provided</scope>
    </dependency>
</dependencies>

编写 Servlet

src/main/java 下创建你的包和 Servlet 类。

package com.example.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
// @WebServlet 注解替代了 web.xml 中的配置
// 它直接将 URL 模式 "/servlet/hello" 映射到这个 Servlet
@WebServlet("/servlet/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");
        // 获取请求参数
        String name = req.getParameter("name");
        if (name == null || name.isEmpty()) {
            name = "Servlet World";
        }
        // 向响应写入内容
        resp.getWriter().println("<h1>Hello from a traditional Servlet!</h1>");
        resp.getWriter().println("<p>Hello, " + name + "!</p>");
    }
}

打包与部署

传统 Web 应用被打包成 WAR (Web Application Archive) 文件。

  • 配置 pom.xml: 确保你的 pom.xml 中的 packaging 标签是 war
    <packaging>war</packaging>
  • 配置 Tomcat Maven 插件 (可选但推荐): 这可以让你直接在 Maven 中部署和运行应用。
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <path>/myapp</path> <!-- 访问路径 -->
                    <port>8080</port>  <!-- 端口 -->
                </configuration>
            </plugin>
        </plugins>
    </build>
  • 打包: 运行 Maven 命令生成 WAR 文件。
    ./mvnw clean package

    这会在 target/ 目录下生成 my-web-app.war 文件。

运行与验证

方式 A: 使用 IDE 集成 Tomcat 在 IDE(如 IntelliJ IDEA)中,添加一个 Tomcat Server 实例,并将你的 Web 应用部署到这个实例上,然后启动服务器。

方式 B: 使用独立的 Tomcat 服务器

  1. 下载并解压一个 Tomcat 服务器(Apache Tomcat 9 或 10)。
  2. 将上面生成的 my-web-app.war 文件复制到 Tomcat 的 webapps 目录下。
  3. 进入 Tomcat 的 bin 目录,运行 startup.sh (Linux/macOS) 或 startup.bat (Windows) 来启动服务器。
  4. 访问 URL: http://localhost:8080/myapp/servlet/hello?name=Java
    • 响应: 一个 HTML 页面,显示 "Hello from a traditional Servlet!" 和 "Hello, Java!"。

总结与对比

特性 Spring Boot 传统 Servlet (Maven + Tomcat)
核心思想 约定优于配置,快速启动 灵活配置,显式控制
项目结构 标准化的 Maven/Gradle 项目 标准的 Maven Web App 项目结构
配置方式 注解 (@RestController, @GetMapping) 和 application.properties XML (web.xml) 和注解 (@WebServlet)
打包方式 可执行 JAR (内嵌服务器) WAR (部署到外部服务器)
服务器 内嵌 (Tomcat, Jetty, Undertow) 外部 (需要单独安装和配置 Tomcat 等)
依赖管理 通过 "Starters" 自动配置 手动添加依赖,需注意版本兼容性
学习曲线 低,入门快,适合快速开发 中,需要理解 Servlet 容器和配置,适合学习底层原理
适用场景 微服务、现代 Web 应用、快速原型 传统企业应用、需要深度定制服务器环境、学习 Java Web 基础

给初学者的建议:

  • 直接从 Spring Boot 开始,它能让你快速体验到构建和运行 Java Web 服务的乐趣,而不是陷入繁琐的配置中。
  • 当你对 Spring Boot 比较熟悉后,可以尝试传统 Servlet 方式,这能帮助你理解 Web 服务背后的工作原理,比如请求是如何被服务器接收并分发给 Servlet 的,这对于解决复杂问题和进行底层优化非常有帮助。
分享:
扫描分享到社交APP
上一篇
下一篇