阅读 260

SpringMvc 初体验之常用注解(三)

SpringMvc 常用的注解

@Controller

标记@Controller的类被称作为控制器类,使其无需实现Controller即可表示为控制器类,告知 DispatcherServlet 前端控制器这是一个Controller对象。

要使Spring 容器认识它,则需要在配置文件中标记该bean;

<!-- 方式 1,单独标记 --> <bean class="com.example.controller.IndexController"/> <!-- 方式 2,Controller 包的扫描 --> <context:component-scan base-package="com.example.controller"/> 复制代码

@RequestMapping

标记URL与方法之间的关系,映射请求Url对应处理的Handler;

@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping {     // 映射名,一般不用设置     String name() default "";     // 请求路径,可配置多个路径,与path功能相同     @AliasFor("path")     String[] value() default {};     // 请求路径,与value功能相同     @AliasFor("value")     String[] path() default {};     // 请求方法,可多种类型     RequestMethod[] method() default {};     // 指定参数类型     String[] params() default {};     // 指定请求头     String[] headers() default {};     // 指定数据请求的格式,如application/json     String[] consumes() default {};     // 指定返回的内容类型,如application/json     String[] produces() default {}; } 复制代码

注:属性中的@AliasFor注解表明这个互为别名,即path属性 跟 value 属性的作用是一致的。

需要知道的是,@RequestMapping 上的属性类似于说明对这个请求的限制,也即这个请求需满足RequestMapping 的属性内容,才能被该Handler 处理。

@RequestMapping(value = {"requestMapping1","requestMapping2"}             ,method = {RequestMethod.GET,RequestMethod.POST}             ,consumes = "application/x-www-form-urlencoded"             ,produces = "application/json"             ,headers = {"Content-Type=application/json"} )     @ResponseBody     public String requestMapping() {         return "success";     } 复制代码

在上面的例子中,requestMapping 方法 指定了  url="/requestMapping1"  和 "requestMapping2" 都可访问到该请求。同时要求请求方法为 GET 或 POST的一种,数据请求的格式可以为 consumes 指定的 application/x-www-form-urlencoded,也可以为 headers 里表示的application/json。在返回给客户端的内容类型为 application/json。

@RestController

@Controller 与 @ResponseBody 的组合注解,标记在类上表示这个类为控制器类,同时返回的内容为字符串;

@RequestParam

标记url请求的参数,用于方法参数上的注解,解析请求参数名对应的值绑定到方法参数上。

@Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestParam {          // 参数名     @AliasFor("name")     String value() default "";     // 参数名,与value一致     @AliasFor("value")     String name() default "";     // 是否必须,如果为false,表示可不传该参数,默认为null,如果参数是基本数据类型的变量,此时会报空指针异常     boolean required() default true;     // 参数的默认值,如果没传该参数,将采用该默认值,默认值可以使用SpEL表达式     String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n"; } 复制代码

使用示例:

 @RequestMapping(value = "list",method = RequestMethod.GET)     public String getUserList(@RequestParam(required = false,defaultValue = "0",value = "page") int pageNum, @RequestParam(required = false,defaultValue = "10",value = "limit") int limit ) {         return userService.getUserList(pageNum,limit);     } 复制代码

事实上,不加 @RequestParam 注解,只要请求参数与方法参数名一致也是能绑定的。不过使用注解可以灵活控制参数,例如控制参数是否必须,默认值,以及参数别名等。

@PathVariable

标记请求路径变量的注解,结合@RequestMapping 上的SpEl表达式使用,用于方法参数上。适用于链接上的动态参数标记。

 @RequestMapping(value = "info/{uid}",method = RequestMethod.GET)  public String getUserInfoById(@PathVariable(value = "uid") String uid) {        return uid;  } 复制代码

当请求参数与方法参数名一致时,可省略@PathVariable 上的值。

@ResponseBody

作用是将Java对象转为特定的数据格式,如Json 、xml等,直接输出数据到response对象的body部分。使用该注解不会将方法的返回值解析为跳转路径,而RequestBody

@RequestBody

作用是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。使用该注解会解析request请求中body部分的数据,由默认的HttpMessageConverter负责解析,将数据绑定在参数对象上。

一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/jsonapplication/xml等类型的数据。

参考链接:blog.csdn.net/weixin_3800…

@PostMapping

相当于 @RequestMapping(method = RequestMethod.POST),接收Post 请求;

@ModelAttribute

主要的作用是将数据添加到模型对象中,用于视图页面显示。在不同的位置上使用该注解,作用也会不同。

1. 作用在方法上

@ModelAttribute 注解的方法会在Controller 每个方法执行前都会被调用,有点类型 Junit的@Before 方法。如果有返回值,则自动将返回值加入到ModelMap中。

  • 注解在返回值为void的方法上。

    一般需要在方法上主动使用Model对象将属性set到模型对象中去;

      @ModelAttribute     public void addModelAttribute(String name, Model model) {         model.addAttribute("name",name);     } 复制代码

  • 注解有返回值的方法上。

    使用 @ModelAttribute  可以将返回值添加到 mvc的模型对象中;默认的key为返回对象类型的小写;

    //    @ModelAttribute // 如果使用该注解的话,相当于在模型视图中有 "string":name 这样的属性     @ModelAttribute("name") // 使用该注解会将返回值添加到模型视图中,即 "name" : name     public String addModelAttribute(@RequestParam String name) {         return name;     } 复制代码

  • 与@RequestMapping 一起使用

     @RequestMapping("/model")     @ModelAttribute("name")     public String name(String name) {         return name;     } 复制代码

    以上面的例子来说,访问 localhost:port/model?name=zhangsan 会访问到 项目根目录下的 model.jsp 文件(假设后缀为.jsp),同时会将参数name添加到模型视图中。即在model.jsp页面上使用该表达式将输出 zhangsan。

    注:即使当前 Controller 中有 @ResquestBody 注解也会转发到对应的页面;

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head>     <title>Title</title>     ${name} </head> <body> </body> </html> 复制代码

2. 作用在参数上

运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用;

用在方法的入参上依次做如下操作:

  • 从隐含对象中获取隐含的模型数据

  • 将请求参数绑定到隐含对象中

  • 将隐含对象传入到入参

  • 将入参绑定到Model

@CookieValue

用于获取Cookie值的注解。

  @GetMapping("verify")     public String verifyUser(@CookieValue("_TOKEN") String token) {         // check token         return "";     } 复制代码

上例中,即是获取请求中的_TOKEN的cookie;

@SessionAttributes

  1. 若希望在多个请求之间共用数据,则可以在控制器类上标注一个 @SessionAttributes,配置需要在session中存放的数据范围,Spring MVC将存放在model中对应的数据暂存到HttpSession 中。

  2. @SessionAttributes只能使用在类定义上。

  3. @SessionAttributes 除了可以通过属性名指定需要放到会 话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中 例如:

    @SessionAttributes(types=User.class)会将model中所有类型为 User的属性添加到会话中。 @SessionAttributes(value={“user1”, “user2”}) 会将model中属性名为user1和user2的属性添加到会话中。 @SessionAttributes(types={User.class, Dept.class}) 会将model中所有类型为 User和Dept的属性添加到会话中。 @SessionAttributes(value={“user1”,“user2”},types={Dept.class})会将model中属性名为user1和user2以及类型为Dept的属性添加到会话中。

  4. value和type之间是并集关系

@SessionAttributes 只能使用在类定义上。

@Controller @SessionAttributes("user") public class ModelController {     @ModelAttribute("user")     public User initUser(){         User user = new User();         user.setName("default");         return user;     } } 复制代码

@SessionAttribute是用于获取已经存储的session数据,并且作用在方法的层面上。

   @RequestMapping("/session")     public String session(@SessionAttribute("user") User user){         // do something         return "index";     }


作者:易科
链接:https://juejin.cn/post/7032953024947601444

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐