日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

spring mvc学习(7):springmvc学习笔记(常用注解)

發(fā)布時(shí)間:2023/12/10 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring mvc学习(7):springmvc学习笔记(常用注解) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. @Controller

@Controller注解用于表示一個(gè)類的實(shí)例是頁面控制器(后面都將稱為控制器). 使用@Controller注解定義的控制器有如下特點(diǎn):

  • 不需要繼承任何類, 也不需要實(shí)現(xiàn)任何接口
  • 可以處理多個(gè)請(qǐng)求
  • 可以使用Servlet的相關(guā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)求.

    /*** 基于注解的控制器*/ @Controller public class HelloController {@RequestMapping("/hello")public String sayHello(HttpServletRequest request) {model.addAttribute("message", "Hello World");return "helloworld";} }

    @RequestMapping注解支持的屬性

    屬性類型是否必要說明
    nameString映射地址別名, 一般不設(shè)置
    valueString[]指定請(qǐng)求的地址映射到方法上
    methodRequestMethod[]請(qǐng)求的方法類型, 包括GET,POST,HEAD,OPTIONS,PUT,PATCH,DELETE,TRACE
    consumesString[]指定處理請(qǐng)求的提交內(nèi)容類型(Content-Type),例如application/json
    producesString[]指定返回的內(nèi)容類型, 返回的內(nèi)容類型必須是request請(qǐng)求頭(Accept)中包含的類型
    paramsString[]指定request中必須包含某些參數(shù)值時(shí), 此方法才處理此請(qǐng)求
    headerString[]指定request中必須包含某些指定的header值, 此方法才處理此請(qǐng)求
    pathString[]In a Servlet environment... 就是value屬性的別名, value屬性沒有含義不確切, path含義更明確

    常用的@RequestMapping屬性:

  • value
    value屬性用于將請(qǐng)求映射到方法上. value屬性是@RequestMapping的默認(rèn)屬性, 當(dāng)只有唯一的屬性時(shí), 則可以省略屬性名, 如下兩個(gè)注解含義是一樣的:
  • @RequestMapping("/user") @RequestMapping(value="/user") 多個(gè)請(qǐng)求地址映射到同一個(gè)方法 @RequestMapping(value={"/user", "/customer"})
  • method
    method屬性指定此方法只處理哪些HTTP請(qǐng)求. 例如:
  • // 此方法只處理POST請(qǐng)求. @RequestMapping(value="/user", method=RequestMethod.POST) // 此方法既支持POST請(qǐng)求, 又支持GET請(qǐng)求 @RequestMapping(value="/user", method={RequestMethod.POST,RequestMethod.GET})

    如果沒有配置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ù).

    @RequestMapping(value="/book/{bookId}") public ModelAndView get(@PathVariable int bookId)

    示例類: 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注解支持的屬性

    屬性類型是否必要說明
    nameString指定請(qǐng)求頭綁定的名稱
    valueStringname屬性的別名
    requiredboolean指示參數(shù)是否必須綁定
    defaultString沒有參數(shù)時(shí)使用的默認(rèn)值
    public void testRequestHeader(@RequestHeader("User-Agent") String userAgent,@RequestHeader("Accept") String[] accepts) {// ... }

    示例類: 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注解支持的屬性

    屬性類型是否必要說明
    nameString指定請(qǐng)求頭綁定的名稱
    valueStringname屬性的別名
    requiredboolean指示參數(shù)是否必須綁定
    defaultString沒有參數(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注解支持的屬性

    屬性類型是否必要說明
    namesString[]Model中屬性的名稱, 儲(chǔ)存在session中也會(huì)用此名稱
    valuesString[]names屬性的別名
    typesClass<?>[]根據(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注解修飾的方法有返回值
  • 示例:

    @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注解修飾的方法有返回值, 返回值類型為void
  • 示例:

    @ModelAttribute public void getUserById(String userId, Model model) {model.addAttribute("user", userService.getUserById(userId)); }

    這種寫法的前提是在請(qǐng)求處理方法中加入了一個(gè)Model參數(shù).

  • @ModelAttribute和@RequestMapping修飾同一個(gè)方法
  • 示例:

    @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修飾一個(gè)請(qǐng)求處理方法的參數(shù)
  • 示例:

    @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/jsonapplication/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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。