【SpringMVC】常用注解

7 篇文章 0 订阅

@RequestParam

作用

把请求中指定名称的参数给控制器中的形参赋值。

属性

value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。

案例

有一个jsp页面:

<html>
<head>
    <title>注解</title>
</head>
<body>
    <!--访问anno/requestParam,传入参数username=zhangsan-->
    <a href="anno/requestParam?username=zhangsan">RequestParam</a>
</body>
</html>

在AnnoController 类中有一个方法testRequestParam为上面链接对应的访问方法,但是参数是names:

@Controller
@RequestMapping("/anno")
public class AnnoController {
    @RequestMapping("requestParam")
    public String testRequestParam(String names){
        System.out.println("testRequestParam方法执行。。");
        System.out.println(name);
        return "success";
    }
}

访问该链接会由于username与testRequestParam中的形参names不匹配而报错,此时可以使用 @RequestParam 注解把请求中username的参数给控制器中的形参names赋值:

@Controller
@RequestMapping("/anno")
public class AnnoController {
    @RequestMapping("requestParam")
    public String testRequestParam(@RequestParam(name = "username") String names){
        System.out.println("testRequestParam方法执行。。");
        System.out.println(names);
        return "success";
    }
}

@RequestBody

作用

用于获取请求体内容。直接使用得到是key=value&key=value…结构的数据。
注意: get请求方式不适用(get请求没有请求头,封装在了url)。

属性

required:是否必须有请求体。默认值是:true。当取值为true时,get请求方式会报错。如果取值为false,get请求得到是null。

案例

发起一起请求:

    <form action="anno/requestBody" method="post">
        用户姓名:<input type="text" name="username">
        用户年龄:<input type="text" name="age">
        <input type="submit" value="提交">
    </form>

对应的方法:

//    获取到请求体的内容
    @RequestMapping("requestBody")
    public String testRequestBody(@RequestBody String body){
        System.out.println("testRequestBody方法执行。。");
        System.out.println(body);
        return "success";
    }

输入:
在这里插入图片描述
控制台输出:
testRequestBody方法执行。。
username=%E5%BC%A0%E4%B8%89&age=23

@PathVaribale

作用

用于绑定url中的占位符。例如:请求url中 /delete/{id},这个{id}就是url占位符。 url支持占位符是spring3.0之后加入的。是springmvc支持restful风格URL的一个重要标志。

属性

value:用于指定url中占位符名称。 required:是否必须提供占位符。

案例

jsp代码:

<!-- PathVariable注解 --> 
<a href="springmvc/usePathVariable/100">pathVariable注解</a>

控制器代码:

@RequestMapping("/usePathVariable/{id}")
 public String usePathVariable(@PathVariable("id") Integer id){ 
 	System.out.println(id);
 	return "success"; 
}

输出:100

@RequestHeader

作用

用于获取请求消息头。

属性

value:提供消息头名称 required:是否必须有此消息头
注: 在实际开发中一般不怎么用。、

@CookieValue

作用

用于把指定cookie名称的值传入控制器方法参数。

属性

value:指定cookie的名称。
required:是否必须有此cookie。

案例

jsp中的代码:

<!-- CookieValue注解 -->
 <a href="springmvc/useCookieValue">绑定cookie的值</a>

控制器中的代码:

@RequestMapping("/useCookieValue") 
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false) String cookieValue){ 	
	  System.out.println(cookieValue);
 	  return "success";
}

@ModelAttribute

作用

该注解是SpringMVC4.3版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。
它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。

属性

value:用于获取数据的key。
key可以是POJO的属性名称,也可以是map结构的key。

应用场景

当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如:
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为null,此时就可以使用此注解解决问题。

案例1:当前方法会在控制器的方法执行之前,先执行

jsp中:

    <form action="anno/testModelAttribute" method="post">
        用户姓名:<input type="text" name="username"><br>
        用户年龄:<input type="text" name="age"><br>
        <input type="submit" value="提交">
    </form>

控制器中:

    @RequestMapping("testModelAttribute")
    public String testModelAttribute(){
        System.out.println("testModelAttribute方法执行。。");
        return "success";
    }

    @ModelAttribute
    public void showUser(){
        System.out.println("showUser方法执行了");
    }

测试的时候,由于showUser方法上有注解@ModelAttribute,因此会在调用到testModelAttribute方法之前先执行showUser方法。

案例2:当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。

User对象有三个属性:

public class User implements Serializable {
    private String uname;
    private Integer age;
    private Date date;

jsp中表单只包含2个属性:

    <form action="anno/testModelAttribute" method="post">
        用户姓名:<input type="text" name="uname"><br>
        用户年龄:<input type="text" name="age"><br>
        <input type="submit" value="提交">
    </form>

控制器:

    @RequestMapping("testModelAttribute")
    public String testModelAttribute(User user){
        System.out.println("testModelAttribute方法执行。。");
        System.out.println(user);
        return "success";
    }

    //该方法先执行
    @ModelAttribute
    public User showUser(String uname){
        System.out.println("showUser方法执行了");
        //通过uname查数据库,假设查询到的User是:
        User user = new User();
        user.setAge(20);
        user.setUname(uname);
        //假设是数据库查询到的结果
        user.setDate(new Date());
        return user;
    }

提交表单:
在这里插入图片描述
虽然提交的没有生日,但是还是从数据库中查询出原来的生日进行填充:

showUser方法执行了
testModelAttribute方法执行。。
User{uname=‘张三’, age=23, date=Thu May 11 22:39:46 CST 2020}

@SessionAttributes

作用

用于多次执行控制器方法间的参数共享。

属性

value:用于指定存入的属性名称
type:用于指定存入的数据类型。

案例

jsp页面与两条超链接:

    <a href="anno/testSessionAttributes">SessionAttribute</a>
    <a href="anno/getSessionAttributes">getSessionAttribute</a>

对应的控制器:

@Controller
@RequestMapping("/anno")
@SessionAttributes(value = {"msg"}) //把msg存入到session域对象
public class AnnoController {

    //SessionAttributes注解
    @RequestMapping("testSessionAttributes")
    public String testSessionAttributes(Model model){
        System.out.println("testSessionAttributes方法执行。。");
        //会存储到Request域对象
        model.addAttribute("msg","你好");
        return "success";
    }

    //从Session域中获取值
    @RequestMapping("getSessionAttributes")
    public String getSessionAttributes(ModelMap model){
        System.out.println("getSessionAttributes方法执行。。");
        String msg = (String) model.get("msg");
        System.out.println(msg);
        return "success";
    }
}

在这里插入图片描述
点击第一个超链接将会调用testSessionAttributes方法,其中有一个Model对象会存储键值对到request域。由于类上有注解@SessionAttributes(value = {“msg”}),会把键值对存到session域中。然后点击点儿个超连接,调用getSessionAttributes方法,其中ModelMap是Model的实现类,其中的get方法可以从session于中获取键值对,实现方法之间的数据共享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程芝士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值