Spring Boot Web入门:从零开始构建web程序

Spring Boot作为当前Java领域最流行的框架之一,极大地简化了Spring应用的初始搭建和开发过程。本文将带你从零开始,创建一个简单的Spring Boot Web应用,并通过详细的步骤解释整个过程。

一、Spring Boot简介

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。它具有以下特点:

  • 自动配置:基于类路径和已配置的bean自动配置Spring应用

  • 起步依赖:提供了一系列"starter"依赖,简化Maven/Gradle配置

  • 内嵌服务器:默认内嵌Tomcat、Jetty或Undertow,无需部署WAR文件

  • 生产就绪:提供健康检查、指标、外部化配置等生产级功能

二、创建Spring Boot项目

我们使用IDE创建:

以IntelliJ IDEA为例:

  1. 打开IDEA,选择"New Project"

  2. 选择"Spring Initializr"

  3. 填写项目信息(记得选Maven,这里我默认你之前已经配置了,没有的话要去配置)

  4. 选择依赖(勾选Spring Web)

  5. 完成创建

三、项目结构说明

创建完成后,项目结构如下:

text

复制代码
demo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com.niuniu/
│   │   │       └── DemoApplication.java  # 主启动类
│   │   └── resources/
│   │       ├── static/                   # 静态资源
│   │       ├── templates/                # 模板文件
│   │       └── application.properties    # 配置文件
│   └── test/                             # 测试代码
├── pom.xml                              # Maven配置文件
└── README.md

四、编写第一个控制器

创建控制器类

src/main/java/com/niuniu/目录下创建HelloController.java

java 复制代码
package com.niuniu;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    
    // 使用@GetMapping更明确地表示处理GET请求
    @GetMapping("/hello")
    public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
        System.out.println("Received request with name: " + name);
        
        // 简单业务逻辑示例
        String greeting = "Hello " + name + "!";
        
        // 可以添加更多业务逻辑
        if ("Spring".equalsIgnoreCase(name)) {
            greeting += " Welcome to Spring Boot!";
        }
        
        return greeting;
    }
    
    // 添加第二个端点作为示例
    @GetMapping("/greet")
    public String greet(@RequestParam(value = "user", required = false) String user) {
        if (user == null || user.trim().isEmpty()) {
            return "Hello Anonymous User!";
        }
        return "Good day, " + user + "!";
    }
}

1. 添加主页

创建简单的HTML主页,在src/main/resources/static目录下创建index.html

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Spring Boot 大角猫start</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 40px;
            background-color: #f5f5f5;
        }
        .container {
            max-width: 800px;
            margin: 0 auto;
            background-color: white;
            padding: 30px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }
        h1 {
            color: #2c3e50;
        }
        .endpoint {
            background-color: #f8f9fa;
            padding: 15px;
            border-left: 4px solid #3498db;
            margin: 20px 0;
        }
    </style>
</head>
<body>
<div class="container">
    <h1>Spring Boot Web-作者:大角猫ljp</h1>
    <p>这是一个简单的Spring Boot Web应用程序,大角猫ljp在此创建。</p>

    <h2>可用端点:</h2>

    <div class="endpoint">
        <h3>打招呼接口</h3>
        <p><strong>URL:</strong> <code>/hello?name=YourName</code></p>
        <p><strong>示例:</strong> <a href="/hello?name=大角猫ljp" target="_blank">/hello?name=大角猫ljp</a></p>
    </div>

    <div class="endpoint">
        <h3>问候接口</h3>
        <p><strong>URL:</strong> <code>/greet?user=UserName</code></p>
        <p><strong>示例:</strong> <a href="/greet?user=大角猫ljp" target="_blank">/greet?user=大角猫ljp</a></p>
    </div>
</div>
</body>
</html>

五、运行应用程序

方式1:通过主类运行

找到主启动类DemoApplication.java

java 复制代码
package com.niuniu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//启动类
@SpringBootApplication
public class SpringbootQuickstartApplication {

    public static void main(String[] args) {

        SpringApplication.run(SpringbootQuickstartApplication.class, args);
    }

}

六、测试应用

1. 验证应用是否启动

启动成功后,控制台会显示类似信息:

2. 测试端点

打开浏览器输入 http://localhost:8080/

测试:使用默认值

text

复制代码
http://localhost:8080/hello

响应:Hello World!

测试:测试第二个端点

text

复制代码
http://localhost:8080/greet?user=Developer

响应:Good day, Developer!

七、配置与应用

1. 修改端口号

src/main/resources/application.properties中添加

2. 添加日志配置

application.properties中添加日志配置

3. 完整的application.properties示例

properties

复制代码
# 应用基本信息
spring.application.name=demo-app

# 服务器配置
server.port=8080
server.servlet.context-path=/

# 日志配置
logging.level.root=WARN
logging.level.com.niuniu=INFO

# 热部署配置(开发环境)
spring.devtools.restart.enabled=true
spring.devtools.restart.additional-paths=src/main/java

八、项目扩展

添加错误处理

创建全局异常处理:

java 复制代码
package com.niuniu.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String handleAllExceptions(Exception ex) {
        return "服务器内部错误: " + ex.getMessage();
    }
}

添加单元测试

src/test/java/com/niuniu/目录下创建测试类:

java 复制代码
package com.niuniu;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest
@AutoConfigureMockMvc
class HelloControllerTest {
    
    @Autowired
    private MockMvc mockMvc;
    
    @Test
    void helloEndpoint_shouldReturnGreeting() throws Exception {
        mockMvc.perform(get("/hello").param("name", "Spring"))
                .andExpect(status().isOk())
                .andExpect(content().string("Hello Spring! Welcome to Spring Boot!"));
    }
    
    @Test
    void helloEndpoint_withoutName_shouldUseDefault() throws Exception {
        mockMvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string("Hello World!"));
    }
}

九、部署与打包

1. 构建可执行JAR

Spring Boot默认打包为可执行JAR,包含所有依赖和内嵌服务器:

bash

复制代码
# 清理并打包
mvn clean package

# 查看生成的文件
ls -la target/*.jar

2. 运行打包的应用

bash

复制代码
java -jar target/demo-0.0.1-SNAPSHOT.jar

# 指定运行参数
java -jar target/demo-0.0.1-SNAPSHOT.jar --server.port=8081

3. 构建Docker镜像

创建Dockerfile:

dockerfile

复制代码
FROM openjdk:17-jdk-slim
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EXPOSE 8080

构建和运行:

bash

复制代码
# 构建镜像
docker build -t spring-boot-demo .

# 运行容器
docker run -p 8080:8080 spring-boot-demo

十、常见问题与解决方案

1. 端口被占用

问题 :启动时报端口被占用
解决 :修改application.properties中的端口或停止占用端口的进程

2. 依赖下载失败

问题 :Maven依赖下载失败
解决

  • 检查网络连接

  • 使用国内镜像源(如阿里云Maven镜像)

  • 清理本地仓库后重试

3. 热部署不生效

问题 :修改代码后需要重启应用
解决

  • 确认添加了spring-boot-devtools依赖

  • 检查IDE自动编译配置

  • 重启IDE或重新导入项目

总结

通过本文,我们完成了以下内容:

  1. 了解了Spring Boot的基本概念和优势

  2. 学会了创建Spring Boot项目的多种方法

  3. 编写了一个简单的REST控制器

  4. 掌握了Spring Boot应用的运行、测试和配置

  5. 学习了项目扩展和部署的基本知识

这个简单的"Hello"应用虽然基础,但它包含了Spring Boot Web开发的核心要素。从这里出发,你可以继续学习:

  • Spring Data JPA进行数据库操作

  • Spring Security添加安全认证

  • Spring Cloud构建微服务

  • RESTful API设计最佳实践

Spring Boot的强大之处在于它的"约定优于配置"理念,让你能够快速搭建生产级应用。希望这个入门指南能帮助你开启Spring Boot开发之旅!

相关推荐
苏三说技术11 分钟前
xxl-job 和 elastic-job,哪个更好?
后端
xkxnq12 分钟前
第五阶段:Vue3核心深度深挖(第74天)(Vue3计算属性进阶)
前端·javascript·vue.js
三小河19 分钟前
Agent Skill与Rules的区别——以Cursor为例
前端·javascript·后端
Hilaku26 分钟前
不要在简历上写精通 Vue3?来自面试官的真实劝退
前端·javascript·vue.js
三小河32 分钟前
前端视角详解 Agent Skill
前端·javascript·后端
牛奔41 分钟前
Go 是如何做抢占式调度的?
开发语言·后端·golang
Aniugel1 小时前
单点登录(SSO)系统
前端
颜酱1 小时前
二叉树遍历思维实战
javascript·后端·算法
鹏多多1 小时前
移动端H5项目,还需要react-fastclick解决300ms点击延迟吗?
前端·javascript·react.js
serioyaoyao1 小时前
上万级文件一起可视化,怎么办?答案是基于 ParaView 的远程可视化
前端