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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品国产国产综合精品 | 99热国产这里只有精品99 | 免费一级欧美片在线观免看 | 欧美综合一区二区三区 | 武侠艳妇屈辱的张开双腿 | 波多野结衣52部合集在线观看 | 国产综合第一页 | v视界影院.vsjla | 天堂中文在线免费观看 | 日韩毛片大全免费高清 | 91视频破解版 | 国产精品久久久久久 | 免费观看视频在线播放 | 都市风流贵妇激情 | 俄罗斯一级大片 | 农夫69小说小雨与农村老太 | 免费一级特黄特色大片在线 | 国产欧美精品 | 小小水蜜桃视频高清在线播放 | 亚洲系列国产精品制服丝袜第 | 成人免费在线视频观看 | 亚州日韩精品AV片无码中文 | 午夜福利电影网站鲁片大全 | 网址在线观看你懂我意思吧免费的 | 狠狠色婷婷丁香六月 | 亚洲激情一区 | 国产午夜亚洲精品 | 日本不卡在线视频高清免费 | 成人综合婷婷国产精品久久免费 | 日本激情在线 | 午夜在线观看免费完整直播网页 | 精品无码一区在线观看 | 免费特黄一级欧美大片在线看 | 国产乱子伦在线观看不卡 | 久久精品美女 | 思思久久精品在热线热 | 高清国产精品久久久久 | 天堂资源在线8 | 无耻之徒第十一季在线观看 | 日本哺乳期网站xxxx | 国产精品美女福利视频免费专区 |