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

深入浅出SpringMVC:从入门到实战指南

深入浅出SpringMVC:从入门到实战指南

什么是SpringMVC?

SpringMVC是Spring框架的一个模块,是一个基于MVC架构的Web框架。它通过一套MVC注解让POJO成为处理请求的控制器,无需实现任何接口,提供了灵活、可配置的Web应用开发解决方案。

MVC模式回顾

MVC(Model-View-Controller)是一种软件设计模式,将应用程序分为三个核心组件:

  • Model(模型):处理业务逻辑和数据持久化
  • View(视图):负责数据展示和用户界面
  • Controller(控制器):接收用户输入,协调模型和视图
用户请求
控制器Controller
模型Model
视图View
响应返回用户

为什么选择SpringMVC?

  1. 解耦优势

    • MyBatis:解决Java代码和SQL语句之间的耦合
    • Spring:解决业务层和其他各层之间的耦合
    • SpringMVC:解决Java代码和Servlet之间的耦合
  2. 相比Servlet的优势

    • 无需为每个请求编写单独的Servlet
    • 简化参数接收过程
    • 提供灵活的请求映射机制

SpringMVC核心架构与执行流程

SpringMVC的核心是前端控制器模式,所有请求都通过一个中央Servlet(DispatcherServlet)进行分发。

ClientDispatcherServletHandlerMappingHandlerAdapterHandlerViewResolverViewHTTP请求查询处理器返回处理链请求处理器适配执行处理器方法返回ModelAndView返回ModelAndView解析视图返回View对象渲染视图返回渲染结果HTTP响应ClientDispatcherServletHandlerMappingHandlerAdapterHandlerViewResolverView

核心组件介绍

  1. DispatcherServlet:前端控制器,接收所有请求
  2. HandlerMapping:映射请求到处理器
  3. HandlerAdapter:执行处理器方法
  4. ViewResolver:解析视图名称到具体视图实现
  5. View:渲染模型数据,生成响应内容

快速搭建SpringMVC项目

1. 添加Maven依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.23</version>
</dependency>

2. 配置web.xml

<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-config.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

3. 创建SpringMVC配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 开启注解扫描 --><context:component-scan base-package="com.example.controller"/><!-- 开启MVC注解驱动 --><mvc:annotation-driven/><!-- 配置视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean>
</beans>

4. 创建控制器

@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/register")public String register(User user, Model model) {// 处理用户注册逻辑model.addAttribute("message", "注册成功");return "result";}
}

请求映射详解

SpringMVC使用@RequestMapping注解映射URL请求到控制器方法:

@Controller
@RequestMapping("/products") // 类级别映射
public class ProductController {@RequestMapping(value = "/list", method = RequestMethod.GET) // 方法级别映射public String listProducts(Model model) {// 获取产品列表return "product/list";}@GetMapping("/{id}") // 简化注解,等同于@RequestMapping(method=RequestMethod.GET)public String getProduct(@PathVariable("id") Long id, Model model) {// 根据ID获取产品return "product/detail";}@PostMapping("/create") // 简化注解public String createProduct(Product product) {// 创建产品return "redirect:/products/list";}
}

参数绑定机制

SpringMVC提供了强大的参数绑定功能,支持多种参数类型:

1. 基本类型绑定

@PostMapping("/login")
public String login(String username, String password) {// 参数名与表单字段名一致时自动绑定return "dashboard";
}

2. 使用@RequestParam注解

@PostMapping("/login")
public String login(@RequestParam("username") String name, @RequestParam(value = "pwd", required = false, defaultValue = "123456") String password) {// 明确指定参数映射关系return "dashboard";
}

3. POJO对象绑定

public class User {private String username;private String password;private Integer age;// getter和setter方法
}@PostMapping("/register")
public String register(User user) {// 自动将表单字段绑定到User对象的属性return "success";
}

4. 集合类型绑定

public class Order {private List<Product> products;private Map<String, Address> addresses;// getter和setter方法
}@PostMapping("/order")
public String createOrder(Order order) {// 处理包含集合的复杂对象return "order_confirmation";
}

数据验证与错误处理

SpringMVC支持JSR-303验证规范:

public class User {@NotBlank(message = "用户名不能为空")@Size(min = 3, max = 20, message = "用户名长度必须在3-20之间")private String username;@NotBlank(message = "密码不能为空")@Size(min = 6, message = "密码长度不能少于6位")private String password;// getter和setter方法
}@PostMapping("/register")
public String register(@Valid User user, BindingResult result) {if (result.hasErrors()) {return "register_form"; // 返回表单页面显示错误信息}// 处理注册逻辑return "success";
}

拦截器与AOP编程

SpringMVC拦截器类似于过滤器,但更加强大和灵活:

public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在处理器执行前调用HttpSession session = request.getSession();if (session.getAttribute("user") == null) {response.sendRedirect("/login");return false; // 中断执行链}return true; // 继续执行}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在处理器执行后、视图渲染前调用}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在整个请求完成后调用}
}

配置拦截器:

<mvc:interceptors><mvc:interceptor><mvc:mapping path="/secure/**"/><bean class="com.example.interceptor.AuthInterceptor"/></mvc:interceptor>
</mvc:interceptors>

RESTful API开发

SpringMVC非常适合开发RESTful风格的API:

@RestController // 组合了@Controller和@ResponseBody
@RequestMapping("/api/users")
public class UserApiController {@Autowiredprivate UserService userService;@GetMappingpublic ResponseEntity<List<User>> getAllUsers() {List<User> users = userService.findAll();return ResponseEntity.ok(users);}@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable Long id) {User user = userService.findById(id);return ResponseEntity.ok(user);}@PostMappingpublic ResponseEntity<User> createUser(@RequestBody User user) {User savedUser = userService.save(user);return ResponseEntity.created(URI.create("/api/users/" + savedUser.getId())).body(savedUser);}@PutMapping("/{id}")public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {User updatedUser = userService.update(id, user);return ResponseEntity.ok(updatedUser);}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteUser(@PathVariable Long id) {userService.delete(id);return ResponseEntity.noContent().build();}
}

文件上传处理

SpringMVC简化了文件上传的处理:

@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {if (!file.isEmpty()) {try {byte[] bytes = file.getBytes();// 保存文件Path path = Paths.get("uploads/" + file.getOriginalFilename());Files.write(path, bytes);return "redirect:/success";} catch (IOException e) {return "redirect:/error";}}return "redirect:/empty";
}

配置MultipartResolver:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="10485760"/> <!-- 10MB -->
</bean>

异常处理机制

SpringMVC提供了统一的异常处理机制:

@ControllerAdvice // 全局异常处理
public class GlobalExceptionHandler {@ExceptionHandler(UserNotFoundException.class)public ResponseEntity<ErrorResponse> handleUserNotFound(UserNotFoundException ex) {ErrorResponse error = new ErrorResponse("USER_NOT_FOUND", ex.getMessage());return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);}@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> handleGeneralException(Exception ex) {ErrorResponse error = new ErrorResponse("INTERNAL_ERROR", "系统内部错误");return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);}
}

性能优化建议

  1. 合理使用拦截器:避免在拦截器中执行耗时操作
  2. 视图解析优化:使用模板引擎缓存编译结果
  3. 静态资源处理:配置<mvc:resources>避免静态资源经过DispatcherServlet
  4. 异步处理:使用@AsyncCallable/DeferredResult提高并发处理能力
  5. 合理设计控制器:保持控制器简洁,将业务逻辑委托给Service层

总结

SpringMVC作为一个成熟、强大的Web框架,通过简洁的注解配置和灵活的扩展机制,极大地简化了Java Web开发。无论是传统的页面渲染应用还是现代化的RESTful API,SpringMVC都能提供优秀的解决方案。

掌握SpringMVC的核心概念和最佳实践,将帮助你构建出结构清晰、易于维护的高质量Web应用程序。随着Spring Boot的普及,SpringMVC的使用变得更加简单,但其核心原理和设计思想仍然保持不变。

希望本文能帮助你深入理解SpringMVC,并在实际项目中灵活运用这些知识!

http://www.dtcms.com/a/389603.html

相关文章:

  • 深度学习入门:从感知机到多层感知机,用逻辑电路讲透神经网络的进化
  • macos m1 芯片无法安装kubeedge keadm 解决办法
  • 猎板 PCB:以全维度工艺突破,构建 PCB 制造技术壁垒
  • android12 SDK31 wifi开发(仅提供连接wifi的工具类)
  • Android播放视频适配黑边问题类型总结
  • 第十一章:AI进阶之--模块的概念与使用(二)
  • 异常检测patchcore 学习笔记 2025
  • [iOS] 网络 - AFNetWorking
  • iOS App 混淆与性能稳定性优化 混淆开销、崩溃风险、CI 集成与落地实务(
  • Freertos系统(任务挂起和恢复)
  • Git更新仓库时,忽略指定文件
  • 告别“瞎练”!数据闭环正成机器人智能进化核心引擎!
  • 基于MATLAB的无人机遥感数据预处理与农林植被性状估算
  • MATLAB基于AHP-模糊综合评价法的工程实践能力评价
  • 特征选择+优化算法+GBDT+SHAP分析!ReliefF-CPO-GBDT分类预测结合SHAP可解释分析MATLAB
  • 设计模式-外观模式详解
  • 《FastAPI零基础入门与进阶实战》第19篇:消息管理
  • 类和对象(下):static成员、友元类、内部类、匿名对象、优化——对象拷贝时的编译器优化
  • 虚拟线程(Virtual Thread)
  • 1688 店铺全商品接口技术全解:从页面解析到分页采集的完整实现方案
  • 日志轮转策略针对香港VPS存储空间的设置标准
  • 线性分组码及其相关概念
  • JWT的工作流程
  • Java 25 新特性 更简洁、更高效、更现代
  • 探讨前端与后端的安全策略:保护用户数据的关键措施
  • 如何使用DeepSeek等AI工具来帮助自己的工作
  • 灵途科技亮相CIOE2025 | 光电感知赋能具身智能升级
  • 我的云端影院:LibreTV+cpolar的异地观影记
  • NW748NW765美光固态闪存NW775NW781
  • 软考中级习题与解答——第八章_计算机网络(1)