Spring-Web-MVC快速上手,高效开发Web应用
Spring Web MVC:快速上手,高效开发Web应用
Spring Web MVC 入门指南
1. 本节目标
本节我们将介绍 Spring Web MVC 的基础知识,涵盖以下内容:
- 学习常见的 Spring Web MVC 注解
- 掌握使用 Spring MVC 完成基础功能开发
- 了解 MVC 和三层架构的设计模式
- 掌握企业开发中的命名规范
通过本节内容,您将能够快速上手 Spring Web MVC,并能够在实际项目中应用相关知识。
2.什么是 Spring Web MVC?
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC"。
从上述定义我们可以得出⼀个信息: Spring Web MVC 是⼀个 Web 框架.
下⾯咱们简称之为: Spring MVC
然而要真正的理解什么是 Spring MVC?我们首先要搞清楚什么是 MVC。
2.1 MVC 定义
MVC 是 Model View Controller 的缩写,它是软件工程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分.
• View(视图) 指在应用程序中专门用来与浏览器进行交互,展示数据的资源。
• Model(模型) 是应用程序的主体部分,用来处理程序中数据逻辑的部分。
• Controller(控制器)可以理解为⼀个分发器,用来决定对于视图发来的请求,需要用哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即用来连接视图和模。
比如: 厨房可以用来做饭, 但真实实现做饭功能的是火以及各种做饭相关的⻝材和工具。
厨房就好比是SpringBoot, 厨房可以装柜子, 实现收纳功能, 装燃气灶等, 实现做饭功能。
做饭这个事, 就是MVC, 在几千年前, 有火有食材就可以实现。
学习Spring MVC, 重点也就是学习如何通过浏览器和用户程序进行交互。
主要分以下 三个方面 :
- 建立连接 :将用户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调用到我们的Spring 程序。
- 请求
- 用户请求的时候会带⼀些参数,在程序中要想办法获取到参数, 所以请求这块主要是 获取参数的功能。
- 响应: 执行了业务逻辑之后,要把程序执行的结果返回给用户, 也就是响应。
比如用户去银行存款
1.建立连接: 去柜台
2.请求: 带着银行卡, 身份证去存款
3.响应: 银行返回⼀张存折
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC。
2.2 项目准备
Spring MVC 项⽬创建和 Spring Boot 创建项⽬相同,在创建的时候选择 Spring Web 就相当于创建了Spring MVC 的项⽬。
创建项⽬时, 勾选上 Spring Web 模块即可,如下图:
3. 常见的 Spring Web MVC 注解
3.1 @RestController
- 作用 :标注在类上,是 @Controller 和 @ResponseBody 的组合注解。使用 @RestController 注解的类,其所有方法的返回值都会被直接作为响应体返回,而不会进行视图解析。通常用于开发 RESTful 风格的 Web 服务。
- 特点 :要求返回的数据直接作为 JSON 或 XML 响应,而无需视图解析。
@RestController
@RequestMapping("MyController")
public class MyController {
@RequestMapping("hello")
private String hello(){
return "hello spring mvc!";
}
}
访问链接:
http://127.0.0.1:8080/MyController/hello
,就可以看到数据了。
3.2 @Controller
作用:用于标记一个类为 Spring Web MVC 的控制器。被 @Controller 注解的类会被 Spring 容器扫描并识别为控制器,从而可以处理客户端的请求.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@GetMapping("/hello")
@ResponseBody
public String sayHello() {
return "Hello, Spring Web MVC!";
}
}
**解释:**HelloController 类被 @Controller 注解标记,Spring 容器会将其作为控制器来处理请求。
3.3 @ResponseBody
**作用:**要用于将控制器方法的返回值直接写入到 HTTP 响应的正文(body)中,而不需要进行视图解析。它通常用于 RESTful Web 服务中,返回 JSON、XML 或其他类型的数据。
使用场景:
返回 JSON 数据:当你需要返回 JSON 格式的数据时,@ResponseBody 会自动将Java对象转换为 JSON,并写入到响应的正文中。
返回字符串:可以直接返回一个字符串,@ResponseBody会将字符串内容写入到响应的正文中。
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MyController {
@RequestMapping("/data")
@ResponseBody
public String getData() {
return "Hello, Spring!";
}
}
访问:
http://127.0.0.1:8080/data
,在上述例子中,当访问 /data 时,会直接返回 “Hello, Spring!” 到客户端,而不是跳转到一个视图页面。
3.4 @RequestMapping
- 作用 :标注在类或方法上,指定请求的 URI 和 HTTP 方法。
- 属性
:
value
(或path
)指定请求路径,method
指定 HTTP 方法。
@RestController
@RequestMapping("MyController")
public class MyController {
public String getUser() {
return "获取用户信息";
}
}
访问:
http://127.0.0.1:8080/MyController/getUser
3.5 @GetMapping
、 @PostMapping
等
当然,以下是对
@GetMapping
和
@PostMapping
的更详细说明:
@GetMapping
用途 :
用于映射 HTTP 的 GET 请求,processing incoming HTTP GET requests.
特点 :
- GET 请求是通过 URL 参数传递数据的。
- 适用于查询、获取资源、检索数据等场景。
- 数据是可见的,通常用于安全性要求不高的场景。
- GET 请求是 幂等 的(Idempotent),即多次调用同一个接口,结果不会改变。
- GET 请求的数据大小有限制,因为数据是通过 URL 传递的。
示例 :
@GetMapping("/users") public List<User> getAllUsers() { return userService.getAllUsers(); }
常用属性 :
value
或path
:指定映射的 URL路径。@GetMapping(path = "/users/{id}") public User getUserById(@PathVariable Long id) { return userService.getUserById(id); }
@PostMapping
用途 :
用于映射 HTTP 的 POST 请求,processing incoming HTTP POST requests.
特点 :
- POST 请求通常通过请求体(Body)传递数据。
- 适用于提交表单、创建新资源、更新数据等场景。
- POST 请求是 非幂等 的(Non-Idempotent),即多次调用同一个接口,可能会创建多个资源。
- POST 请求可以传递更大的数据,适合复杂的提交操作。
示例 :
@PostMapping("/users") public User createUser(@RequestBody User user) { return userService.createUser(user); }
常用属性 :
value
或path
:指定映射的 URL路径。consumes
:指定接收的内容类型(如application/json
)。produces
:指定返回的内容类型(如application/json
)。@PostMapping(path = "/users", consumes = "application/json", produces = "application/json") public User createUser(@RequestBody User user) { return userService.createUser(user); }
3. 主要区别
特性 | @GetMapping | @PostMapping |
---|---|---|
HTTP 方法 | GET | POST |
数据传递方式 | URL 参数 | 请求体(Body) |
数据大小限制 | URL 长度限制 | 较大,不受 URL 长度限制 |
幂等性(Idempotent) | 是(多次调用结果相同) | 否(可能创建多个资源) |
使用场景 | 查询数据、获取资源 | 创建资源、提交表单、更新数据 |
4. 实际应用场景
- GET
:
- 查询用户列表:
@GetMapping("/users")
- 获取单个用户信息:
@GetMapping("/users/{id}")
- 查询用户列表:
- POST
:
- 创建新用户:
@PostMapping("/users")
- 提交表单数据:
@PostMapping("/forms")
- 创建新用户:
2.4 @RequestParam
和 @PathVariable
@RequestParam
:获取请求参数。@GetMapping("/search") public String search(@RequestParam String keyword) { return "搜索结果:关键词为 " + keyword; }
@PathVariable
:获取 URL 路径上的变量。@GetMapping("/user/{id}") public String getUser(@PathVariable Long id) { return "用户 ID 为 " + id; }
2.5 @SpringBootApplication
- 作用 :标注在主类上,表示这是一个 Spring Boot 应用程序。
- 示例 :
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
4. 使用 Spring MVC 完成基础功能开发
4.1 创建一个简单的 CRUD 功能
4.1.1 用户控制器(Controller)
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getAllUsers() {
return userService.findAllUsers();
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.saveUser(user);
}
@PutMapping("/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) {
return userService.updateUser(id, user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
}
}
4.1.2 服务层(Service)
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> findAllUsers() {
return userRepository.findAll();
}
public User saveUser(User user) {
return userRepository.save(user);
}
public User updateUser(Long id, User user) {
User existingUser = userRepository.findById(id).orElse(null);
if (existingUser != null) {
existingUser.setName(user.getName());
existingUser.setEmail(user.getEmail());
return userRepository.save(existingUser);
}
return null;
}
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}
4.1.3 数据访问层(Repository)
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
5. MVC 和三层架构的设计模式
5.1 MVC 模式
- Model(模型) :负责数据管理和业务逻辑。
- View(视图) :负责展示数据。
- Controller(控制器) :负责处理用户请求,并协调 Model 和 View。
5.2 三层架构
- 表现层(Web层) :负责与用户交互,接收请求并返回响应。
- 业务逻辑层(Service层) :负责处理业务逻辑。
- 数据访问层(DAO层) :负责与数据库交互。
6. 企业开发中的命名规范
类名
- 使用大驼峰命名法(首字母大写)。
- 例如:
UserController
、UserServiceImpl
。
方法名
- 使用小驼峰命名法(首字母小写)。
- 例如:
getUserById
、saveUser
。
变量名
- 使用小驼峰命名法。
- 例如:
userName
、userEmail
。
包名
- 使用小写字母,分层命名。
- 例如:
com.example.controller
、com.example.service
。
API 命名
- 使用动词 + 名词的形式。
- 例如:
GET /api/users
、POST /api/users
。
7. 结语
通过本节内容,我们学习了 Spring Web MVC 的基础知识,包括常见注解、功能开发、设计模式和命名规范。掌握这些知识可以帮助您快速上手 Spring MVC,并在企业开发中写出规范、高效的代码。