91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-23 13:24:16 來源:腳本之家 閱讀:203 作者:雨中漫步,惟情而已 欄目:編程語言

前言

本文主要給大家介紹了關于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();
 }

總結

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴义市| 敦煌市| 虎林市| 淮阳县| 赣榆县| 泾阳县| 京山县| 闽清县| 竹山县| 宁海县| 灵璧县| 徐州市| 城步| 武隆县| 民权县| 丰城市| 定襄县| 穆棱市| 宝丰县| 安西县| 淄博市| 孟津县| 佛冈县| 南江县| 华坪县| 甘洛县| 宜阳县| 苏尼特右旗| 贺州市| 芜湖市| 新龙县| 济南市| 合作市| 西乡县| 湖口县| 沧源| 纳雍县| 诏安县| 古浪县| 灌阳县| 遂宁市|