前言

本文主要给大家介绍了关于spring mvc注解@ModelAttribute妙用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
在Spring mvc中,注解@ModelAttribute是一个非常常用的注解,其功能主要在两方面:
一般开发中,第一种用法居多,本次我将使用第二种用法以期节省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注解的使用教程
# 会有
# 会将
# 返回值
# 也不
# 我在
# 暂无
# 相关内容
# 在这个
# 有可能
# 不太
# 说了
# 不可以
# 不多
# 会在
# 有一定
# 将其
# 这是一个
# 给大家
# 可以直接
# 我将
相关文章:
青岛网站建设如何选择本地服务器?
如何选择可靠的免备案建站服务器?
专业商城网站制作公司有哪些,pi商城官网是哪个?
建站之星代理平台如何选择最佳方案?
建站之星云端配置指南:模板选择与SEO优化一键生成
,制作一个手机app网站要多少钱?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
如何用搬瓦工VPS快速搭建个人网站?
如何在局域网内绑定自建网站域名?
电商网站制作公司有哪些,1688网是什么意思?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
哈尔滨网站建设策划,哈尔滨电工证查询网站?
电商平台网站制作流程,电商网站如何制作?
建站之星如何实现网站加密操作?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
常州自助建站费用包含哪些项目?
C++中引用和指针有什么区别?(代码说明)
定制建站流程步骤详解:一站式方案设计与开发指南
如何快速搭建虚拟主机网站?新手必看指南
已有域名建站全流程解析:网站搭建步骤与建站工具选择
高端云建站费用究竟需要多少预算?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
官网网站制作腾讯审核要多久,联想路由器newifi官网
学校建站服务器如何选型才能满足性能需求?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
代刷网站制作软件,别人代刷火车票靠谱吗?
网站制作软件有哪些,制图软件有哪些?
图册素材网站设计制作软件,图册的导出方式有几种?
如何登录建站主机?访问步骤全解析
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
定制建站如何定义?其核心优势是什么?
如何在建站之星网店版论坛获取技术支持?
开心动漫网站制作软件下载,十分开心动画为何停播?
广德云建站网站建设方案与建站流程优化指南
代购小票制作网站有哪些,购物小票的简要说明?
如何通过可视化优化提升建站效果?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
音乐网站服务器如何优化API响应速度?
建站之星Pro快速搭建教程:模板选择与功能配置指南
手机网站制作与建设方案,手机网站如何建设?
为什么Go需要go mod文件_Go go mod文件作用说明
如何用好域名打造高点击率的自主建站?
建站主机类型有哪些?如何正确选型
如何配置支付宝与微信支付功能?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
网站制作话术技巧,网站推广做的好怎么话术?
设计网站制作公司有哪些,制作网页教程?
MySQL查询结果复制到新表的方法(更新、插入)
*请认真填写需求信息,我们会在24小时内与您取得联系。