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/ 本博客中未标明转载的文章归作者大角牛和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    JavaScript监听、设置全部ajax访问属性获取返回值(状态码)
    如何在Vue项目中使用vw实现移动端适配
    git 常用命令金字教程
    移动web开发之像素和DPR详解
    小程序-微信开发者工具使用
    小程序开发框架:Taro(一)基础篇
    vscode代码自动补全失效
    JS、C#编码解码
    PHP网页缓存技术
    ajaxfileupload回到json带<pre>
  • 原文地址:https://www.cnblogs.com/dajiaoniu/p/10039864.html
Copyright © 2011-2022 走看看