最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

本文主要給大家介紹了關于spring mvc注解@ModelAttribute妙用的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

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

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

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

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

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

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

另外一個,就是response,response也不能像request那樣進行自動注入。

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

我的思路正是使用@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在執(zhí)行@RequestMapping前會執(zhí)行上述方法,spring會和平常一樣,每次請求重新生成一個model和response,然后注入到方法的參數(shù)中,這樣就變相在繼承了這個basecontroller的controller中自動注入了response和model,在這個controller層中再也不必每次寫ModelMap和response參數(shù),整體代碼整潔了不少。

我在項目中這樣使用暫無問題,如果哪位高手知道這種做法會有弊端或者有更好的方法,求指正!

修正:

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

(驗證結果:request采用spring的自動注入方式是線程安全的,response、model是不安全的,采用ThreadLocal可以解決該問題)

request對象不再使用注解自動注入(也可以繼續(xù)使用注解方式注入),而使用同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();
 }

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • 帶你了解Java數(shù)據(jù)結構和算法之棧

    帶你了解Java數(shù)據(jù)結構和算法之棧

    這篇文章主要為大家介紹了Java數(shù)據(jù)結構和算法之棧 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Log4j不同模塊輸出到不同的文件中

    Log4j不同模塊輸出到不同的文件中

    這篇文章主要介紹了Log4j不同模塊輸出到不同的文件中 的相關資料,需要的朋友可以參考下
    2016-08-08
  • Jdk中沒有jre文件夾怎么辦?如何解決?

    Jdk中沒有jre文件夾怎么辦?如何解決?

    這篇文章主要介紹了Jdk中沒有jre文件夾怎么辦?如何解決的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 基于Zookeeper實現(xiàn)分布式鎖詳解

    基于Zookeeper實現(xiàn)分布式鎖詳解

    Zookeeper是一個分布式的,開源的分布式應用程序協(xié)調服務,是Hadoop和hbase的重要組件。這篇文章主要介紹了通過Zookeeper實現(xiàn)分布式鎖,感興趣的朋友可以了解一下
    2021-12-12
  • 如何自定義MyBatis攔截器更改表名

    如何自定義MyBatis攔截器更改表名

    自定義MyBatis攔截器可以在方法執(zhí)行前后插入自己的邏輯,這非常有利于擴展和定制 MyBatis 的功能,本篇文章實現(xiàn)自定義一個攔截器去改變要插入或者查詢的數(shù)據(jù)源?,需要的朋友可以參考下
    2023-10-10
  • java Lombok之@Accessors用法及說明

    java Lombok之@Accessors用法及說明

    這篇文章主要介紹了java Lombok之@Accessors用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析

    SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析

    這篇文章主要為大家介紹了SharedWorkerGlobalScope屬性數(shù)據(jù)共享示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • SpringBoot加密配置文件的SQL賬號密碼方式

    SpringBoot加密配置文件的SQL賬號密碼方式

    這篇文章主要介紹了SpringBoot加密配置文件的SQL賬號密碼方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • OpenFeign服務接口調用的過程詳解

    OpenFeign服務接口調用的過程詳解

    Feign是一個聲明式WebService客戶端。使用Feign能讓編寫Web?Service客戶端更加簡單。它的使用方法是定義一個服務接口然后在上面添加注解,這篇文章主要介紹了OpenFeign服務接口調用,需要的朋友可以參考下
    2022-10-10
  • 一文帶你掌握Java8中函數(shù)式接口的使用和自定義

    一文帶你掌握Java8中函數(shù)式接口的使用和自定義

    函數(shù)式接口是?Java?8?引入的一種接口,用于支持函數(shù)式編程,下面我們就來深入探討函數(shù)式接口的概念、用途以及如何創(chuàng)建和使用函數(shù)式接口吧
    2023-08-08

最新評論

凤凰县| 江陵县| 两当县| 闵行区| 财经| 芒康县| 苗栗县| 巨野县| 广宗县| 兴城市| 梅州市| 加查县| 宁陕县| 鄂托克前旗| 青浦区| 九台市| 车险| 辽源市| 金华市| 汤原县| 宜阳县| 瑞安市| 湛江市| 沈阳市| 西宁市| 曲水县| 伊金霍洛旗| 建宁县| 甘孜| 玉林市| 吉林市| 麻栗坡县| 容城县| 监利县| 景宁| 图们市| 遵义县| 新巴尔虎左旗| 筠连县| 沙河市| 湟中县|