spring mvc中注解@ModelAttribute的妙用分享
发布时间 - 2026-01-11 03:12:01 点击率:次前言

本文主要给大家介绍了关于spring mvc注解@ModelAttribute妙用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
在Spring mvc中,注解@ModelAttribute是一个非常常用的注解,其功能主要在两方面:
- 运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用;
- 运用在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中;
一般开发中,第一种用法居多,本次我将使用第二种用法以期节省controller层的一些代码:
目前使用spring mvc开发的controller层方法一般类似于:
@RequestMapping("/{encodeId}/detail")
public String detail(ModelMap model, @PathVariable String encodeId) {
.....
}
几乎在每一个@RequestMapping标注的方法的参数中都会有 ModelMap model的参数,既然这是一个大概率事件,为什么不可以像注入request那样,直接在类的开始使用@Resource进行自动注入呢?
另外一个,就是response,response也不能像request那样进行自动注入。
类似的可能还有很多,既然这些都是controller层常用的代码,如果能将其在一个basecontroller层自动注入,然后controller层继承这个basecontroller,那样就没有必要再@RequestMapping标注的方法中写上这些参数,使得参数个数减少,清晰。
我的思路正是使用@ModelAttribute注解,编写一个basecontroller类,预定义一些项目中controller层常用的对象,如下:
@Resource protected HttpServletRequest request; protected ModelMap model; protected HttpServletResponse response;
request不用解释,可以直接使用@Resource直接注入,response和model的注入方式如下:
/**
* 设置response
*
* @param response
*/
@ModelAttribute
private final void initResponse(HttpServletResponse response) {
this.response = response;
}
/**
* 设置model
*
* @param model
*/
@ModelAttribute
private final void initModelMap(ModelMap model) {
this.model = model;
}
spring在执行@RequestMapping前会执行上述方法,spring会和平常一样,每次请求重新生成一个model和response,然后注入到方法的参数中,这样就变相在继承了这个basecontroller的controller中自动注入了response和model,在这个controller层中再也不必每次写ModelMap和response参数,整体代码整洁了不少。
我在项目中这样使用暂无问题,如果哪位高手知道这种做法会有弊端或者有更好的方法,求指正!
修正:
非常感谢eBusinessMan的提醒,确实有可能在spring mvc单例模式下会出现访问对象不一致的情况,为了防止该问题,而又能保持这种代码的简洁性以及确保使用spring mvc性能问题不太严重,我决定使用ThreadLocal来处理。
(验证结果:request采用spring的自动注入方式是线程安全的,response、model是不安全的,采用ThreadLocal可以解决该问题)
request对象不再使用注解自动注入(也可以继续使用注解方式注入),而使用同response和model初始化的方式,取消request、response、model三个类变量,具体如下:
private static final ThreadLocal<HttpServletRequest> requestContainer = new ThreadLocal<HttpServletRequest>();
private static final ThreadLocal<HttpServletResponse> responseContainer = new ThreadLocal<HttpServletResponse>();
private static final ThreadLocal<ModelMap> modelContainer = new ThreadLocal<ModelMap>();
/**
* 初始化response
*
* @param response
*/
@ModelAttribute
private final void initResponse(HttpServletResponse response) {
responseContainer.set(response);
}
/**
* 获取当前线程的response对象
*
* @return
*/
protected final HttpServletResponse getResponse() {
return responseContainer.get();
}
/**
* 初始化request
*
* @param request
*/
@ModelAttribute
private final void initRequest(HttpServletRequest request) {
requestContainer.set(request);
}
/**
* 获取当前线程的request对象
*
* @return
*/
protected final HttpServletRequest getRequest() {
return requestContainer.get();
}
/**
* 设置model
*
* @param model
*/
@ModelAttribute
private final void initModelMap(ModelMap model) {
modelContainer.set(model);
}
/**
* 获取当前线程的modelMap对象
*
* @return
*/
protected final ModelMap getModelMap() {
return modelContainer.get();
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
# springmvc注解
# springmvc注解详解
# springmvc的注解
# spring学习教程之@ModelAttribute注解运用详解
# java中@ModelAttribute注解的作用
# spring mvc中的@ModelAttribute注解示例介绍
# SpringMVC中@ModelAttribute注解的使用教程
# 会有
# 会将
# 返回值
# 也不
# 我在
# 暂无
# 相关内容
# 在这个
# 有可能
# 不太
# 说了
# 不可以
# 不多
# 会在
# 有一定
# 将其
# 这是一个
# 给大家
# 可以直接
# 我将
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
如何续费美橙建站之星域名及服务?
简历在线制作网站免费版,如何创建个人简历?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
Python函数文档自动校验_规范解析【教程】
网站制作价目表怎么做,珍爱网婚介费用多少?
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
Android自定义控件实现温度旋转按钮效果
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
如何在建站之星网店版论坛获取技术支持?
Python3.6正式版新特性预览
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何用AI帮你把自己的生活经历写成一个有趣的故事?
如何在IIS7中新建站点?详细步骤解析
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
🚀拖拽式CMS建站能否实现高效与个性化并存?
Laravel怎么在Controller之外的地方验证数据
如何用JavaScript实现文本编辑器_光标和选区怎么处理
JavaScript如何实现类型判断_typeof和instanceof有什么区别
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
,交易猫的商品怎么发布到网站上去?
实例解析angularjs的filter过滤器
如何在Ubuntu系统下快速搭建WordPress个人网站?
如何在服务器上三步完成建站并提升流量?
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
Bootstrap CSS布局之列表
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
高防服务器:AI智能防御DDoS攻击与数据安全保障
jQuery中的100个技巧汇总
如何快速启动建站代理加盟业务?
Laravel如何配置任务调度?(Cron Job示例)
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
node.js报错:Cannot find module 'ejs'的解决办法
如何做网站制作流程,*游戏网站怎么搭建?
Laravel如何使用.env文件管理环境变量?(最佳实践)
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
南京网站制作费用,南京远驱官方网站?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
如何快速上传自定义模板至建站之星?
Android GridView 滑动条设置一直显示状态(推荐)
免费网站制作appp,免费制作app哪个平台好?
使用豆包 AI 辅助进行简单网页 HTML 结构设计
下一篇:小度app语音搜索功能设置方法
下一篇:小度app语音搜索功能设置方法

