欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2017年09月11日 12:00:11   作者:雨中漫步,惟情而已  
這篇文章主要給大家介紹了關(guān)于spring mvc中注解@ModelAttribute妙用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Android具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。

前言

本文主要給大家介紹了關(guān)于spring mvc注解@ModelAttribute妙用的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。

在Spring mvc中,注解@ModelAttribute是一個(gè)非常常用的注解,其功能主要在兩方面:

  1. 運(yùn)用在參數(shù)上,會(huì)將客戶端傳遞過(guò)來(lái)的參數(shù)按名稱注入到指定對(duì)象中,并且會(huì)將這個(gè)對(duì)象自動(dòng)加入ModelMap中,便于View層使用;
  2. 運(yùn)用在方法上,會(huì)在每一個(gè)@RequestMapping標(biāo)注的方法前執(zhí)行,如果有返回值,則自動(dòng)將該返回值加入到ModelMap中;

一般開(kāi)發(fā)中,第一種用法居多,本次我將使用第二種用法以期節(jié)省controller層的一些代碼:

目前使用spring mvc開(kāi)發(fā)的controller層方法一般類似于:

 @RequestMapping("/{encodeId}/detail")
 public String detail(ModelMap model, @PathVariable String encodeId) {
 .....
 }

幾乎在每一個(gè)@RequestMapping標(biāo)注的方法的參數(shù)中都會(huì)有 ModelMap model的參數(shù),既然這是一個(gè)大概率事件,為什么不可以像注入request那樣,直接在類的開(kāi)始使用@Resource進(jìn)行自動(dòng)注入呢?

另外一個(gè),就是response,response也不能像request那樣進(jìn)行自動(dòng)注入。

類似的可能還有很多,既然這些都是controller層常用的代碼,如果能將其在一個(gè)basecontroller層自動(dòng)注入,然后controller層繼承這個(gè)basecontroller,那樣就沒(méi)有必要再@RequestMapping標(biāo)注的方法中寫上這些參數(shù),使得參數(shù)個(gè)數(shù)減少,清晰。

我的思路正是使用@ModelAttribute注解,編寫一個(gè)basecontroller類,預(yù)定義一些項(xiàng)目中controller層常用的對(duì)象,如下:

 @Resource
 protected HttpServletRequest request;
 
 protected ModelMap model;
 
 protected HttpServletResponse response;

request不用解釋,可以直接使用@Resource直接注入,response和model的注入方式如下:

/**
 * 設(shè)置response
 * 
 * @param response
 */
 @ModelAttribute
 private final void initResponse(HttpServletResponse response) {
 this.response = response;
 }

 /**
 * 設(shè)置model
 * 
 * @param model
 */
 @ModelAttribute
 private final void initModelMap(ModelMap model) {
 this.model = model;
 }

spring在執(zhí)行@RequestMapping前會(huì)執(zhí)行上述方法,spring會(huì)和平常一樣,每次請(qǐng)求重新生成一個(gè)model和response,然后注入到方法的參數(shù)中,這樣就變相在繼承了這個(gè)basecontroller的controller中自動(dòng)注入了response和model,在這個(gè)controller層中再也不必每次寫ModelMap和response參數(shù),整體代碼整潔了不少。

我在項(xiàng)目中這樣使用暫無(wú)問(wèn)題,如果哪位高手知道這種做法會(huì)有弊端或者有更好的方法,求指正!

修正:

非常感謝eBusinessMan的提醒,確實(shí)有可能在spring mvc單例模式下會(huì)出現(xiàn)訪問(wèn)對(duì)象不一致的情況,為了防止該問(wèn)題,而又能保持這種代碼的簡(jiǎn)潔性以及確保使用spring mvc性能問(wèn)題不太嚴(yán)重,我決定使用ThreadLocal來(lái)處理。

(驗(yàn)證結(jié)果:request采用spring的自動(dòng)注入方式是線程安全的,response、model是不安全的,采用ThreadLocal可以解決該問(wèn)題)

request對(duì)象不再使用注解自動(dòng)注入(也可以繼續(xù)使用注解方式注入),而使用同response和model初始化的方式,取消request、response、model三個(gè)類變量,具體如下:

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);
 }

 /**
 * 獲取當(dāng)前線程的response對(duì)象
 * 
 * @return
 */
 protected final HttpServletResponse getResponse() {
 return responseContainer.get();
 }

 /**
 * 初始化request
 * 
 * @param request
 */
 @ModelAttribute
 private final void initRequest(HttpServletRequest request) {
 requestContainer.set(request);
 }

 /**
 * 獲取當(dāng)前線程的request對(duì)象
 * 
 * @return
 */
 protected final HttpServletRequest getRequest() {
 return requestContainer.get();
 }

 /**
 * 設(shè)置model
 * 
 * @param model
 */
 @ModelAttribute
 private final void initModelMap(ModelMap model) {
 modelContainer.set(model);
 }

 /**
 * 獲取當(dāng)前線程的modelMap對(duì)象
 * 
 * @return
 */
 protected final ModelMap getModelMap() {
 return modelContainer.get();
 }

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 深入探究Java中的HashMap為什么會(huì)產(chǎn)生死循環(huán)

    深入探究Java中的HashMap為什么會(huì)產(chǎn)生死循環(huán)

    HashMap?死循環(huán)發(fā)生在?JDK?1.8?之前的版本中,這篇文章主要來(lái)和大家深入探究一下為什么Java中HashMap會(huì)產(chǎn)生死循環(huán),感興趣的小伙伴可以了解一下
    2023-05-05
  • struts2過(guò)濾器和攔截器的區(qū)別分析

    struts2過(guò)濾器和攔截器的區(qū)別分析

    這篇文章主要介紹了struts2過(guò)濾器和攔截器的區(qū)別,簡(jiǎn)單分析了struts2框架中過(guò)濾器和攔截器的概念與相關(guān)使用區(qū)別,需要的朋友可以參考下
    2016-04-04
  • 關(guān)于MyBatis的foreach標(biāo)簽常用方法

    關(guān)于MyBatis的foreach標(biāo)簽常用方法

    這篇文章主要介紹了關(guān)于MyBatis的foreach標(biāo)簽常用方法,foreach 標(biāo)簽可以用來(lái)遍歷數(shù)組、列表和 Map 等集合參數(shù),實(shí)現(xiàn)批量操作或一些簡(jiǎn)單 SQL 操作,需要的朋友可以參考下
    2023-05-05
  • java捕獲異常信息存入txt文件示例

    java捕獲異常信息存入txt文件示例

    這篇文章主要介紹了java捕獲異常信息存入txt文件示例,需要的朋友可以參考下
    2014-04-04
  • Java序列化與反序列化的實(shí)例分析講解

    Java序列化與反序列化的實(shí)例分析講解

    今天小編就為大家分享一篇關(guān)于Java序列化與反序列化的實(shí)例分析講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Java_Spring之Spring5?的新特性

    Java_Spring之Spring5?的新特性

    這篇文章主要介紹了Java_Spring中Spring5?的新特性,需要利用jdk8?版本更新的內(nèi)容,依賴庫(kù)更新,感興趣的小伙伴可以參考閱讀
    2023-04-04
  • 使用迭代器模式來(lái)進(jìn)行Java的設(shè)計(jì)模式編程

    使用迭代器模式來(lái)進(jìn)行Java的設(shè)計(jì)模式編程

    這篇文章主要介紹了使用迭代器模式來(lái)進(jìn)行Java的設(shè)計(jì)模式編程,文中對(duì)迭代器模式中的容器封裝方面的知識(shí)進(jìn)行了講解,需要的朋友可以參考下
    2016-02-02
  • Java Method類及invoke方法原理解析

    Java Method類及invoke方法原理解析

    這篇文章主要介紹了Java Method類及invoke方法原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java開(kāi)發(fā)工作中對(duì)InheritableThreadLocal使用思考

    java開(kāi)發(fā)工作中對(duì)InheritableThreadLocal使用思考

    這篇文章主要為大家介紹了java開(kāi)發(fā)工作中對(duì)InheritableThreadLocal使用思考詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • MybatisPlus中QueryWrapper常用方法總結(jié)

    MybatisPlus中QueryWrapper常用方法總結(jié)

    MyBatis-Plus是一個(gè)Mybatis增強(qiáng)版工具,在MyBatis上擴(kuò)充了其他功能沒(méi)有改變其基本功能,為了簡(jiǎn)化開(kāi)發(fā)提交效率而存在,queryWrapper是mybatis plus中實(shí)現(xiàn)查詢的對(duì)象封裝操作類,本文就給大家總結(jié)了MybatisPlus中QueryWrapper的常用方法,需要的朋友可以參考下
    2023-07-07

最新評(píng)論