当前位置: 首页 > java >正文

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

<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

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
server.port=8080

🖥 控制器示例

1. 返回 JSP 页面(@Controller

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

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

<%@ 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)

http://www.xdnf.cn/news/19798.html

相关文章:

  • ARM汇编记忆
  • C# 简述委托,Func与Action委托。 他们之前有什么区别?
  • 告别手动复制粘贴:C# 实现 Excel 与 TXT 文本文件高效互转
  • 搭建分布式Hadoop集群[2025] 实战笔记
  • SQL分类详解:掌握DQL、DML、DDL等数据库语言类型
  • p049基于Flask的医疗预约与诊断系统
  • 删除⽂件之git
  • 避免侵权!这6个可免费下载字体网站能放心商用
  • 大模型推理加速深度对比:vLLM vs TensorRT-LLM vs ONNX Runtime,谁是生产环境最优解?
  • hot100——第十周
  • linux(cut,sort,uniq ,tr,sed,awk)命令介绍
  • 两个矩形之间的距离 python
  • 互联网大厂Java面试三大回合全解析:从语言特性到性能安全
  • Python数据分析与处理(一):读取不同格式.mat文件的具体方法【超详细】
  • 图解设计模式
  • python - ( js )object对象、json对象、字符串对象的相关方法、数组对象的相关方法、BOM对象、BOM模型中 Navigator 对象
  • Ubuntu中配置JMmeter工具
  • Java 类加载机制(ClassLoader)的必会知识点汇总
  • 当合规成为主旋律,PSP 如何推动链上消费市场迈向新蓝海?
  • MidJourney AI绘图工具测评:支持Discord指令生成图片,含图生图与非商业版权使用功能
  • 零样本视觉模型(DINOv3)
  • 云手机发展:未来的场景变化
  • 【C++】模板(初阶)--- 初步认识模板
  • 三维重建线结构光之重建原理(单线结构光为例)
  • 避坑指南!解决Navicat运行SQL成功但没有表的问题
  • 达梦数据库在大小写不敏感的情况下,如何使查询比较中依旧可以做大小写敏感比较?
  • FFmpeg命令行音视频工具:高效实现格式转换与批量处理,支持音频提取与精准视频剪辑
  • Parasoft C/C++test如何实现开发环境内嵌的安全检测
  • 多工况切换定向:陀螺定向短节 vs 传统陀螺工具,谁的适配性更强?
  • 【单片机day01】