一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - spring mvc中注解@ModelAttribute的妙用分享

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

2020-12-31 15:49雨中漫步,惟情而已 Java教程

這篇文章主要給大家介紹了關于spring mvc中注解@ModelAttribute妙用的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Android具有一定的參考學習價值,需要的朋友們下面來一起看看吧。

前言

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

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

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

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

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

?
1
2
3
4
@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層常用的對象,如下:

?
1
2
3
4
5
6
@Resource
protected HttpServletRequest request;
 
protected ModelMap model;
 
protected HttpServletResponse response;

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * 設置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三個類變量,具體如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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();
 }

總結

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

原文鏈接:http://www.cnblogs.com/liaochong/p/spring_modelattribute.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品免费久久久久影院 | 星空无限传媒xk8027穆娜 | 校花被强迫np肉高h 校服下的白嫩小乳尖h1v1 | 亚洲国产区中文在线观看 | 色综合综合色 | 色婷婷综合久久久 | 亚洲高清在线天堂精品 | 韩国丽卡三级作品 | 色热综合 | 67id人成观看免费 | 猫咪免费人成网站在线观看入口 | 97se亚洲国产综合自在线观看 | 男人机机桶女人机机 | 猫影视tv接口 | 91视频www | 日韩免费在线视频观看 | 欧美综合国产精品日韩一 | 按摩师他揉我奶好爽捏我奶 | 99在线观看视频免费 | 亚洲国产黄色 | acg火影忍者熟密姬纲手h | 99草精品视频 | 久久精品中文騷妇女内射 | 狠狠综合视频精品播放 | 456老汉gay| 国产精品福利久久2020 | 色天天综合色天天碰 | 国产品精人成福利视频 | 91视频夜色 | 亚洲高清在线精品一区 | 成年人免费在线看的惊悚动作片 | 日韩在线毛片 | jizzjizz大学生 | 福利视频一区二区三区 | 四虎免费在线观看视频 | 无人区1在线观看 | 久久er国产免费精品 | 四虎影视在线影院在线观看 | 色老板在线视频 | 欧美日韩国产成人综合在线 | 国产精品3p视频 |