Spring、SpringMVC中常用注解含義及用法

1、@Controller (注入服務(wù))

@Component擴(kuò)展,被@Controller注解的類表示W(wǎng)eb層實(shí)現(xiàn),從而見(jiàn)到該注解就想到Web層實(shí)現(xiàn),使用方式和@Component相同;

在SpringMVC中只需要使用這個(gè)標(biāo)記一個(gè)類是Controller,然后使用@RequestMapping和@RequestParam等一些注解用以定義URL請(qǐng)求和Controller方法之間的映射,這樣的Controller就能被外界訪問(wèn)到。此外,Controller不會(huì)直接依賴于HttpServletRequest 和HttpServletResponse 等HttpServlet 對(duì)象,他們可以通過(guò)Controller的方法參數(shù)靈活的獲取到。

舉個(gè)例子:

在上面的例子中,@Controller是標(biāo)記在類TestController上面的, 所以類TestController就是一個(gè)SpringMVC Controller對(duì)象。分發(fā)處理器會(huì)掃描使用了該注解的類的方法,并檢測(cè)該方法是否調(diào)用了@RequestMapping注解。@Controller只是定義了一個(gè)控制器類,而使用@RequestMapping注解的方法才是真正處理請(qǐng)求的處理器。然后使用@RequestMapping ( "/showView" )標(biāo)記在Controller方法上,表示當(dāng)請(qǐng)求/showView.do 的時(shí)候訪問(wèn)的是TestController 的showView 方法,該方法返回了一個(gè)包括Model 和View 的ModelAndView 對(duì)象。

單單使用@Controller 標(biāo)記在一個(gè)類上還不能真正意義上的說(shuō)它就是SpringMVC 的一個(gè)控制器類,因?yàn)檫@個(gè)時(shí)候Spring 還不認(rèn)識(shí)它。那么要如何做Spring 才能認(rèn)識(shí)它呢?這個(gè)時(shí)候就需要把這個(gè)控制器類交給Spring 來(lái)管理。

第一種方式是在SpringMVC 的配置文件中定義MyController 的bean 對(duì)象。

<bean class="com.host.app.web.controller.TestController"/>

? ? 第二種方式是在SpringMVC 的配置文件中告訴Spring 該到哪里去找標(biāo)記為@Controller 的Controller 控制器。

? ? ? ? < context:component-scan base-package = "com.host.app.web.controller" >

? ? ? ? ? < context:exclude-filter type = "annotation"

? ? ? ? ? ? ? expression = "org.springframework.stereotype.Service" />

? ? ? ? </ context:component-scan >

? 注:上面 context:exclude-filter 標(biāo)注的是不掃描 @Service 標(biāo)注的類

2、@RequestMapping?

使用 @RequestMapping 來(lái)映射 Request 請(qǐng)求與處理器,通過(guò)這個(gè)注解可以定義不同的處理器映射規(guī)則,即為控制器指定可以處理哪些URL請(qǐng)求。

用@RequestMapping 來(lái)映射URL 到控制器類,或者是到Controller 控制器的處理方法上。當(dāng)@RequestMapping 標(biāo)記在Controller 類上的時(shí)候,里面使用@RequestMapping 標(biāo)記的方法的請(qǐng)求地址都是相對(duì)于類上的@RequestMapping 而言的;當(dāng)Controller 類上沒(méi)有標(biāo)記@RequestMapping 注解時(shí),方法上的@RequestMapping 都是絕對(duì)路徑。這種絕對(duì)路徑和相對(duì)路徑所組合成的最終路徑都是相對(duì)于根路徑“/ ”而言的。

在上面那個(gè)例子中:

這個(gè)控制器里因?yàn)門estController 沒(méi)有被@RequestMapping 標(biāo)記,所以當(dāng)需要訪問(wèn)到里面使用了@RequestMapping 標(biāo)記的showView 方法時(shí),就是使用的絕對(duì)路徑/showView.do 請(qǐng)求就可以了。

如果改成這樣:

這種情況下是在控制器上加了@RequestMapping 注解,所以當(dāng)需要訪問(wèn)到里面使用了@RequestMapping 標(biāo)記的方法showView() 的時(shí)候就需要使用showView 方法上@RequestMapping 相對(duì)于控制器TestController上@RequestMapping 的地址,即/test/showView.do 。

URL路徑映射:@RequestMapping("/hello"),可以將多個(gè)url映射到同一個(gè)方法上。

窄化請(qǐng)求映射:

(1)在class上面添加@RequestMapping(url)指定通用請(qǐng)求前綴,限制此類下的所有方法請(qǐng)求url必須以請(qǐng)求前綴開(kāi)頭,通過(guò)此方法來(lái)分類管理url;

(2)在方法名上面再設(shè)置請(qǐng)求映射url,即添加@RequestMapping注解在方法名上。return “/WEB-INF/jsp/login.jsp”? 調(diào)用這個(gè)方法,重定向的到指定的jsp頁(yè)面或制定的@RequestMapping的請(qǐng)求路徑;

(3)在瀏覽器上輸入相應(yīng)地址,完成訪問(wèn)。

3、@RequestBody

用于讀取http請(qǐng)求的內(nèi)容(字符串),通過(guò)springMVC提供的HttpMessageConverter接口將讀取到的內(nèi)容轉(zhuǎn)換為json、xml等格式的數(shù)據(jù),再轉(zhuǎn)換為java對(duì)象綁定到Controller類方法的參數(shù)上。

簡(jiǎn)單點(diǎn)來(lái)說(shuō),就是把json格式的數(shù)據(jù)轉(zhuǎn)換為java對(duì)象,就舉個(gè)例子來(lái)說(shuō)明:

編寫一個(gè)jsp頁(yè)面來(lái)向后臺(tái)傳遞json格式的數(shù)據(jù)(切記是json格式的):

然后在后臺(tái)接收一下:

這樣的話,前臺(tái)的兩個(gè)json數(shù)據(jù)就會(huì)自動(dòng)匹配到User這個(gè)對(duì)象的屬性中了,當(dāng)然屬性名稱要一樣的。

查看一下結(jié)果:

可以看到User這個(gè)對(duì)象中的username和address都已經(jīng)自動(dòng)賦值好了,這個(gè)就是json格式的數(shù)據(jù)轉(zhuǎn)java對(duì)象了,可以省去我們?cè)诤笈_(tái)將json轉(zhuǎn)成java對(duì)象。不過(guò)在使用的時(shí)候,要注意兩邊的名稱要相同,前臺(tái)的username要對(duì)應(yīng)java對(duì)象中的username這樣才能成功。否則得到如下:

4、@ResponseBody?

含義:

@Responsebody 注解表示該方法的返回的結(jié)果直接寫入 HTTP 響應(yīng)正文(ResponseBody)中,一般在異步獲取數(shù)據(jù)時(shí)使用,通常是在使用 @RequestMapping 后,返回值通常解析為跳轉(zhuǎn)路徑,加上 @Responsebody 后返回結(jié)果不會(huì)被解析為跳轉(zhuǎn)路徑,而是直接寫入HTTP 響應(yīng)正文中。

作用:

用于將Controller中方法返回的對(duì)象通過(guò)適當(dāng)?shù)腍ttpMessageConverter轉(zhuǎn)換為指定格式的數(shù)據(jù),如:json、xml等,然后寫入到response對(duì)象的body區(qū),通過(guò)Response響應(yīng)給客戶端。需要注意的是,在使用此注解之后不會(huì)再走試圖處理器,而是直接將數(shù)據(jù)寫入到輸入流中,他的效果等同于通過(guò)response對(duì)象輸出指定格式的數(shù)據(jù)。

使用時(shí)機(jī):

返回的數(shù)據(jù)不是html標(biāo)簽的頁(yè)面,而是其他某種格式的數(shù)據(jù)時(shí)(如json、xml等)使用;

舉個(gè)例子:

? ?

User字段是:userName pwd

那么在前臺(tái)接收到的數(shù)據(jù)為:'{"userName":"xxx","pwd":"xxx"}'

效果等同于如下代碼:

5、@ModelAttribute?

在方法定義上使用該注解: SpringMVC在調(diào)用目標(biāo)處理方法前, 會(huì)先逐個(gè)調(diào)用在方法級(jí)上標(biāo)注了@ModelAttribute的方法;

在方法的入?yún)⑶笆褂迷撟⒔猓嚎梢詮碾[含對(duì)象中獲取隱含的模型數(shù)據(jù)中獲取對(duì)象,再將請(qǐng)求參數(shù) –綁定到對(duì)象中,再傳入入?yún)⒎椒ㄈ雲(yún)?duì)象添加到模型中。

6、@RequestParam?

處理簡(jiǎn)單類型的綁定,用 @RequestParam 綁定 HttpServletRequest 請(qǐng)求參數(shù)到控制器方法參數(shù),即在處理方法入?yún)⑻幨褂迷撟⒔?,可以把?qǐng)求參數(shù)傳遞給請(qǐng)求方法。

?在上面代碼中利用@RequestParam 從HttpServletRequest 中綁定了參數(shù)name 到控制器方法參數(shù)name ,綁定了參數(shù)age 到控制器方法參數(shù)age 。當(dāng)沒(méi)有明確指定從request 中取哪個(gè)參數(shù)時(shí),Spring 在代碼是debug 編譯的情況下會(huì)默認(rèn)取跟方法參數(shù)同名的參數(shù),如果不是debug 編譯的就會(huì)報(bào)錯(cuò)。此外,當(dāng)需要從request 中綁定的參數(shù)和方法的參數(shù)名不相同的時(shí)候,也需要在@RequestParam 中明確指出是要綁定哪個(gè)參數(shù)。在上面的代碼中如果訪問(wèn)? /requestParam.do?name=hello&age=1? 則Spring 將會(huì)把request請(qǐng)求參數(shù)name的值hello賦給對(duì)應(yīng)的處理方法參數(shù)name ,把參數(shù)age 的值1 賦給對(duì)應(yīng)的處理方法參數(shù)age 。

在@RequestParam 中除了指定綁定哪個(gè)參數(shù)的屬性value之外,還有一個(gè)屬性required,它表示所指定的參數(shù)是否必須在request 屬性中存在,默認(rèn)是true,表示必須存在,當(dāng)不存在時(shí)就會(huì)報(bào)錯(cuò)。在上面代碼中我們指定了參數(shù)name的required的屬性為false ,而沒(méi)有指定age 的required 屬性,這時(shí)候如果我們?cè)L問(wèn)/requestParam.do而沒(méi)有傳遞參數(shù)的時(shí)候,系統(tǒng)就會(huì)拋出異常,因?yàn)閍ge 參數(shù)是必須存在的,而我們沒(méi)有指定。而如果我們?cè)L問(wèn)? /requestParam.do?age=1? 的時(shí)候就可以正常訪問(wèn),因?yàn)槲覀儌鬟f了必須的參數(shù)age ,而參數(shù)name是非必須的,不傳遞也可以。

value:參數(shù)名,即入?yún)⒌恼?qǐng)求參數(shù)名字

如:value="id",表示將請(qǐng)求的參數(shù)區(qū)的名字為id的參數(shù)的值等待傳入;

require:是否必需,默認(rèn)是true,表示請(qǐng)求中一定要有相應(yīng)的參數(shù),否則會(huì)報(bào)400錯(cuò)誤。且在每個(gè)參數(shù)定義前設(shè)置。

defaultValue:默認(rèn)值,表示如果請(qǐng)求中沒(méi)有同名參數(shù)時(shí)的默認(rèn)值。

通過(guò) require=true 限定參數(shù)id必須傳遞,如果不傳遞會(huì)報(bào)400錯(cuò)誤;

可以使用defaultValue設(shè)置默認(rèn)值,即使 require=true 也可以不傳遞id參數(shù)。

7、@PathVariable? ? 綁定URL占位符到入?yún)ⅰ?/p>

8、@ExceptionHandler? ? 注解到方法上, 出現(xiàn)異常時(shí)會(huì)執(zhí)行該方法。

9、@ControllerAdvice? ? 使一個(gè)Controller成為全局的異常處理類, 類中用ExceptinHandler方法注解的方法可以處理所有Controller發(fā)生的異常。

10、@Autowired

它可以對(duì)類成員變量、方法以及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作。自動(dòng)裝配的意思就是讓Spring從應(yīng)用上下文中找到對(duì)應(yīng)的bean的引用,并將它們注入到指定的bean。通過(guò)@Autowired注解可以完成自動(dòng)裝配。使用@Autowired 來(lái)消除代碼Java代碼里面的getter/setter與bean屬性中的property。當(dāng)然,getter看個(gè)人需求,如果私有屬性需要對(duì)外提供的話,應(yīng)當(dāng)予以保留。

只要對(duì)應(yīng)類型的bean有且只有一個(gè),則會(huì)自動(dòng)裝配到該屬性上。如果沒(méi)有找到對(duì)應(yīng)的bean,應(yīng)用會(huì)拋出對(duì)應(yīng)的異常,如果想避免拋出這個(gè)異常,則需要設(shè)置@Autowired(required=false)。不過(guò),在應(yīng)用程序設(shè)計(jì)中,應(yīng)該謹(jǐn)慎設(shè)置這個(gè)屬性,因?yàn)檫@會(huì)使得你必須面對(duì)NullPointerException的問(wèn)題。

如果存在多個(gè)同一類型的bean,則Spring會(huì)拋出異常,表示裝配有歧義,解決辦法有兩個(gè):

(1)通過(guò)@Qualifier注解指定需要的bean的ID;

(2)通過(guò)@Resource注解指定注入特定ID的bean;

@Autowired 和 @Service("")的配合使用:

實(shí)例:

在Controller中對(duì)私有變量用@Autowired標(biāo)注,因?yàn)閟tudentService這個(gè)變量是service層接口,所以要找到他的實(shí)現(xiàn)類StudentServiceImpl,并在實(shí)現(xiàn)類上添加@Service("")的注釋。

如果不添加@Service("")注釋,會(huì)報(bào)如下錯(cuò)誤。因?yàn)锧Autowired 將尋找與之匹配的bean來(lái)創(chuàng)建(類名)bena,但因?yàn)閯h除接口實(shí)現(xiàn)類上@Service("")注解,找不到服務(wù)對(duì)象,@Autowired自然也就找不到實(shí)例bean了。

11、@Override?

@Override是偽代碼,表示重寫(當(dāng)然不寫也可以),不過(guò)也有好處:

? ? ? ? ? ? (1)可以當(dāng)注釋用,方便閱讀;

? ? ? ? ? ? (2)編譯器可以給你驗(yàn)證@Override下面的方法名是否是你父類中所有的,如果沒(méi)有則報(bào)錯(cuò)。

例如,你如果沒(méi)寫@Override,而你下面的方法名又寫錯(cuò)了,這時(shí)你的編譯器是可以編譯通過(guò)的,因?yàn)榫幾g器以為這個(gè)方法是你的子類中自己增加的方法。

舉例:在重寫父類的onCreate時(shí),在方法前面加上@Override 系統(tǒng)可以幫你檢查方法的正確性。

? ? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? ? ? public void onCreate(Bundle savedInstanceState)

? ? ? ? ? ? ? ? ? ? {…….}

這種寫法是正確的,如果你寫成:

? ? ? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? ? ? public void oncreate(Bundle savedInstanceState)

? ? ? ? ? ? ? ? ? ? {…….}

編譯器會(huì)報(bào)如下錯(cuò)誤:

? ? ? ? ? ? ? ? ? ? The method oncreate(Bundle) of type HelloWorld must override or implement a supertype method,以確保你正確重寫onCreate方法(因?yàn)閛ncreate應(yīng)該為onCreate)。

而如果你不加@Override,則編譯器將不會(huì)檢測(cè)出錯(cuò)誤,而是會(huì)認(rèn)為你為子類定義了一個(gè)新方法:oncreate

12、@Transactional

使用時(shí)機(jī):

對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行批量或連表操作時(shí),為了保證數(shù)據(jù)的一致性和正確性,則需要添加事務(wù)管理機(jī)制進(jìn)行管理;

當(dāng)對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)操作失敗時(shí),事務(wù)管理可以很好保證所有的數(shù)據(jù) 回滾 到原來(lái)的數(shù)據(jù),如果操作成功,則保證所有的需要更新的數(shù)據(jù)持久化。

回滾(Rollback)指的是程序或數(shù)據(jù)處理錯(cuò)誤,將程序或數(shù)據(jù)恢復(fù)到上一次正確狀態(tài)的行為。

回滾包括程序回滾和數(shù)據(jù)回滾等類型。

刪除由一個(gè)或多個(gè)部分完成的事務(wù)執(zhí)行的更新。為保證應(yīng)用程序、數(shù)據(jù)庫(kù)或系統(tǒng)錯(cuò)誤后還原數(shù)據(jù)庫(kù)的完整性,需要使用回滾。

回滾泛指程序更新失敗, 返回上一次正確狀態(tài)的行為。

回滾與恢復(fù)有本質(zhì)的區(qū)別。

升級(jí)回滾:是指因升級(jí)中所發(fā)生的意外而自動(dòng)回滾。

使用優(yōu)點(diǎn):

(1)開(kāi)發(fā)團(tuán)隊(duì)達(dá)成一致約定,明確標(biāo)注事務(wù)方法的編程風(fēng)格;

(2)保證事務(wù)方法的執(zhí)行時(shí)間盡可能短,不要穿插其他網(wǎng)絡(luò)操作,RPC/HTTP請(qǐng)求或者剝離到事務(wù)方法外部;

(3)不是所有的方法都需要事務(wù),如果只有一條修改操作、只讀操作不需要事務(wù)控制。

13、@Param

mybatis提供了一個(gè)使用注解來(lái)參入多個(gè)參數(shù)的方法,這種方法需要在接口的參數(shù)上添加@Param注解。

舉個(gè)例子:

在這個(gè)updateInfo的方法中需要傳入多個(gè)參數(shù),那么在進(jìn)行mybatis配置的時(shí)候,沒(méi)有辦法同事配置多個(gè)參數(shù),所以需要@Param這個(gè)注解來(lái)綁定參數(shù)對(duì)象。student這個(gè)參數(shù)中包含了三個(gè)對(duì)象,用@Param來(lái)綁定參數(shù)并命名為"student"。并且在mapper.xml文件中調(diào)用時(shí),對(duì)逐個(gè)參數(shù)在調(diào)用時(shí),要加上 student. 的前綴。如下所示:

? ? ? ? <update id="updateInfo">

? ? ? ? ? ? UPDATE test_student SET name=#{student.name},age=#{student.age} WHERE id=#{student.id}

? ? ? ? </update>

注意事項(xiàng):在使用@Param來(lái)注解時(shí),如果使用#{ } 或者 ${ } 的方式都可以,但如果不是用@Param注解時(shí),則必須使用#{ }方式。

14、@Component (把普通pojo實(shí)例化到spring容器中,相當(dāng)于配置文件中的 <bean id="" class=""/>)

定義Spring管理Bean

在Java配置文件中有兩個(gè)注解值得注意:

@Configuration? ? 表示這個(gè).java文件是一個(gè)配置文件;

@ComponentScan? 表示開(kāi)啟Component掃描,Spring將會(huì)設(shè)置該目錄以及子目錄下所有被@Component注解修飾的類。

15、@Configuration

表示這個(gè)類是一個(gè)spring 配置類,一般這里面會(huì)定義Bean,會(huì)把這個(gè)類中bean加載到spring容器中。

16、@Bean

在JavaConfig中的屬性注入:

看起來(lái)是函數(shù)調(diào)用,實(shí)際上不是:由于sgtPeppers()方法被@Bean注解修飾,所以Spring會(huì)攔截這個(gè)函數(shù)調(diào)用,并返回之前已經(jīng)創(chuàng)建好的bean——確保該SgtPeppers bean為單例。

17、@ComponentScan

@ComponentScan主要就是定義掃描的路徑從中找出標(biāo)識(shí)了需要裝配的類自動(dòng)裝配到spring的bean容器中。且這個(gè)注解默認(rèn)會(huì)裝配標(biāo)識(shí)了@Controller,@Service,@Repository,@Component注解的類到spring容器中。

如果不設(shè)置basePackage的話,默認(rèn)會(huì)掃描包的所有類,所以最好還是寫上basePackage,減少加載時(shí)間。默認(rèn)掃描**/*.class路徑,比如這個(gè)注解在com.wuhulala下面,那么會(huì)掃描這個(gè)包下的所有類還有子包的所有類。比如com.wuhulala.service包的應(yīng)用。

總結(jié)@ComponentScan的常用方式:

? ? 自定掃描路徑下邊帶有@Controller,@Service,@Repository,@Component注解加入spring容器

? ? 通過(guò)includeFilters加入掃描路徑下沒(méi)有以上注解的類加入spring容器

? ? 通過(guò)excludeFilters過(guò)濾出不用加入spring容器的類

? ? 自定義增加了@Component注解的注解方式

18、@Service (注入dao)

用于標(biāo)注服務(wù)層,主要用來(lái)進(jìn)行業(yè)務(wù)的邏輯處理。@Component擴(kuò)展,被@Service注解的POJO類表示Service層實(shí)現(xiàn),從而見(jiàn)到該注解就想到Service層實(shí)現(xiàn),使用方式和@Component相同;

19、@Repository (實(shí)現(xiàn)dao訪問(wèn))

用于標(biāo)注數(shù)據(jù)訪問(wèn)層,也可以說(shuō)用于標(biāo)注數(shù)據(jù)訪問(wèn)組件,即DAO組件。@Component擴(kuò)展,被@Repository注解的POJO類表示DAO層實(shí)現(xiàn),從而見(jiàn)到該注解就想到DAO層實(shí)現(xiàn),使用方式和@Component相同;

@RequestParam和@RequestBody的區(qū)別

@RequestParam

A) 常用來(lái)處理簡(jiǎn)單類型的綁定,通過(guò)Request.getParameter() 獲取的String可直接轉(zhuǎn)換為簡(jiǎn)單類型的情況( 由String到 簡(jiǎn)單類型的轉(zhuǎn)換操作由ConversionService配置的轉(zhuǎn)換器來(lái)完成);因?yàn)槭褂胷equest.getParameter()方式獲取參數(shù),所以可以處理get 方式中queryString的值,也可以處理post方式中 body data的值。

B)用來(lái)處理Content-Type: 為 application/x-www-form-urlencoded編碼的內(nèi)容,提交方式GET、POST。(不設(shè)置這個(gè)屬性,好像這就是默認(rèn)值)

C) 該注解有兩個(gè)屬性: value、required; value用來(lái)指定要傳入值的id名稱,required用來(lái)指示參數(shù)是否必須綁定。

在方法參數(shù)里面如是:

@RequestBody

處理HttpEntity傳遞過(guò)來(lái)的數(shù)據(jù),一般用來(lái)處理非Content-Type: application/x-www-form-urlencoded編碼格式的數(shù)據(jù)。

GET請(qǐng)求中,因?yàn)闆](méi)有HttpEntity,所以@RequestBody并不適用。

POST請(qǐng)求中,通過(guò)HttpEntity傳遞的參數(shù),必須要在請(qǐng)求頭中聲明數(shù)據(jù)的類型Content-Type,SpringMVC通過(guò)使用HandlerAdapter 配置的HttpMessageConverters來(lái)解析HttpEntity中的數(shù)據(jù),然后綁定到相應(yīng)的bean上。

用于將Controller中方法返回的對(duì)象,通過(guò)適當(dāng)?shù)腍ttpMessageConverter轉(zhuǎn)換為指定格式的數(shù)據(jù),如:json、xml等,然后通過(guò)Response響應(yīng)給客戶端。

在方法參數(shù)里面如是:

?

總結(jié)

在GET請(qǐng)求中,不能使用@RequestBody。

在POST請(qǐng)求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,對(duì)于參數(shù)轉(zhuǎn)化的配置必須統(tǒng)一。

舉個(gè)例子,在SpringMVC配置了HttpMessageConverters處理?xiàng)V?,指定json轉(zhuǎn)化的格式,如Date轉(zhuǎn)成‘yyyy-MM-dd’,則參數(shù)接收對(duì)象包含的字段如果是Date類型,就只能讓客戶端傳遞年月日的格式,不能傳時(shí)分秒。因?yàn)椴煌慕涌冢膮?shù)可能對(duì)時(shí)間參數(shù)有不同的格式要求,所以這樣做會(huì)讓客戶端調(diào)用同事對(duì)參數(shù)的格式有點(diǎn)困惑,所以說(shuō)擴(kuò)展性不高。

如果使用@RequestParam來(lái)接受參數(shù),可以在接受參數(shù)的model中設(shè)置@DateFormat指定所需要接受時(shí)間參數(shù)的格式。

另外,使用@RequestBody接受的參數(shù)是不會(huì)被Servlet轉(zhuǎn)化統(tǒng)一放在request對(duì)象的Param參數(shù)集中,@RequestParam是可以的。

綜上所述,一般情況下,推薦使用@RequestParam注解來(lái)接受Http請(qǐng)求參數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容