Spring Boot + Spring MVC 项目结构

下面一个既能返回 JSP 页面,又能提供 JSON APISpring Boot + Spring MVC 项目结构 ,这样你就能同时用到 @Controller@RestController 的优势。


🏗 项目结构

复制代码
springboot-mvc-mixed/
├── src/main/java/com/example/demo/
│   ├── controller/
│   │   ├── PageController.java       // 返回 JSP 页面
│   │   └── ApiController.java        // 返回 JSON 数据
│   └── DemoApplication.java          // 启动类
├── src/main/resources/
│   └── application.properties
└── src/main/webapp/WEB-INF/views/
    ├── home.jsp
    └── about.jsp

⚙ Maven 依赖(pom.xml

Spring Boot 默认不强推 JSP,所以需要额外加 tomcat-embed-jasperjstl

xml 复制代码
<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- JSP 支持 -->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
</dependencies>

<packaging>war</packaging>

🧩 配置(application.properties

properties 复制代码
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
server.port=8080

🖥 控制器示例

1. 返回 JSP 页面(@Controller

java 复制代码
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class PageController {

    @GetMapping("/")
    public String home() {
        return "home"; // 对应 /WEB-INF/views/home.jsp
    }

    @GetMapping("/about")
    public String about() {
        return "about"; // 对应 /WEB-INF/views/about.jsp
    }
}

2. 返回 JSON 数据(@RestController

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/status")
    public Map<String, String> status() {
        return Map.of("status", "ok", "version", "1.0");
    }

    @PostMapping("/echo")
    public Map<String, String> echo(@RequestBody Map<String, String> payload) {
        return Map.of("received", payload.toString());
    }
}

🖼 JSP 页面示例(home.jsp

jsp 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Home Page</title>
</head>
<body>
    <h1>欢迎来到首页</h1>
    <p>这是 JSP 渲染的页面。</p>
    <a href="/about">关于我们</a>
</body>
</html>

🚀 启动与访问

  1. 运行项目 (IDEA 直接运行 DemoApplication
  2. 浏览器访问:
    • http://localhost:8080/ → JSP 页面
    • http://localhost:8080/api/status → JSON 数据

✅ 这样你就能在一个项目里同时支持:

  • 传统页面渲染@Controller + JSP)
  • REST API 接口@RestController + JSON)

相关推荐
神云瑟瑟4 小时前
Spring Boot大文件分块上传(代码篇)
java·spring boot·大文件上传·分块上传
zzywxc7874 小时前
AI行业应用:金融、医疗、教育、制造业的落地案例全解析
人工智能·深度学习·spring·机器学习·金融·数据挖掘
小趴菜不能喝5 小时前
Spring boot3.x整合mybatis-plus踩坑记录
java·spring boot·mybatis
摸鱼仙人~5 小时前
Spring Boot 拦截器(Interceptor)与过滤器(Filter)有什么区别?
java·spring boot·后端
来一杯龙舌兰5 小时前
【Sharding-JDBC】Spring/Spring Boot 集成 Sharding-JDBC,分表策略与 API、YAML 配置实践
java·spring boot·spring
叫我阿柒啊5 小时前
Java全栈开发工程师面试实战:从基础到微服务的完整技术演进
java·spring boot·微服务·前端框架·vue3·全栈开发·面试技巧
华农第一蒟蒻5 小时前
Elasticsearch赋能3D打印机任务统计分析
java·大数据·spring boot·后端·elasticsearch·adb·maven
现在没有牛仔了5 小时前
SpringBoot全局异常处理实战详解
java·spring boot·后端
叫我阿柒啊6 小时前
从全栈开发到云原生:一位Java工程师的实战经验分享
java·spring boot·redis·云原生·kafka·vue·全栈开发