zoukankan      html  css  js  c++  java
  • SpringMVC 常用注解 详解

    SpringMVC 常用注解 详解

    SpringMVC 常用注解

        1、@RequestMapping                                      路径映射

        2、@RequestParam                                          获取请求参数

        3、@PathVariable                                             绑定URL 模板变量值

        4、@ModelAttribute                                          用在方法上 / 用在方法参数列表上

        5、@SessionAttributes                                     将值放到session 域中

        6、@ResponsBody 与 @RequestBody            传输json 格式数据

    本文摘自   https://www.cnblogs.com/xiaoxi   

    未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    @RequestMapping

      @RequestMapping 是一个用来处理请求地址(URL 路径映射)映射的注解(将请求映射到对应的控制器方法中),可以用在类上或方法上,用在类上 设置请求前缀,用在方法上 设置请求后缀。  

      @RequestMapping 中的方法:

         value 指定请求路径

         method  指定请求类型

         params  指定request 中必须包含某些参数值,才能让该方法执行

         headers  指定request 中必须包含指定的header 才能让该方法执行

         consumes  指定请求的内容类型   例如:Application/json , text/html

         Produces     指定返回的内容类型,仅当request 请求头中的类型包含该指定类型才能返回

    @RequestMapping 的方法

      一、value指定请求路径

        1、指定多个路径  中间使用逗号隔开

             @RequestMapping(value={"/updateitem","/updateitems","/list"})

    @RequestMapping(value={"/updateitem","/updateitems","/list"})
    /**
     * 可以多个请求访问该类或者方法,
     * 访问路径 : http://localhost:8080/updateitem 或者 http://localhost:8080/list
     */
    

      

        2、@RequestMapping 作用在类上  // 只要符合请求路径,都可以访问该类

    1     @RequestMapping(value = "/json/info/{itemId}")
    2     @ResponseBody
    3     public Items getItemById(@PathVariable("itemId") int id) {
    4         Items items = itemService.getItemById(id);
    5         return items;
    6     }
    7 /**
    8 *访问地址为:http://localhost:8080/item/queryItem 
    9 **/
    @RequestMapping 作用在类上

        3、同时作用在类上,方法上    // 请求时应符合前缀(类上的@RequestMapping)+后缀(方法上的@RequestMapping)

     1 @Controller
     2 @RequestMapping(value = "/item")
     3 public class ItemController {
     4         @RequestMapping(value = "/json/info-list")
     5         public List<Items> getItemById() {
     6             return itemService.getItemList();
     7         }
     8 }
     9 /**
    10 *访问地址 http://localhost:8080/item/json/info-list
    11 *注意:
    12 *    由于在类上加了 /item ,所以在访问该类的每个方法时,都应该带上前缀/item
    13 **/
    @RequestMapping 同时作用在类上与方法上

        4、路径中含某变量的值  // 获取路径中的参数,赋值给方法的形参

    1     @RequestMapping("/json/info/{itemId}")
    2     @ResponseBody
    3     public Items getItemById(@PathVariable("itemId") int id) {
    4         Items items = itemService.getItemById(id);
    5         return items;
    6     }
    7 /**
    8 * 获取路径中的参数 itemId 的值,赋值给 int id
    9 **/
    获取路径中的参数,赋值给形参

      二、method  指定请求类型 {RequestMethod.GET(get 请求), RequestMethod.POST(post请求)}

     1 @Controller
     2 @RequestMapping(value = "/item" , method = RequestMetod.GET)
     3 public class ItemController {
     4         @RequestMapping(value = "/json/info-list")
     5         public List<Items> getItemById() {
     6             return itemService.getItemList();
     7         }
     8 }
     9 
    10 /**
    11  *  Method方法 用来设置请求类型
    12  *  取值 : GET   POST
    13  */
    指定请求类型

      三、params  指定request 中必须包含某些参数值,才能让该方法执行

     1     @RequestMapping(value = "/ info")
     2 public class ItemController {
     3         @RequestMapping(value = "/qwe",params="action=123")
     4         public List<Items> getItemById(@PathVariable("itemId") int id) {
     5             return itemService.getItemList();
     6         }
     7 }
     8 /**
     9 * 访问地址为:http://localhost:8080// info/qwe?action=123
    10 * 路径中必须包含 “action =123” 参数 该方法才能执行
    11 **/
    params 方法的示例

      四、headers  指定request 中必须包含指定的header值 才能让该方法执行

     1     @RequestMapping(value = "/info")
     2 public class ItemController {
     3         @RequestMapping(value = "/header",headers="Accept=application/json")
     4         public List<Items> getItemById() {
     5             return itemService.getItemList();
     6         }
     7 }
     8 /**
     9 * 访问地址为:http://localhost:8080// info/header
    10 * 且请求头中必须有 "Accept=application/json" 参数 ,该方法才能执行
    11 **/
    headers 方法

      五、consumes  指定请求的内容类型例如Application/json , text/html

     1     @RequestMapping(value = "/info")
     2 public class ItemController {
     3         @RequestMapping(value = "/header", consumes ="application/json")
     4         public List<Items> getItemById() {
     5             return itemService.getItemList();
     6         }
     7 }
     8 /**
     9 * 访问地址为:http://localhost:8080// info/header
    10 * 该方法仅处理request Content-Type 为application/json 类型的请求
    11 **/
    consumes 方法

      六、produces 指定返回的内容类型,仅当request 请求头中的(Accept)类型包含该指定类型才能返回

     1     @RequestMapping(value = "/info")
     2 public class ItemController {
     3         @RequestMapping(value = "/header", produces ="application/json")
     4         public List<Items> getItemById() {
     5             return itemService.getItemList();
     6         }
     7 }
     8 /**
     9 * 访问地址为:http://localhost:8080// info/header
    10 * 该方法仅处理request请求头中(Accept)包含了 “application/json”,
    11 * 同时暗示了返回的内容类型为 “application/json”
    12 **/
    produces 方法

    @RequestParam  获取url 中的参数

      @RequestParam 用于将url 中的的参数,映射到方法的参数上。

     1  @RequestMapping(value = "/info")
     2  public class ItemController {
     3          @RequestMapping(value = "/body")
     4          public String getItemByName(@RequestParam String username) {
     5              return username();
     6          }
     7  }
     8  /**
     9  * 访问地址为:http://localhost:8080// info/body
    10  * 将url 路径中携带的名为username 的参数,赋值给方法username参数
    11  * 即:http://localhost:8080// info/body?username=“张三” 则将张三赋值给username
    12  **/
    @RequestParam 注解

      @RequestParam 注解有三个参数:  value   required   defaultValue

        1、value : 即url 路径中参数的名字

        2、required : 是否必须,默认为 true  ,表示请求中一定要有相应的参数,否者会抛出异常。

               即:若上面代码中,url 路径中没有与方法同名的参数,将会抛出异常。

        3、defaultValue : 默认值,表示若请求中没有同名参数时的默认值,设置该参数时,自动将required设为false。

      注意:1、若url请求参数中没有对应的username 的参数,则会抛出异常

         2、可以设置required 的值为false ,这样若url 请求中没有对应的参数,则会默认为null

      如果请求中有多个同名的应该如何接收呢?如给用户授权时,可能授予多个权限,首先看下如下代码:

    public String requestparam7(@RequestParam(value="role") String roleList)
    

      如果请求参数类似于url?role=admin&rule=user,则实际roleList参数入参的数据为“admin,user”,即多个数据之间使用“,”分割;我们应该使用如下方式来接收多个请求参数:

    public String requestparam7(@RequestParam(value="role") String[] roleList)
    或者
    public String requestparam8(@RequestParam(value="list") List<String> list)  

    @PathVariable  绑定URL 模板变量值

      @PathVariable 可以将路径(url)中的参数映射到方法的参数上,

    1         // 在请求路径中设置变量{itemId}
    2         @RequestMapping("/json/info/{itemId}")
    3         // 使用@PathVariable("itemId")  获取路径中的变量 itemId 的值
    4         @ResponseBody
    5     public Items getItemById(@PathVariable("itemId") int id) {
    6         Items items = itemService.getItemById(id);
    7         return items;
    8     }
    @PathVariable 示例

    @ModelAttribute 

      ModelAttribute可以应用在方法参数上或方法上,他的作用主要是当注解在方法参数上时会将注解的参数对象添加到Model中;当注解在请求处理方法Action上时会将该方法变成一个非请求处理的方法,但其它Action被调用时会首先调用该方法。

      @ModelAttribute注释一个方法

        被@ModelAttribute注释的方法表示这个方法的目的是增加一个或多个模型(model)属性。这个方法和被@RequestMapping注释的方法一样也支持@RequestParam参数,但是它不能直接被请求映射。实际上,控制器中的@ModelAttribute方法是在同一控制器中的@RequestMapping方法被调用之前调用的。

        被@ModelAttribute注释的方法用于填充model属性,例如,为下拉菜单填充内容,或检索一个command对象(如,Account),用它来表示一个HTML表单中的数据。
    一个控制器可以有任意数量的@ModelAttribute方法。所有这些方法都在@RequestMapping方法被调用之前调用。

    有两种类型的@ModelAttribute方法。一种是:只加入一个属性,用方法的返回类型隐含表示。另一种是:方法接受一个Model类型的参数,这个model可以加入任意多个model属性。

    @SessionAttributes  将值放到session 域中

      在默认情况下,ModelMap中的属性作用域是request级别,也就是说,当本次请求结束后,ModelMap 中的属性将销毁。如果希望在多个请求中共享ModelMap中的属性,必须将其属性转存到session 中,这样 ModelMap 的属性才可以被跨请求访问。
      Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。这一功能是通过类定义处标注 @SessionAttributes 注解来实现的。

     1 package demo.controller;
     2 
     3 import org.springframework.stereotype.Controller;
     4 import org.springframework.ui.ModelMap;
     5 import org.springframework.web.bind.annotation.RequestMapping;
     6 import org.springframework.web.bind.annotation.SessionAttributes;
     7 
     8 import demo.model.User;
     9 
    10 @Controller
    11 @RequestMapping(value="/demo1")
    12 //(1)将ModelMap中属性名为currUser的属性放到Session属性列表中,以便这个属性可以跨请求访问
    13 @SessionAttributes("currUser")
    14 public class Demo1Controller {
    15     
    16     @RequestMapping(value="/getUser")
    17     public String getUser(ModelMap model){
    18         User user=new User();
    19         user.setUser_name("zhangsan");
    20         user.setUser_age(25);
    21         user.setUser_email("zhangsan@sina.com");
    22         //(2)向ModelMap中添加一个属性
    23          model.addAttribute("currUser",user);
    24         return "/demo/user";
    25     }
    26     
    27     @RequestMapping(value="/getUser1")
    28     public String getUser1(ModelMap model){
    29         User user=(User)model.get("currUser");
    30         System.out.println(user.getUser_name());
    31         System.out.println(user.getUser_age());
    32         System.out.println(user.getUser_email());
    33         return "demo/user1";
    34     }
    35 }
    @SessionAttributes 注解
     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <%@ page import="demo.model.User" %>
     3 <%
     4 String path = request.getContextPath();
     5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     6 %>
     7 
     8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     9 <html>
    10   <head>
    11     <base href="<%=basePath%>">
    12     <title>My JSP 'index.jsp' starting page</title>
    13   </head>
    14   <body><br>
    15       <%User user=(User)session.getAttribute("currUser");%>
    16       用户名:<%=user.getUser_name() %><br/>
    17       年龄:<%=user.getUser_age() %><br/>
    18       邮箱:<%=user.getUser_email() %><br/><br/>
    19       <a href="<%=path %>/demo1/getUser1">跳转</a>
    20   </body>
    21 </html>
    JSP 页面

      如上例代码中,我们在getUser 方法上使用了@SessionAttributes 注解,所以在getUser方法中通过@SessionAttributes 注解将 ModelMap 中名为 currUser 的属性放置到 Session 中,所以我们不但可以在 getUser() 请求所对应的 JSP 视图页面中通过 request.getAttribute(“currUser”) 和 session.getAttribute(“currUser”) 获取 user 对象,还可以在下一个请求(getUser1())所对应的 JSP 视图页面中通过 session.getAttribute(“currUser”) 或 session.getAttribute(“currUser”)访问到这个属性。

       这里我们仅将一个 ModelMap 的属性放入 Session 中,其实 @SessionAttributes 允许指定多个属性。你可以通过字符串数组的方式指定多个属性,如 @SessionAttributes({“attr1”,"attr2”})。此外,@SessionAttributes 还可以通过属性类型指定要 session 化的 ModelMap 属性,如 @SessionAttributes(types = User.class),当然也可以指定多个类,如 @SessionAttributes(types = {User.class,Dept.class}),还可以联合使用属性名和属性类型指定:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,"attr2”})。

    @Controller  
    @SessionAttributes("currentUser")  
    public class GreetingController{   
        @RequestMapping  
        public void hello(@ModelAttribute("currentUser") User user){   
        //user.sayHello()   
        }   
    }  

    通过@ModelAttribute绑定

    @SessionAttributes 是用来在 controller 内部共享 model 属性的。

    我们可以在需要访问 Session 属性的 controller 上加上 @SessionAttributes,然后在 action 需要的 User 参数上加上 @ModelAttribute,并保证两者的属性名称一致。SpringMVC 就会自动将 @SessionAttributes 定义的属性注入到 ModelMap 对象,在 setup action 的参数列表时,去 ModelMap 中取到这样的对象,再添加到参数列表。只要我们不去调用 SessionStatus 的 setComplete() 方法,这个对象就会一直保留在 Session 中,从而实现 Session 信息的共享。

    @SessionAttributes清除
    @SessionAttributes需要清除时,使用SessionStatus.setComplete();来清除。注意,它只清除@SessionAttributes的session,不会清除HttpSession的数据。故如用户身份验证对象的session一般不用它来实现,还是用session.setAttribute等传统的方式实现。

    @ResponseBody 与 @RequestBody

      @ResponseBody 是作用在方法上,表示将该方法的返回结果直接写入到HTTP response body 中,

      我们在使用@RequestMapping 注解后,需要将返回值解析,然后将解析结果为跳转路径,加上@ResponseBody 注解后,返回结果不会被解析,而是直接写入HTTP response body 中。

      比如:返回json 数据,加上@ResponseBody 后,会直接返回json 格式数据

      示例:

    1     @RequestMapping("/json/info/{itemId}")
    2     @ResponseBody
    3     public Items getItemById(@PathVariable("itemId") int id) {
    4         Items items = itemService.getItemById(id);
    5         return items;
    6     }
    @ResponseBody

      

      @RequestBody 是作用在形参列表上,表示将HTTP 请求正文出入到方法中,使用适合HTTPMessageConverter 将请求体写入某个对象

             比如 : 用来传输 json 格式数据时,使用@RequestBody

    1     // 接收json 格式数据,并返回json 格式数据
    2 @RequestMapping("/json/rec")
    3     @ResponseBody     // 返回json 格式数据
    4     public Items getJsonItem(@RequestBody Items items) {   // 接收json 格式数据
    5         return items;
    6     }
    @RequestBody
    作者:大角牛 出处:http://www.cnblogs.com/dajiaoniu/ 本博客中未标明转载的文章归作者大角牛和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    matlab cell
    matlab linux 快捷键设置——有问题还是要解决
    latex 小结
    TOJ 1258 Very Simple Counting
    TOJ 2888 Pearls
    HDU 1248 寒冰王座
    TOJ 3486 Divisibility
    TOJ 3635 过山车
    TOJ 1840 Jack Straws
    HDU 4460 Friend Chains
  • 原文地址:https://www.cnblogs.com/dajiaoniu/p/10039864.html
Copyright © 2011-2022 走看看