全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

spring mvc中注解@ModelAttribute的妙用分享

前言

本文主要给大家介绍了关于spring mvc注解@ModelAttribute妙用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

在Spring mvc中,注解@ModelAttribute是一个非常常用的注解,其功能主要在两方面:

  1. 运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用;
  2. 运用在方法上,会在每一个@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注解的使用教程  # 会有  # 会将  # 返回值  # 也不  # 我在  # 暂无  # 相关内容  # 在这个  # 有可能  # 不太  # 说了  # 不可以  # 不多  # 会在  # 有一定  # 将其  # 这是一个  # 给大家  # 可以直接  # 我将 


相关文章: 青岛网站建设如何选择本地服务器?  如何选择可靠的免备案建站服务器?  专业商城网站制作公司有哪些,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小时内与您取得联系。