• URL 请求映射注解大全


    • @Controller  

    负责注册一个bean 到 spring 上下文中,用于标识是处理器类

    • @RequestMapping

    注解为控制器制定可以处理哪些URL请求,可用于类或者方法上。

    用于类上:表示类中的所有方法请求都是以该参数value值中的内容作为父路径请求

    用于方法:表示映射到具体的URI参数

    我就把RequestMapping的主要六个注解来分别看看:

    value: 指定请求的实际地址,也就是想http uri 中的请求参数是什么内容,才能跳入调用这个方法

    method:指定http请求的method类型(get、post、put、delete等)

    consumes:指定处理http请求的提交内容类型(也就是http中的Content-Type参数)

    produces:指定该方法处理后返回的内容类型,仅当request请求头中的Accept类型中包含该指定类型才返回。这句话意思就是,若是客户端可以接收text/html;application/json等类型的数据类型,那么我服务器端才在该函数处理完数据后,以这些格式将数据封装返回浏览器。

    params:指定request请求中必须包含的某些参数,才让该方法处理

    headers:指定request中必须包含的某些指定的header指定

    • @PathVariable

    当使用@RequestMapping URI的template样式映射参数时候,如http:{uri}/user/{uid},这时候可以通过@PathVariable注解将uri中的uid参数绑定到方法的参数上。(方法上的uri中的{sid}参数将会映射传递到方法的sid参数上。若是方法参数名称和uri中传递的{param}名称不一致,需要在方法参数旁显式指定名称。)

    @RequestMapping(value = "/sid/{sid}",method=RequestMethod.DELETE)  
        public ModelAndView DeleteUserById(@PathVariable String sid){ //sid参数对应方法上的路径参数{sid}
            ModelAndView mv = new ModelAndView("stulist");  //跳转到stulist.jsp
            int ret = userService.DeleteUserById(sid);
            mv.addObject("ret",ret);
            return mv;
        }
       //uri/{param}中param名称与方法变量名字不同,需要@PathVariable()显示指定
       @RequestMapping(value="/sid/{userId}",method=RequesetMethod.DELETE)
       public ModelAndView DeleteUserById(@PathVariable("userId") String sid){...}

    2.@RequestHeader,@CookieValue:
    @RequestHeader注解,可以把Request请求header部分的值绑定到方法的参数上。
    例如假设我们的一个request请求头为以下内容:

    Host: www.cnblogs.com
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Referer: https://www.baidu.com/link?url=vMwqr_1CInBYSsvCXnoPrwOFxPvxdChHmN9XWPp7C1Do5MjbnJN8e8WP6VCPjsW5w-edqnKJaCNJPN2sR20eNOb6d73O0ZaFM9Kwe-GRVtK&wd=&eqid=8a738c1d00002ce20000000658c8c3ca
    Accept-Encoding: gzip, deflate, sdch
    Accept-Language: zh-CN,zh;q=0.8
    Cookie: CNZZDATA1260386081=1660805767-1486222861-https%253A%252F%252Fwww.baidu.com%252F%7C1486222861; __utma=226521935.140421385.1488358381.1488899945.1488899945.1; __utmz=226521935.1488899945.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; CNZZDATA1259029673=860036098-1489063915-%7C1489063915;

    那如果服务器端代码要使用request请求头中某些内容,那么我们就可以使用@RequestHeader参数来映射参数:
    下面的方法参数,分别获取请求头中,客户端接收的编码(Accept-Encoding)绑定到encoding参数上,和接收的内容格式(Accept)绑定到accept参数上。

    @RequesetMapping(value="..")
    public void getRequestHeaderInfo(@RequestHeader("Accept-Encoding") String encoding, 
                                     @RequestHeader("Accept") String accept){
    //...
    }

    @CookieValue注解,顾名思义,就是将客户端发送的request请求中cookie拿到,绑定到方法参数上。
    我们还是根据上面那个request请求头,我们可以看到最后一行请求头中有:Cookie:..的内容,若是想直接拿到该字段内容,那么可以使用@CookieValue注解来实现数据绑定。

    @RequesetMapping(value="..")
    public void getRequestCookieInfo(@CookieValue("Cookie") String cookie){ //绑定cookie内容到cookie参数
    //...
    }

    3.@RequestParam,@RequestBody:
    上面我们在获取request请求资源uri路径,请求头内容后,还有一个重要的request格式中区域就是请求体body了。那么这两个参数就是用于处理这部分内容的。

    @RequestParam注解,通过以下几点来说明:
    (1) 常常用来处理简单类型的数据绑定。什么是简单类型,简单的说,就是在服务器端可以通过request.getParameter(“key”)方法获取的参数的类型。通常这类的参数在Get请求中是以uri?key=value样式体现的,也就是queryString的值。也能获取POST请求中请求体body data中的值。也就是将一些key=value参数放置在request请求体中。
    (2) 用来处理Content-Type: 为application/x-www-form-urlencoded表单提交的编码内容。
    (3) 该注解有两个属性:value,required。value用来指定传入值的名称,required用于指示参数是否必须存在并绑定。

    //url: http://.../getUser?uid=1
    @RequestMapping(method = RequestMethod.GET)  
    public String doSomething(@RequestParam("uid") int uid, ModelMap model) {//url中queryString参数uid绑定到方法参数uid中。  
        //...
    }

    @RequestBody注解:通常用来处理非表单提交(Content-Type={application/json;application/xml})中的post data body内容

    4.@SessionAttributes,@ModelAttribute:
    @SessionAttributes注解是用来绑定httpSession的attribute对象的值,方便在方法中参数映射并使用。该注解有value,types两个属性,可以通过名字和类型来指定要使用的attribute对象。

    那么为什么要使用这个注解呢?能解决什么问题?这个与spring中的ModelMap有关。因为modelMap中的属性作用域是request级别,也就是说,当本次request结束后,modelMap中的所有属性都会被销毁,那么就造成一个问题?若想在多个request中共享该对象,如何实现?那就可以把对象放置到session域级别中。就是通过@SessionAttributes来完成这个需求的。

    eg:通过@SessionAttributes注解将该request请求域中的ModelMap中的user对象属性放置到session中。在后面jsp视图中我们可以使用常规session操作得到user属性(session.getAttriute(“user”)):

    @Controller  
    @RequestMapping("/editUser.do")  
    @SessionAttributes(value="user",types={user.class})  
    public class EditUserForm {  
        // ...  
    } 

    关于该属性的使用形式还有以下几种:
    (1)字符串数组指定多个属性。@SessionAttributes({“attr1”,”attr2”})
    (2)也能通过types指定每个value的属性:
    @SessionAttributes(types={User.class})
    @SessionAttributes(types={User.class,Deptment.class},value={“atrr1”,”attr2”})

    @ModelAttribute注解有两个用法,一个是用于方法上,一个是用于参数上:
    方法上: 通常是用来处理@RequestMapping之前,为请求绑定需要从后台查询的model。
    参数上: 用来通过名称对应,把相应的名称的值绑定到注解的参数bean上,该bean的来源有:
    A. @SessionAttributes配置中的attribute对象。
    B. @ModelAttribute用于方法上时候指定的model对象。
    C. 若是上述情况都没有,new一个需要绑定的bean对象,然后把request中按照同名方式把值绑定到bean。

    在参数上使用该注解的例子:可以看到@ModelAttribute(“user”)中有user参数与@SessionAttribute(“user”)中的对象名称一致,那么就会自动将user属性对象注入到ModelMap对象,就可以直接使用该user对象了

    @RequestMapping(value="/users/{uid}/edit", method = RequestMethod.POST)  
    public String processSubmit(@ModelAttribute("user") User user) {  
         //...
    } 

    关于@ModelAttribute属性中对象如何查找,按照如下顺序:先查询@SessionAttribute上有无绑定的同名对象,若是没有则在查询定义在方法上的@ModelAttribute是否绑定有同名对象,最后则是在uri按照属性名称映射查找。

     

  • 相关阅读:
    Git 和 GitHub 入门
    TestStand 登录界面如何自定义
    LabVIEW可以通过哪些方式和MES交互
    基于TestStand和C#开发平台TTStand 初识系列之六 【TestRun】
    基于TestStand和C#开发平台TTStand 初识系列之五 【SystemSet】
    基于TestStand和C#开发平台TTStand 初识系列之四 【Process】
    基于TestStand和C#开发平台TTStand 初识系列之三 【Development】
    基于TestStand和C#开发平台TTStand 初识系列之二 【安装】
    基于TestStand和C#开发平台TTStand 初识系列之一 【介绍】
    TestStand 如何正确使用Trace功能
  • 原文地址:https://www.cnblogs.com/tubashu/p/11803999.html
Copyright © 2020-2023  润新知