Spring MVC 是 Spring 框架中用于构建 Web 应用程序的模块,它采用了 MVC 模式(Model-View-Controller)。Spring MVC 的核心目标是将业务逻辑、数据层、以及展示层分离,使得代码清晰易维护。
Spring MVC 的架构
1. 核心组件
- DispatcherServlet(分发器):
- Spring MVC 的核心组件,是前端控制器 (Front Controller)。
- 接收所有的 HTTP 请求,协调其他组件完成请求处理,并最终返回响应。
- HandlerMapping(处理器映射器):
- 根据请求 URL 找到对应的处理器(Controller)。
- Controller(控制器):
- 处理具体的请求逻辑,接收请求参数,调用服务层或数据层,返回模型数据或视图名。
- ViewResolver(视图解析器):
- 将逻辑视图名解析为具体的视图(例如 JSP 文件、Thymeleaf 页面等)。
- ModelAndView(模型和视图对象):
- 用于存储返回给视图的数据和视图名称。
Spring MVC 工作流程
- 用户发送请求:请求被 DispatcherServlet 捕获。
- 处理器映射:DispatcherServlet 使用 HandlerMapping 找到对应的处理器(Controller)。
- 调用处理器:将请求传递给具体的 Controller 方法处理。
- 返回数据:Controller 返回一个
ModelAndView
对象,包含模型数据和视图名称。 - 视图解析器处理:ViewResolver 将逻辑视图名解析为具体视图文件。
- 渲染视图:视图层(如 JSP 或 Thymeleaf)结合模型数据生成响应。
- 返回响应:响应通过 DispatcherServlet 返回给用户。
Spring MVC 核心注解
1. @Controller
标记一个类为控制器,处理 HTTP 请求。
@Controller
public class MyController {
@RequestMapping("/hello")
public String sayHello() {
return "hello"; // 返回视图名
}
}
2. @RequestMapping
用于映射请求 URL 到处理方法,可以用于类或方法上。
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/profile")
public String getUserProfile() {
return "userProfile"; // 显示用户资料页面
}
}
3. @RestController
是 @Controller
和 @ResponseBody
的结合,用于构建 RESTful APIs。
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/greeting")
public String greeting() {
return "Hello, World!"; // 直接返回字符串
}
}
4. @GetMapping / @PostMapping / @PutMapping / @DeleteMapping
简化了 @RequestMapping
,用于特定的 HTTP 方法。
@RestController
public class MyController {
@GetMapping("/users")
public List<User> getAllUsers() {
return userService.getAllUsers();
}
}
5. @RequestParam
绑定请求参数到方法参数。
@RequestMapping("/welcome")
public String welcome(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "welcome";
}
6. @PathVariable
绑定 URL 中的变量到方法参数。
@RequestMapping("/user/{id}")
public String getUserById(@PathVariable("id") Long id, Model model) {
model.addAttribute("user", userService.findUserById(id));
return "userDetails";
}
7. @ModelAttribute
将请求参数绑定到 Java 对象,并将对象添加到模型。
@PostMapping("/register")
public String register(@ModelAttribute User user) {
userService.saveUser(user);
return "registrationSuccess";
}
8. @ResponseBody
用于直接将数据写入 HTTP 响应体,常用于 RESTful API。
@RequestMapping("/json")
@ResponseBody
public User getUser() {
return new User("John", "Doe");
}
Spring MVC 配置
1. 配置 DispatcherServlet
通常通过 web.xml 或 Java 配置来注册。
web.xml 配置:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Java 配置:
@Configuration
@EnableWebMvc
@ComponentScan("com.example")
public class WebConfig implements WebMvcConfigurer {
// 配置 ViewResolver 等其他组件
}
2. 配置视图解析器
指定如何解析逻辑视图名。
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
常见示例
1. 简单页面跳转
Controller:
@Controller
public class PageController {
@RequestMapping("/home")
public String home() {
return "home"; // 视图名对应 /WEB-INF/views/home.jsp
}
}
2. 返回 JSON 数据
Controller:
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/users")
public List<User> getUsers() {
return userService.getAllUsers();
}
}
RESTful API 和 MVC 的结合
通过 @RestController
和 Jackson,Spring MVC 非常适合构建 RESTful API。
@RestController
自动将返回对象序列化为 JSON。- 使用
@RequestBody
反序列化 JSON 请求体为 Java 对象。 - 使用
ResponseEntity
处理复杂响应。
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.findUserById(id);
if (user == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(user);
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User savedUser = userService.saveUser(user);
return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
}
}
总结
Spring MVC 提供了一个强大的、模块化的框架,能轻松构建传统 Web 应用和 RESTful API。它的核心在于分离关注点,通过一系列注解和灵活的配置,使开发者专注于业务逻辑的实现。
发布者:myrgd,转载请注明出处:https://www.object-c.cn/4348