spring mvc学习(7):springmvc学习笔记(常用注解)
1. @Controller
@Controller注解用于表示一個(gè)類的實(shí)例是頁面控制器(后面都將稱為控制器). 使用@Controller注解定義的控制器有如下特點(diǎn):
spring自動(dòng)掃描所有基于注解的類, 并將其注冊(cè)為spring的bean, DispatcherServlet自動(dòng)掃描注解為@Controller的類, 查找其中使用了@RequestMapping的方法, 這些方法是真正處理請(qǐng)求方法.
<!-- 掃描包路徑com.lizj.controller下的所有類, 將帶有注解的類注冊(cè)到spring容器中 --> <context:component-scan base-package="com.lizj.controller" /><!-- 視圖解釋器 --> <!-- 配置的視圖解析器為InternalResourceViewResolver, 并為其添加了前綴prefix和后綴suffix屬性 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 前綴 --><property name="prefix" value="/WEB-INF/jsp/" /><!-- 后綴 --><property name="suffix" value=".jsp" /> </bean>此示例中沒有配置處理映射器和處理器適配器, spring將使用默認(rèn)的處理映射器和處理器適配器來處理請(qǐng)求.
下面是使用@Controller注解定義的控制器
/*** 基于注解的控制器*/ @Controller public class HelloController {}2. @RequestMapping
2.1 @RequestMapping注解
@RequestMapping注解用來表示請(qǐng)求具體由哪個(gè)類的哪個(gè)方法來處理. 即
@RequestMapping既可以用來注解一個(gè)類, 也可以用來注解一個(gè)方法. 當(dāng)用來注解一個(gè)類的時(shí)候, 所有方法都將映射為相對(duì)于類級(jí)的請(qǐng)求.
@RequestMapping注解支持的屬性
| name | String | 否 | 映射地址別名, 一般不設(shè)置 |
| value | String[] | 否 | 指定請(qǐng)求的地址映射到方法上 |
| method | RequestMethod[] | 否 | 請(qǐng)求的方法類型, 包括GET,POST,HEAD,OPTIONS,PUT,PATCH,DELETE,TRACE |
| consumes | String[] | 否 | 指定處理請(qǐng)求的提交內(nèi)容類型(Content-Type),例如application/json |
| produces | String[] | 否 | 指定返回的內(nèi)容類型, 返回的內(nèi)容類型必須是request請(qǐng)求頭(Accept)中包含的類型 |
| params | String[] | 否 | 指定request中必須包含某些參數(shù)值時(shí), 此方法才處理此請(qǐng)求 |
| header | String[] | 否 | 指定request中必須包含某些指定的header值, 此方法才處理此請(qǐng)求 |
| path | String[] | 否 | In a Servlet environment... 就是value屬性的別名, value屬性沒有含義不確切, path含義更明確 |
常用的@RequestMapping屬性:
value屬性用于將請(qǐng)求映射到方法上. value屬性是@RequestMapping的默認(rèn)屬性, 當(dāng)只有唯一的屬性時(shí), 則可以省略屬性名, 如下兩個(gè)注解含義是一樣的:
method屬性指定此方法只處理哪些HTTP請(qǐng)求. 例如:
如果沒有配置method屬性, 則此方法可以處理任意的HTTP請(qǐng)求.
兩個(gè)示例:
示例類: com.lizj.controller_01.HelloController01
訪問地址: http://127.0.0.1:8080/springmvc03/hello
示例類: com.lizj.controller_01.HelloController02
訪問地址: http://127.0.0.1:8080/springmvc03/hello/hello
2.2 支持的方法參數(shù)類型
每個(gè)請(qǐng)求處理方法都可以有多個(gè)參數(shù), 參數(shù)類型可以為以下類型, 可根據(jù)需要添加方法聲明參數(shù).
- javax.servlet.ServletRequest 或 javax.servlet.http.HttpServletRequest
- javax.servlet.ServletResponse 或 javax.servlet.http.HttpServletResponse
- javax.servlet.http.HttpSession
- org.springframework.web.context.request.WebRequest 或 org.springframework.web.context.request.NativeWebRequeset
- java.util.Locale
- java.io.InputStream 或 java.io.Reader 用于訪問請(qǐng)求正文, 這兩個(gè)對(duì)象與通過Servlet API拿到的InputSteam和Reader對(duì)象是一樣的
- java.io.OutputSteam 或 java.io.Writer 用于生成響應(yīng)正文, 這兩個(gè)對(duì)象與通過Servlet API拿到的OutputSteam和Writer對(duì)象是一樣的
- java.security.Principal 包裝了當(dāng)前被誰的用戶信息
- org.springframework.http.HttpEntity<T> 其提供了對(duì)HTTP請(qǐng)求頭和請(qǐng)求內(nèi)容的存取
- org.springframework.web.servlet.mvc.support.RedirectAttributes 用以指定重定向下要使用到的屬性集以及添加flash屬性(暫存在服務(wù)端的屬性,它們會(huì)在下次重定向請(qǐng)求的范圍中有效)
- org.springframework.validation.Errors 或 org.springframework.validation.BindingResult 驗(yàn)證結(jié)果對(duì)象,用于存儲(chǔ)前面的命令或表單對(duì)象的驗(yàn)證結(jié)果(緊接其前的第一個(gè)方法參數(shù))
- org.springframework.web.bind.support.SessionStatus 用以標(biāo)記當(dāng)前的表單處理已結(jié)束
- org.springframework.web.util.UriComponentsBuilder 構(gòu)造器對(duì)象, 用于構(gòu)造當(dāng)前請(qǐng)求URL相關(guān)的信息, 比如主機(jī)名、端口號(hào)、資源類型(scheme)、上下文路徑、servlet映射中的相對(duì)部分(literal part)等
- @PathVariable @MatrixVariable
- java.util.Map 或 org.springframework.io.Model 或 org.springframework.ui.ModelMap 用以增強(qiáng)默認(rèn)暴露給視圖層的模型(model)的功能
- 帶有@RequestParam注解的參數(shù), 其存放了Servlet請(qǐng)求中所指定的參數(shù). 參數(shù)的值會(huì)被轉(zhuǎn)換成方法參數(shù)所聲明的類型
- 帶有@RequestHeader注解的參數(shù), 其存放了Servlet請(qǐng)求中所指定的HTTP請(qǐng)求頭的值. 參數(shù)的值會(huì)被轉(zhuǎn)換成方法參數(shù)所聲明的類型
- 帶有@RequestBody注解的參數(shù), 提供了對(duì)HTTP請(qǐng)求體的存取. 參數(shù)的值通過HttpMessageConverter被轉(zhuǎn)換成方法參數(shù)所聲明的類型
- 帶有@RequestPart注解的參數(shù), 提供了對(duì)一個(gè)"multipart/form-data請(qǐng)求塊(request part)內(nèi)容的存取
- 命令或表單對(duì)象, 它們用于將請(qǐng)求參數(shù)直接綁定到bean字段(可能是通過setter方法)
在參數(shù)列表中, Errors或BindingResult參數(shù)必須緊跟在其所綁定的驗(yàn)證對(duì)象后面. 這是因?yàn)? 在參數(shù)列表中允許有多于一個(gè)的模型對(duì)象, spring會(huì)為它們創(chuàng)建不同的BindingResult實(shí)例
所有方法參數(shù)中, 最重要的是org.springframework.ui.Model, 它是一個(gè)接口, 功能類似于java.util.Map, 用于存儲(chǔ)模型數(shù)據(jù). springmvc調(diào)用處理方法前, 會(huì)創(chuàng)建一個(gè)隱含的模型對(duì)象, 作為模型數(shù)據(jù)的存儲(chǔ)容器. 如果處理方法的方法參數(shù)為Model, 那么springmvc會(huì)將模型的引用傳遞給此參數(shù). 那么在方法內(nèi)部就可以訪問模型中的數(shù)據(jù), 也可以向模型中添加新的屬性數(shù)據(jù).
/** springmvc中controller中的方法參數(shù), 支持大多數(shù)常用的數(shù)據(jù)類型, * 如: String, int.... */ // 需要注意的是, 此處請(qǐng)求參數(shù)名必須與方法參數(shù)名一致, 否則獲取不到參數(shù)值, 后面@RequestParam再做詳細(xì)解釋 @RequestMapping("/get") public String getUser(String id, Model model) {User user = null;for(int i=0; i<userList.size(); i++) {User u = userList.get(i);if(u.getId().equals(id)) {user = u;break ;}}if(user == null) {user = new User();user.setId("001");user.setName("張三");user.setAge(18);user.setSex("男");}// 向model中添加數(shù)據(jù)model.addAttribute("user", user);// 返回視圖名稱return "user/oneuser"; }兩個(gè)示例:
示例類: com.lizj.controller_02.UserController01
訪問地址: http://127.0.0.1:8080/springmvc003/user01/get
示例類: com.lizj.controller_02.UserController02
訪問地址: http://127.0.0.1:8080/springmvc003/user02/get?userId=2
2.3 支持的方法返回類型
請(qǐng)求處理方法的返回類型如下:
- org.springframework.web.servlet.ModelAndView
- org.springframework.ui.Model
- java.util.Map<K, V>
- org.springframework.web.servlet.View
- java.lang.String
- HttpEntity<?> 或 ResponseEntity<?>
- java.util.concurrent.Callable
- org.springframework.web.context.request.async.DeferredResult<?>
- void
如果控制器處理方法的返回值是ModelAndView類型, 其既包括模型數(shù)據(jù), 又包括視圖信息, 那么springmvc就可以使用包含的視圖對(duì)模型數(shù)據(jù)進(jìn)行渲染, 而且可以非常方便的訪問模型數(shù)據(jù). ModelAndview對(duì)象常用的添加模型數(shù)據(jù)和設(shè)置視圖的方法如下:
// 添加模型數(shù)據(jù) addObject(String attributeName, Object attributeValue); // 設(shè)置視圖 setViewName(String viewName);示例類: com.lizj.controller_02.UserController03
訪問地址: http://127.0.0.1:8080/springmvc003/user03/get?userId=3
3. @RequestParam
@RequestParam注解用于將指定的請(qǐng)求參數(shù)賦值給方法的參數(shù).
@RequestParam注解支持的屬性
| 屬性 | 類型 | 是否必要 | 說明 |
| :-------- | :-------- | :-------- | :-------- |
| name | String | 否 | 指定請(qǐng)求參數(shù)綁定的名稱 |
| value | String | 否 | name屬性的別名 |
| required | boolean | 否 | 指示參數(shù)是否必須綁定 |
| default | String | 否 | 沒有參數(shù)時(shí)使用的默認(rèn)值 |
請(qǐng)求處理的方法的參數(shù)的類型為Java基本類型和String.
@RequestMapping(value="/add", method=RequestMethod.POST) public String add(@RequestParam("name") String name, @RequestParam("author") String author) {}當(dāng)方法參數(shù)沒有用@RequestParam修飾時(shí), 那么會(huì)默認(rèn)綁定同名的參數(shù).
示例類: com.lizj.controller_03.BookController
訪問地址: http://127.0.0.1:8080/springmvc003/book/books
4. @PathVariable
@PathVariable注解可以方便的從URL中獲取請(qǐng)求的參數(shù).
它只支持一個(gè)類型為String的屬性, 表示綁定的請(qǐng)求參數(shù)的名稱, 省略則默認(rèn)綁定同名的參數(shù).
示例類: com.lizj.controller_04.BookController04
訪問地址: http://127.0.0.1:8080/springmvc003/book04/books
5. @RequestHeader
@RequestHeader注解用于將請(qǐng)求的頭信息區(qū)數(shù)據(jù)映射到請(qǐng)求處理方法的參數(shù)上.
@RequestHeader注解支持的屬性
| name | String | 否 | 指定請(qǐng)求頭綁定的名稱 |
| value | String | 否 | name屬性的別名 |
| required | boolean | 否 | 指示參數(shù)是否必須綁定 |
| default | String | 否 | 沒有參數(shù)時(shí)使用的默認(rèn)值 |
示例類: com.lizj.controller_05.HeaderAndCookieController
訪問地址: http://localhost:8080/springmvc003/hac/show
關(guān)于http請(qǐng)求的header頭信息
參考: http://www.cnblogs.com/printN/p/6534529.html
6. @CookieValue
@CookieValue注解將Cookie數(shù)據(jù)映射到請(qǐng)求處理方法的參數(shù)上.
@CookieValue注解支持的屬性
| name | String | 否 | 指定請(qǐng)求頭綁定的名稱 |
| value | String | 否 | name屬性的別名 |
| required | boolean | 否 | 指示參數(shù)是否必須綁定 |
| default | String | 否 | 沒有參數(shù)時(shí)使用的默認(rèn)值 |
示例類: com.lizj.controller_05.HeaderAndCookieController
訪問地址: http://localhost:8080/springmvc003/hac/show
7. @SessionAttributes
@SessionAttributes注解指定Model中哪些數(shù)據(jù)需要轉(zhuǎn)存到session中.
@SessionAttributes注解支持的屬性
| names | String[] | 否 | Model中屬性的名稱, 儲(chǔ)存在session中也會(huì)用此名稱 |
| values | String[] | 否 | names屬性的別名 |
| types | Class<?>[] | 否 | 根據(jù)指定參數(shù)的類型, 將模型中對(duì)應(yīng)類型的參數(shù)存儲(chǔ)到session中 |
@SessionAttributes注解只能聲明在類上, 不能聲明在方法上.
示例類: com.lizj.controller_06.LoginController
訪問地址: http://localhost:8080/springmvc003/login
8. @ModelAttribute
@ModelAttribute注解用于將請(qǐng)求參數(shù)綁定到Model對(duì)象上.
@ModelAttribute只支持一個(gè)類型為String的屬性value, 表示綁定的屬性名稱.
需要注意的是, @ModelAttribute注解修飾的方法會(huì)在Controller的每個(gè)請(qǐng)求處理方法執(zhí)行前被執(zhí)行, 如果一個(gè)Controller映射了多個(gè)URL要注意這一問題.
示例類: com.lizj.controller_06.PageController
訪問地址: http://127.0.0.1:8080/springmvc003/mac/testPage
可結(jié)合示例, 閱讀下面幾種情況的介紹.
示例:
@ModelAttribute("paramName") public String getParam(@RequestParam("param") String param) {return param; }此方法將先于其他請(qǐng)求處理方法執(zhí)行, 并且將請(qǐng)求參數(shù)param的值, 以paramName為名稱, 指定為model的一個(gè)屬性, 此時(shí)model并沒有顯示的定義出來.
示例:
@ModelAttribute // 這次沒有使用@ModelAttribute注解的value屬性 public User getUserById(String userId) {return userService.getUserById(userId); }示例中沒有顯示的使用@RuquestParam注解, 而是使用了默認(rèn)綁定同名參數(shù).
本示例中, 方法的返回值類型為User, 且沒有使用@ModelAttribute注解的value屬性. 此時(shí), value的默認(rèn)名稱為方法返回值類型(首字母小寫), 即模型中的屬性名為方法返回值類型(首字母小寫). 也可以顯示的定義value屬性.
示例:
@ModelAttribute public void getUserById(String userId, Model model) {model.addAttribute("user", userService.getUserById(userId)); }這種寫法的前提是在請(qǐng)求處理方法中加入了一個(gè)Model參數(shù).
示例:
@RequestMapping("/show") @ModelAttribute("username") public String show(String userId) {User user = userService.getUserById(userId);return user.getName(); }示例中, @ModelAttribute和@RequestMapping共同修飾了show方法. 此時(shí)方法的返回值不再是視圖名稱, 而是Model的屬性值, Model屬性的名稱由@ModelAttribute的value設(shè)置, 即username;
而@RequestMapping的value值/show除了是請(qǐng)求映射之外, 還將作為視圖名稱, 即此請(qǐng)求處理方法將跳轉(zhuǎn)至名稱為show的頁面.
示例:
@ModelAttribute public User getUserById(String userId) {return userService.getUserById(userId); }@RequestMapping("/show") public String show(@ModelAttribute User user) {return "mac/test05"; }示例中, @ModelAttribute修飾的getUserById()方法仍舊在Model中添加user屬性, 其值為一個(gè)User對(duì)象.
而在show方法中, 參數(shù)也被@ModelAttribute修飾, 表示參數(shù)user的值就是Model中的屬性值.
9. @RequestBody 和 @ResponseBody
9.1 @RequestBody
springmvc提供了處理JSON格式請(qǐng)求和響應(yīng)的功能, 可以方便的使服務(wù)端的請(qǐng)求處理方法和客戶端JSON格式消息進(jìn)行交互, 這時(shí)就用到了@RequestBody注解.
@RequestBody注解用于讀取request請(qǐng)求的body部分的數(shù)據(jù), 解析后, 把相應(yīng)的數(shù)據(jù)綁定到請(qǐng)求處理方法的參數(shù)上.
前臺(tái)頁面使用GET或POST請(qǐng)求提交數(shù)據(jù)時(shí), 數(shù)據(jù)編碼格式會(huì)由請(qǐng)求頭的ContentType來指定, 可分為以下幾種情況:
- application/x-www-form-urlencoded, 此時(shí)可以使用@RequestParam, @ModelAttribute來處理參數(shù), 也可以使用@RequestBody.
- multipart/form-data, 此時(shí)不能使用@RequestBody處理.
- application/json或application/xml, 只能使用@RequestBody處理.
9.2 @ResponseBody
@ResponseBody注解用于將Controller的請(qǐng)求處理方法返回的數(shù)據(jù)對(duì)象, 轉(zhuǎn)換為指定格式后, 寫入到response對(duì)象的的body數(shù)據(jù)區(qū). 一般地, 返回的數(shù)據(jù)不是某個(gè)具體的視圖頁面, 而是某種格式的數(shù)據(jù)(json, xml等).
9.3 示例
示例類: springmvc004項(xiàng)目中, com.lizj.controller_08.BookController08
訪問地址: http://127.0.0.1:8080/springmvc004/book08/books
簡(jiǎn)單說明:
9.3.1 springmvc-servlet.xml
springmvc-servlet.xml配置文件中, 添加加了兩項(xiàng)配置:
<!-- 自動(dòng)注冊(cè)RequestMappingHandlerMapping和RequestMappingHandlerAdapter --> <mvc:annotation-driven /><!-- DispatcherServlet會(huì)攔截所有請(qǐng)求, 會(huì)將靜態(tài)文件(如js文件)的請(qǐng)求看成路徑, 就會(huì)找不到對(duì)應(yīng)的靜態(tài)文件 --> <!-- 此配置將使用默認(rèn)的servlet響應(yīng)靜態(tài)文件, 避免出現(xiàn)上述情況 --> <mvc:default-servlet-handler/>springmvc4.x默認(rèn)使用的HandlerMapping和HandlerAdapter為:
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMappingorg.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter詳情見:
spring-webmvc-4.2.3.RELEASE.jar
org.springframework.web.servlet包下的DispatcherServlet.properties文件.
9.3.2 pom.xml
引用Jackson
<!-- jackson --> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.6.2</version> </dependency> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.6.2</version> </dependency>Jackson用來實(shí)現(xiàn)json對(duì)象與Java對(duì)象之間的轉(zhuǎn)換.
示例下載:
https://files.cnblogs.com/files/lzj0616/springmvc%E5%B8%B8%E7%94%A8%E6%B3%A8%E8%A7%A3%E7%A4%BA%E4%BE%8B.rar
總結(jié)
以上是生活随笔為你收集整理的spring mvc学习(7):springmvc学习笔记(常用注解)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IntelliJ Idea 常用插件
- 下一篇: spring mvc学习(8):spri