SpringMVC 是基于 Spring 框架的模型-视图-控制器(MVC)架构实现,广泛应用于构建Web应用程序。它通过一系列注解简化了控制器层的开发,并提供了清晰的工作流程来处理HTTP请求和响应。本文将详细介绍 SpringMVC 中常用的注解及其作用,并解析 SpringMVC 的工作原理及其处理流程,帮助开发者更好地掌握这一强大工具。
@Controller
定义与作用:
@Controller 注解用于标识一个类为控制器类,负责处理HTTP请求。它是 SpringMVC 中最基本的注解之一,通常与 @RequestMapping 结合使用。
示例:
@Controller
public class MyController {
// 控制器方法
}
@RequestMapping
定义与作用:
@RequestMapping 注解用于映射 Web 请求到特定的处理器方法或控制器类。它可以指定URL路径、HTTP方法(如GET、POST)、参数等。
示例:
@Controller
@RequestMapping("/users")
public class UserController {
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String listUsers(Model model) {
// 处理逻辑
return "userList";
}
}
@GetMapping 和 @PostMapping
定义与作用:
@GetMapping 和 @PostMapping 是 @RequestMapping 的特化形式,分别用于映射 GET 和 POST 请求。它们使代码更加简洁易读。
示例:
@Controller
public class UserController {
@GetMapping("/users/list")
public String listUsers(Model model) {
// 处理逻辑
return "userList";
}
@PostMapping("/users/create")
public String createUser(@ModelAttribute User user) {
// 处理逻辑
return "redirect:/users/list";
}
}
@RequestParam
定义与作用:
@RequestParam 注解用于绑定 HTTP 请求中的查询参数或表单参数到控制器方法的参数上。它支持必填项、默认值等配置。
示例:
@GetMapping("/search")
public String searchUsers(@RequestParam("name") String name, Model model) {
// 处理逻辑
return "searchResults";
}
@PathVariable
定义与作用:
@PathVariable 注解用于提取 URL 中的占位符参数,并将其绑定到控制器方法的参数上。它常用于 RESTful 风格的 URL。
示例:
@GetMapping("/users/{id}")
public String getUserById(@PathVariable("id") Long id, Model model) {
// 处理逻辑
return "userDetails";
}
@RequestBody 和 @ResponseBody
定义与作用:
@RequestBody:用于将 HTTP 请求体中的内容(如 JSON 或 XML)转换为 Java 对象。
@ResponseBody:用于将控制器方法返回的对象转换为 HTTP 响应体(如 JSON 或 XML)。
示例:
@PostMapping("/users")
@ResponseBody
public ResponseEntity<User> createUser(@RequestBody User user) {
// 处理逻辑
return new ResponseEntity<>(user, HttpStatus.CREATED);
}
@ModelAttribute
定义与作用:
@ModelAttribute 注解用于将请求参数绑定到模型对象上,或者在控制器方法中添加数据到模型中。它适用于复杂的表单提交场景。
示例:
@PostMapping("/users/create")
public String createUser(@ModelAttribute User user, BindingResult result) {
if (result.hasErrors()) {
return "createUserForm";
}
// 处理逻辑
return "redirect:/users/list";
}
@ExceptionHandler
定义与作用:
@ExceptionHandler 注解用于定义全局异常处理方法,捕获并处理特定类型的异常。它有助于提高代码的健壮性和可维护性。
示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
public ModelAndView handleUserNotFound(Exception ex) {
ModelAndView modelAndView = new ModelAndView("error");
modelAndView.addObject("message", ex.getMessage());
return modelAndView;
}
}
请求分发
SpringMVC 使用前端控制器 DispatcherServlet 来处理所有进入的 HTTP 请求。DispatcherServlet 负责将请求分发给相应的处理器。
处理器映射
HandlerMapping 组件负责将请求映射到具体的处理器(即控制器方法)。最常用的是 RequestMappingHandlerMapping,它根据 @RequestMapping 注解进行映射。
数据绑定
HandlerAdapter 组件负责调用处理器方法,并将请求参数绑定到方法参数上。AnnotationMethodHandlerAdapter 支持各种注解(如 @RequestParam、@PathVariable 等)进行数据绑定。
视图解析
处理器方法执行完毕后,ViewResolver 组件负责将逻辑视图名称解析为实际的视图资源(如 JSP、Thymeleaf 模板)。常用的 ViewResolver 包括 InternalResourceViewResolver 和 ThymeleafViewResolver。
异常处理
如果处理器方法抛出异常,ExceptionHandlerExceptionResolver 组件会根据 @ExceptionHandler 注解找到相应的异常处理方法,并生成适当的响应。
流程详解
用户发送请求:用户通过浏览器或其他客户端发送 HTTP 请求到服务器。
前端控制器接收请求:DispatcherServlet 接收请求并解析 URL。
处理器映射:HandlerMapping 根据 URL 和注解(如 @RequestMapping)找到对应的处理器方法。
数据绑定:HandlerAdapter 将请求参数绑定到处理器方法的参数上,并调用该方法。
处理器方法执行:处理器方法处理业务逻辑,返回逻辑视图名称或直接返回响应数据。
视图解析:ViewResolver 将逻辑视图名称解析为实际的视图资源,并渲染视图。
响应返回:最终响应返回给用户,显示结果或错误信息。
流程图:
用户请求 --> DispatcherServlet --> HandlerMapping --> HandlerAdapter --> 处理器方法 --> ViewResolver --> 渲染视图 --> 用户响应
RESTful API 开发
@GetMapping 和 @PostMapping 等注解非常适合用于开发 RESTful API,确保 URL 设计符合 REST 规范。
示例:
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable("id") Long id) {
// 查询用户
return new ResponseEntity<>(userService.findById(id), HttpStatus.OK);
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
// 创建用户
return new ResponseEntity<>(userService.save(user), HttpStatus.CREATED);
}
}
表单处理
@ModelAttribute 和 @RequestParam 注解可以简化表单处理逻辑,确保用户输入的数据正确绑定到控制器方法的参数上。
示例:
@Controller
public class UserController {
@GetMapping("/register")
public String showRegistrationForm(Model model) {
model.addAttribute("user", new User());
return "registerForm";
}
@PostMapping("/register")
public String registerUser(@ModelAttribute User user, BindingResult result) {
if (result.hasErrors()) {
return "registerForm";
}
// 处理注册逻辑
userService.save(user);
return "redirect:/success";
}
}
异常处理
@ExceptionHandler 注解可以集中处理全局异常,避免每个控制器方法中重复编写异常处理逻辑。
示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
public ModelAndView handleUserNotFound(Exception ex) {
ModelAndView modelAndView = new ModelAndView("error");
modelAndView.addObject("message", ex.getMessage());
return modelAndView;
}
}
SpringMVC 是一个功能强大且灵活的框架,广泛应用于构建Web应用程序。通过本文的介绍,读者应该对 SpringMVC 中常用的注解及其作用有了全面的理解,并掌握了 SpringMVC 的工作原理及其处理流程。无论是 RESTful API 开发、表单处理,还是异常处理,SpringMVC 都提供了丰富的注解和组件,简化了开发过程并提高了代码质量。
声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
支持全球约2.4万个城市地区天气查询,如:天气实况、逐日天气预报、24小时历史天气等
支持识别各类商场、超市及药店的购物小票,包括店名、单号、总金额、消费时间、明细商品名称、单价、数量、金额等信息,可用于商品售卖信息统计、购物中心用户积分兑换及企业内部报销等场景
涉农贷款地址识别,支持对私和对公两种方式。输入地址的行政区划越完整,识别准确度越高。
根据给定的手机号、姓名、身份证、人像图片核验是否一致
通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。