美文网首页
spring mvc中一些注解

spring mvc中一些注解

作者: aaron1993 | 来源:发表于2017-10-21 22:47 被阅读0次

1. 前言

本文主要记录一下spring mvc中常用的注解的使用

2. 注解

1. @ModelAttribute
这个注解可以用在方法或者参数上,注解本身可用的三个成员:

- String value()
- String name()
   name和value互为别名,作用是一样的
- boolean binding()
默认true

用在不同的地方代表的含义也有所不同:

  1. 用在方法上
    使用@ModelAttribute注解方法是,是将方法的返回值绑定到一个名字上,同时当访问某个URL并最终走到这个url映射的Controller的具体的一个的方法methodA时,这个Controller里所有使用了@ModelAttribute注解的方法都会先被执行一遍,然后执行的结果被绑定到一个name上,如下例:
@Controller
@RequestMapping("/api/echo")
public class EchoTime {

    private static int i = 0;
    @RequestMapping(value = "/timestamp", method = RequestMethod.GET, produces = "application/json")
    @ResponseBody
    public Long currentTimeStamp(@ModelAttribute("name") String name){
        System.out.println(name);
        return System.currentTimeMillis();
    }

    @ModelAttribute("name")
    public String testModeAnAttribute(){
        System.out.println("in testModeAnAttribute...");
        return "eric" + i ++;
    }
}

-------连续两次访问输出结果如下---------
in testModeAnAttribute...
eric0

in testModeAnAttribute...
eric1
  1. 用在参数上
    上面例子也反应了用在参数上含义:
    public Long currentTimeStamp(@ModelAttribute("name") String name)
    将属性明为name的值绑定到参数上,这个name的值可以是上面例子中@ModelAttribute注解的方法的返回值,也可以是url中的请求参数.

2. @SessionAttributes
注解在类上(controller类上),它可以指定一些names或者types,如下:

@SessionAttributes(names = {"lastAccessTime","lastUpdateTime"})

表示将model中名称为'lastAccessTime'和‘ lastUpdateTime’的属性值绑定到session上。配合使用在参数上的注解@ModelAttribute一起使用,如:

methodA(@ModelAttribute("lastAccessTime") Date lastAccessTime
则完成将session中‘ lastAccessTime’的值绑定到参数上。

它的流程大概是:

首先这里有一个SessionAttributeStore的接口,session上的属性值的设置和获取是通过它来完成的,默认实现类是DefaultSessionAttributeStore。
DefaultSessionAttributeStore只是简单的将属性值设置到session中和从session中获取。

1. 执行controller的method之前,需要解析method的参数并完成参数绑定:
    - 获得@ModelAttribute注解的参数名称(同时这些参数名称也在SessionAttributes的名称列表里),
      从sessionAttributeStore中获取这个名称的值(也就是从session中获取值),将值绑定定到method的参数上
2. 执行controller方法
3. 执行controller方法之后获得新的Model,遍历model中的所有name,value,
   对于那些出现在`@SessionAttributes`中name,用这些name,value去更新sessionAttributeStore, 也就是设置到session中去。

综上这个过程,可以看出你在代码中调用HttpSession # removeAttribute是不会生效的,因为为controller方法执行完后上面第3步还是设置session的属性值

相关文章

网友评论

      本文标题:spring mvc中一些注解

      本文链接:https://www.haomeiwen.com/subject/ulbzjxtx.html