摘要:本節(jié)解釋它用在參數(shù)上的情形。一個(gè)用在方法參數(shù)上的注解指示了參數(shù)應(yīng)該從模型這里所說(shuō)的模型指中獲取。方法是一種常用的從數(shù)據(jù)庫(kù)中獲取屬性的方式,可以通過(guò)使用注解把這種屬性在各個(gè)請(qǐng)求之間共享。下一步是數(shù)據(jù)綁定。
??這一部分實(shí)例見這個(gè)項(xiàng)目的 mvc 分支下的 ModelAttrArgsController.java
??上節(jié)說(shuō)過(guò),@ModelAttribute可以用在方法或方法參數(shù)上。本節(jié)解釋它用在參數(shù)上的情形。
??一個(gè)用在方法參數(shù)上的@ModelAttribute注解指示了參數(shù)應(yīng)該從模型(這里所說(shuō)的“模型”指 Model)中獲取。如果模型中不存在,參數(shù)會(huì)首先被實(shí)例化,然后添加到模型中。一旦模型中存在,這個(gè)參數(shù)的字段會(huì)被所有的名字匹配的請(qǐng)求參數(shù)所填充。這在 Spring MVC 中叫做數(shù)據(jù)綁定,它能夠把你從要對(duì)每一個(gè)字段進(jìn)行類型轉(zhuǎn)換的繁重體力勞動(dòng)中解救出來(lái),是非常有用的機(jī)制。
@PostMapping("/owners/{ownerId}/pets/{petId}/edit") public String processSubmit(@ModelAttribute Pet pet) { // ... }
??上面給出的例子的 Pet 實(shí)例來(lái)自哪里?這里有一個(gè)可選項(xiàng):
它可能已經(jīng)存在與模型中了,因?yàn)槭褂昧?b>@SessionAttributes?—?見“使用@SessionAttributes存儲(chǔ)模型屬性到 HTTP 會(huì)話中”一節(jié).
它可能已經(jīng)存在于模型中了,因?yàn)橥粋€(gè)控制器中的@ModelAttribute方法,就像上一節(jié)中解釋的那樣。
它可能是從URI模板變量和類型轉(zhuǎn)換器中獲取的(下面會(huì)詳細(xì)解釋)。
它可能是使用默認(rèn)構(gòu)造器初始化的。
@ModelAttribute方法是一種常用的從數(shù)據(jù)庫(kù)中獲取屬性的方式,可以通過(guò)使用@SessionAttributes注解把這種屬性在各個(gè)請(qǐng)求之間共享。在一些情況下,可以很方便的通過(guò)使用URI模板變量和類型轉(zhuǎn)換器來(lái)獲取這些屬性。下面是一個(gè)例子:
@PutMapping("/accounts/{account}") public String save(@ModelAttribute("account") Account account) { // ... }
??在這個(gè)例子中,模型屬性名(“account”)匹配URI模板變量名。如果你注冊(cè)的一個(gè)Converter
??下一步是數(shù)據(jù)綁定。WebDataBinder類匹配請(qǐng)求參數(shù)名稱——包括請(qǐng)求字符串參數(shù)和表單字段——到屬性字段名。在必須的類型轉(zhuǎn)換(從字符串到目標(biāo)類型字段)之后,匹配的字段收集好了。數(shù)據(jù)綁定和校驗(yàn)見官方文檔第五章-檢驗(yàn)、數(shù)據(jù)綁定和類型轉(zhuǎn)換。為控制器自定義數(shù)據(jù)綁定過(guò)程見 “自定義WebDataBinder初始化”一節(jié)。
??在數(shù)據(jù)綁定之后,可能會(huì)出現(xiàn)一些錯(cuò)誤,比如缺少必須字段或者類型轉(zhuǎn)換錯(cuò)誤。為了檢查這些錯(cuò)誤,你可以緊跟在@ModelAttribute參數(shù)后面添加一個(gè)BindingResult參數(shù):
@PostMapping("/owners/{ownerId}/pets/{petId}/edit") public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result) { if (result.hasErrors()) { return "petForm"; } // ... }
??有了BindingResult之后,你就可以檢查在提交同一個(gè)表單時(shí)有沒(méi)有發(fā)現(xiàn)錯(cuò)誤,這些錯(cuò)誤可以通過(guò) Spring 的
??注意到在一些情況下,在 model 中不使用數(shù)據(jù)綁定來(lái)訪問(wèn)一個(gè)屬性是很有用的。這種情況下,你可以把Model注入到控制器中,或者在注解上使用綁定標(biāo)記:
@ModelAttribute public AccountForm setUpForm() { return new AccountForm(); } @ModelAttribute public Account findAccount(@PathVariable String accountId) { return accountRepository.findOne(accountId); } @PostMapping("update") public String update( @Valid AccountUpdateForm form, BindingResult result, @ModelAttribute(binding=false) Account account) { /* omitted */ }
??除了數(shù)據(jù)綁定,你也可以使用你自己定義的、用來(lái)傳遞BindingResult(用于記錄數(shù)據(jù)綁定錯(cuò)誤)的校驗(yàn)器調(diào)用校驗(yàn)這允許數(shù)據(jù)綁定和驗(yàn)證的錯(cuò)誤積累在一個(gè)地方,隨后報(bào)告給用戶:
@PostMapping("/owners/{ownerId}/pets/{petId}/edit") public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result) { new PetValidator().validate(pet, result); if (result.hasErrors()) return "petForm"; // ... }
??或者你可以自動(dòng)調(diào)用校驗(yàn),通過(guò)添加 JSR-303 的 @Valid 注解:
@PostMapping("/owners/{ownerId}/pets/{petId}/edit") public String processSubmit(@Valid @ModelAttribute("pet") Pet pet, BindingResult result) { if (result.hasErrors()) return "petForm"; // ... }
??關(guān)于如何配置和使用校驗(yàn)器,詳見官方文檔的5.8節(jié)“Spring校驗(yàn)”和第五章 校驗(yàn)、數(shù)據(jù)綁定和類型轉(zhuǎn)換。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/66040.html
摘要:用在方法上的指示那個(gè)方法的目的是添加一個(gè)或多個(gè)模型屬性。在控制器中的方法的調(diào)用時(shí)機(jī)是在同一個(gè)控制器中的方法之前。注意,有兩種形式的方法。注解也可以用在方法上。 ??這一部分翻譯自 Spring 5.0.0.M1 文檔中的 Using @ModelAttribute on a method 一節(jié)。這一節(jié)的演示示例在這個(gè)項(xiàng)目的 mvc 分支中的 ModelAttrController.ja...
摘要:分發(fā)處理器將會(huì)掃描使用了該注解的類的方法,并檢測(cè)該方法是否使用了注解。作用該注解用于將的方法返回的對(duì)象,通過(guò)適當(dāng)?shù)霓D(zhuǎn)換為指定格式后,寫入到對(duì)象的數(shù)據(jù)區(qū)。用于注解層,在類上面注解。使用標(biāo)記的參數(shù)。 1、@Controller 在SpringMVC 中,控制器Controller 負(fù)責(zé)處理由DispatcherServlet 分發(fā)的請(qǐng)求,它把用戶請(qǐng)求的數(shù)據(jù)經(jīng)過(guò)業(yè)務(wù)處理層處理之后封裝成一個(gè)M...
摘要:和一起使用參照博文從原理層面掌握的使用一起學(xué)。至于具體原因,可以移步這里輔助理解從原理層面掌握的使用核心原理篇一起學(xué)再看下面的變種例子重要訪問(wèn)。 每篇一句 每個(gè)人都應(yīng)該想清楚這個(gè)問(wèn)題:你是祖師爺賞飯吃的,還是靠老天爺賞飯吃的 前言 上篇文章 描繪了@ModelAttribute的核心原理,這篇聚焦在場(chǎng)景使用上,演示@ModelAttribute在不同場(chǎng)景下的使用,以及注意事項(xiàng)(當(dāng)然有些...
摘要:雖然它不是必須,但是它是個(gè)很好的輔助官方解釋首先看看官方的對(duì)它怎么說(shuō)它將方法參數(shù)方法返回值綁定到的里面。解析注解標(biāo)注的方法參數(shù),并處理標(biāo)注的方法返回值。 每篇一句 我們應(yīng)該做一個(gè):胸中有藍(lán)圖,腳底有計(jì)劃的人 前言 Spring MVC提供的基于注釋的編程模型,極大的簡(jiǎn)化了web應(yīng)用的開發(fā),我們都是受益者。比如我們?cè)贎RestController標(biāo)注的Controller控制器組件上用@...
摘要:關(guān)鍵注解的關(guān)鍵注解主要有其中主要是用于標(biāo)記該類是一個(gè)控制器,用于指示的哪一個(gè)類或方法來(lái)處理請(qǐng)求動(dòng)作,即用于標(biāo)識(shí)具體的處理器。默認(rèn)已經(jīng)裝配了作為組件的實(shí)現(xiàn)類,而由使用,將請(qǐng)求信息轉(zhuǎn)換為對(duì)象。 關(guān)鍵注解 springmvc的關(guān)鍵注解主要有@Controller/@RequestMapping/@RequestParam/@PathVariable/@RequestHeader/@Cooki...
閱讀 2212·2021-11-22 13:52
閱讀 3847·2021-11-10 11:36
閱讀 1380·2021-09-24 09:47
閱讀 1088·2019-08-29 13:54
閱讀 3360·2019-08-29 13:46
閱讀 1942·2019-08-29 12:16
閱讀 2108·2019-08-26 13:26
閱讀 3471·2019-08-23 17:10