一、spring mvc概述
1.1 mvc设计模式
mvc(model-view-controller)是一种经典的软件架构模式,将应用程序分为三个核心组件:
- model:数据模型,负责业务逻辑和数据管理
- view:视图层,负责数据展示
- controller:控制器,处理用户请求并协调model和view
1.2 spring mvc特点
- 基于dispatcherservlet的前端控制器模式
- 灵活的配置方式(注解驱动)
- 强大的数据绑定和验证机制
- 支持多种视图技术(jsp、thymeleaf等)
- 与spring框架无缝集成
二、spring mvc核心组件
2.1 架构流程图解
[客户端] --> [dispatcherservlet] --> [handlermapping] --> [controller] --> [modelandview] --> [viewresolver] --> [视图]
2.2 核心组件说明
- dispatcherservlet:前端控制器,统一处理请求
- handlermapping:请求到处理器的映射
- controller:业务逻辑处理器
- viewresolver:视图解析器
- handleradapter:处理器适配器
- model:数据模型容器
三、环境搭建与配置
3.1 maven依赖
org.springframework spring-webmvc 5.3.20 javax.servlet javax.servlet-api 4.0.1 provided
3.2 传统xml配置 vs javaconfig
xml配置示例:
dispatcher org.springframework.web.servlet.dispatcherservlet contextconfiglocation /web-inf/spring-mvc.xml
javaconfig实现:
@configuration @enablewebmvc @componentscan("com.example.controller") public class webconfig implements webmvcconfigurer { @bean public viewresolver viewresolver() { internalresourceviewresolver resolver = new internalresourceviewresolver(); resolver.setprefix("/web-inf/views/"); resolver.setsuffix(".jsp"); return resolver; } }
四、控制器开发实践
4.1 基础控制器示例
@controller @requestmapping("/user") public class usercontroller { @getmapping("/profile") public string showprofile(model model) { user user = userservice.getcurrentuser(); model.addattribute("user", user); return "profile"; } @postmapping("/update") public string updateprofile(@valid userform form, bindingresult result) { if (result.haserrors()) { return "edit-profile"; } userservice.updateuser(form); return "redirect:/user/profile"; } }
4.2 请求映射注解
@requestmapping
:通用请求映射@getmapping
/@postmapping
:特定http方法映射@pathvariable
:url模板变量@requestparam
:请求参数绑定
@getmapping("/articles/{id}") public string getarticle(@pathvariable long id, @requestparam(defaultvalue = "desc") string sort, model model) { // 业务逻辑 return "article-detail"; }
五、数据处理与绑定
5.1 表单处理示例
@controller @requestmapping("/product") public class productcontroller { @getmapping("/create") public string showform(model model) { model.addattribute("product", new product()); return "product-form"; } @postmapping("/save") public string saveproduct(@modelattribute("product") product product, bindingresult result) { if (result.haserrors()) { return "product-form"; } productservice.save(product); return "redirect:/product/list"; } }
5.2 数据验证
public class product { @notblank(message = "产品名称不能为空") @size(max = 50, message = "名称长度不能超过50字符") private string name; @min(value = 0, message = "价格不能为负数") private bigdecimal price; // getters/setters }
六、视图技术集成
6.1 thymeleaf配置
@configuration @enablewebmvc public class thymeleafconfig { @bean public springresourcetemplateresolver templateresolver() { springresourcetemplateresolver resolver = new springresourcetemplateresolver(); resolver.setprefix("/web-inf/views/"); resolver.setsuffix(".html"); resolver.settemplatemode("html5"); resolver.setcharacterencoding("utf-8"); return resolver; } @bean public springtemplateengine templateengine() { springtemplateengine engine = new springtemplateengine(); engine.settemplateresolver(templateresolver()); return engine; } }
6.2 jsp视图示例
<%@ page contenttype="text/html;charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>用户列表 用户列表
id | 用户名 | 邮箱 |
---|---|---|
${user.id} | ${user.username} | ${user.email} |
七、restful api开发
7.1 rest控制器
@restcontroller @requestmapping("/api/users") public class userapicontroller { @autowired private userservice userservice; @getmapping public responseentity> getallusers() { return responseentity.ok(userservice.findall()); } @getmapping("/{id}") public responseentity
getuserbyid(@pathvariable long id) { return userservice.findbyid(id) .map(responseentity::ok) .orelse(responseentity.notfound().build()); } @postmapping public responseentity createuser(@requestbody @valid user user) { user saveduser = userservice.save(user); return responseentity.created(uri.create("/api/users/" + saveduser.getid())) .body(saveduser); } }
八、高级特性
8.1 拦截器实现
public class authinterceptor implements handlerinterceptor { @override public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception { if (request.getsession().getattribute("user") == null) { response.sendredirect("/login"); return false; } return true; } } // 注册拦截器 @configuration public class webconfig implements webmvcconfigurer { @override public void addinterceptors(interceptorregistry registry) { registry.addinterceptor(new authinterceptor()) .addpathpatterns("/**") .excludepathpatterns("/login", "/register"); } }
8.2 全局异常处理
@controlleradvice public class globalexceptionhandler { @exceptionhandler(resourcenotfoundexception.class) public responseentityhandlenotfound(resourcenotfoundexception ex) { errorresponse error = new errorresponse(); error.settimestamp(localdatetime.now()); error.setstatus(httpstatus.not_found.value()); error.setmessage(ex.getmessage()); return new responseentity<>(error, httpstatus.not_found); } @exceptionhandler(methodargumentnotvalidexception.class) public responseentity handlevalidationexception( methodargumentnotvalidexception ex) { list errors = ex.getbindingresult() .getfielderrors() .stream() .map(fielderror::getdefaultmessage) .collect(collectors.tolist()); errorresponse error = new errorresponse(); error.setstatus(httpstatus.bad_request.value()); error.setmessage("validation failed"); error.setdetails(errors); return new responseentity<>(error, httpstatus.bad_request); } }
九、最佳实践建议
遵循分层架构原则:
- controller层保持精简
- 业务逻辑放在service层
- 数据访问使用repository模式
使用dto进行数据传输:
public class userdto { private string username; private string email; // 省略getter/setter } @postmapping public responseentitycreateuser(@requestbody userdto dto) { user user = userconverter.converttoentity(dto); // ... }
性能优化建议:
- 合理使用缓存(@cacheable)
- 启用gzip压缩
- 异步处理(@async)
安全注意事项:
- 使用csrf保护
- 输入验证和输出编码
- 参数化查询防止sql注入
十、常见问题排查
404错误排查步骤:
- 检查@requestmapping注解路径
- 确认视图解析器配置
- 查看组件扫描范围
数据绑定失败处理:
- 检查字段名称是否匹配
- 验证数据类型是否兼容
- 使用@initbinder进行自定义绑定
性能问题分析:
- 使用spring actuator监控端点
- 分析数据库查询性能
- 检查视图渲染时间
到此这篇关于spring mvc深度解析:从原理到实战的文章就介绍到这了,更多相关spring mvc原理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
海报
186