【Spring MVC 之应用篇】3_SpringMVC常见注解

1. @RequestParam

功能&属性介绍

作用:

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

属性:

value:请求参数中的名称

required:请求参数中是否必须提供此参数。默认值 true 必须提供

实现测试

  1. 编写一个新的前端页面
<%--
  Created by IntelliJ IDEA.
  User: dell
  Date: 2020/10/6
  Time: 12:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<a href="/anno/testRequestParam?name=ffideal&pwd=123456">开始跳转</a>
</body>
</html>
  1. 在后端编写新的 controller
	/**
     * @Description: @RequestParam 注解
     * 当前端传入参数的名称与后端接收的名称不对应的时候,
     * 可以通过<code>@RequestParam("xxx")</code> 将xxx赋值给形式参数,
     * 然后在进行传参
     * @param: String username/String password
     * @return:
     * @auther: ffideal
     * @date:
     */

@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam("name") String username,@RequestParam("pwd") String password){
    System.out.println(username);
    System.out.println(password);
    return "/success";
}

2. @RequestBody

功能&属性介绍

作用:

用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。但是,get 请求方式不适用。

属性:

required:

是否必须有请求体。默认值是:true。

当取值为 true 时,get 请求方式会报错。

如果取值为 false,get 请求得到是 null。

实现测试

  1. 首先在前端页面编写测试请求
<%--RequestBody的post请求--%>
<form action="/anno/testRequestBody" method="post">
    姓名:<input type="text" name="uname"/> <br>
    密码:<input type="text" name="upassword"/> <br>
    价格:<input type="text" name="price"/> <br>
    生日:<input type="text" name="birthday"/> <br>
    <input type="submit" value="提交">
</form>

<a href="/anno/testRequestBody?body=test"  methods="get">RequestBody的get请求</a>
  1. controller 层编写逻辑处理
/**
 * @Description: @RequestBody 注解
 * @auther: ffideal
 */
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody(required = false) String body){
    System.out.println(body);
    return "/success";
}

3. @PathVariable

功能&属性介绍

作用:

用于绑定 url 中的占位符。例如:请求 url 中 /delete/{score},这个 {score} 就是 url 占位符。

属性:

value:用于指定 url 中占位符名称。

required:是否必须提供占位符。

实现测试

  1. 首先在前端页面编写测试请求
<a href="/anno/testPathVariable/452">@PathVariable 注解</a> <br>
  1. controller 层编写逻辑处理
/**
 * @Description: @RequestBody 注解
 * @auther: ffideal
 */
@RequestMapping("/testPathVariable/{score}")
public String testPathVariable(@PathVariable(value = "score") Integer score){
    System.out.println(score);
    return "/success";
}

运行结果
在这里插入图片描述

4. @ModelAttribute

功能&属性介绍

作用:

出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。出现在参数上,获取指定的数据给参数赋值。

属性:

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

应用场景:

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

例如:

我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。

实现测试1:修饰没有返回值的方法

  1. 首先在前端页面编写测试请求
<a href="/anno/testModelAttribute?uname=ffideal">@ModelAttribute 注解</a> <br>
  1. controller 层编写逻辑处理
/**
 * @Description: @ModelAttribute注解
 * 优先执行
 * @auther: ffideal
 * @date:
 */

@ModelAttribute
public void showModel(Consumer consumer){
    System.out.println("被@ModelAttribute修饰的方法:" + consumer.getUname());
}

@RequestMapping("testModelAttribute")
public String testModelAttribute(Consumer consumer){
    System.out.println("testModelAttribute的方法:" + consumer.getUname());
    return "/success";
}

运行结果1

在这里插入图片描述

实现测试2:修饰有具体返回值

  1. 首先在前端页面编写测试请求
<form action="/anno/updatePassword" method="post">
    姓名:<input type="text" name="uname"/> <br>
    密码:<input type="text" name="upassword"/> <br>
    价格:<input type="text" name="price"/> <br>
    生日:<input type="text" name="birthday"/> <br>
    <input type="submit" value="提交">
</form>
  1. controller 层编写逻辑处理
/**
 * @Description: 以下的3个方法都是 ModelAttribute 修饰方法带返回值
 * @auther: ffideal
 * @date:
 */

/**
 * @Description: 模拟数据库中的值
 * @auther: ffideal
 * @date:
 */
private Consumer simulateDB(String username){
    Consumer consumer = new Consumer();
    consumer.setUname("ffideal");
    consumer.setUpassword("123456");
    consumer.setPrice(BigDecimal.valueOf(3.14));
    return consumer;
}

/**
 * @Description: 优先执行被ModelAttribute注解修饰的方法
 * @auther: ffideal
 * @date:
 */
@ModelAttribute
public Consumer showConsumer(String username){
    Consumer consumer = simulateDB(username);
    System.out.println("Model 输出原始的数据" + consumer);
    return consumer;
}

/**
 * @Description: 更新密码
 * @auther: ffideal
 * @date:
 */
@RequestMapping("updatePassword")
public String updatePassword(Consumer consumer){
    System.out.println("updatePassword中的Consumer对象值:" + consumer);
    return "/success";
}

运行结果2

在这里插入图片描述

实现测试3:出现在参数上

前端请求与 实现测试2 相同,在 controller 层编写逻辑处理

/**
 * @Description: 模拟数据库中的值
 * @auther: ffideal
 * @date:
 */
private Consumer simulateDB(String username){
    Consumer consumer = new Consumer();
    consumer.setUname("ffideal");
    consumer.setUpassword("123456");
    consumer.setPrice(BigDecimal.valueOf(3.14));
    return consumer;
}

/**
     * @Description: 优先执行被ModelAttribute注解修饰的方法
     * @auther: ffideal
     * @date:
     */
@ModelAttribute
public void showConsumer2(String username, Map<String, Consumer> map){
    Consumer consumer = simulateDB(username);
    System.out.println("Model 输出原始的数据" + consumer);
    map.put("consumer", consumer);
}

/**
     * @Description: 更新密码
     * @auther: ffideal
     * @date:
     */
@RequestMapping("updatePrice")
public String updatePassword2(@ModelAttribute("consumer") Consumer consumer){
    System.out.println("updatePassword中的Consumer对象值:" + consumer);
    return "/success";
}

运些结果3

在这里插入图片描述

5. @SessionAttributes

功能&属性介绍

作用:

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

属性:

value:用于指定存入的属性名称

type:用于指定存入的数据类型

实现测试

  1. 首先在前端页面编写测试请求
<a href="/session/setSessionAttribute">设置SessionAttribute</a><br>
<a href="/session/getSessionAttribute">获取SessionAttribute</a><br>
<a href="/session/delSessionAttribute">删除SessionAttribute</a><br>
  1. controller 层编写逻辑处理
@Controller
@RequestMapping("session")
@SessionAttributes(value = {"uname","upassword","price"},types = {Integer.class})
public class SessionAttributeController {
    /**
     * @Description: @SessionAttribute 注解
     * 设置属性
     *  Model 是 spring 提供的一个接口,该接口有一个实现类 ExtendedModelMap
     * 该类继承了 ModelMap,而 ModelMap 就是 LinkedHashMap 子类
     * @auther: ffideal
     * @date:
     */

    @RequestMapping("setSessionAttribute")
    public String setSessionAttribute(Model model){
        model.addAttribute("uname","ffideal");
        model.addAttribute("upassword","654321");
        model.addAttribute("price", BigDecimal.valueOf(3.13));
        System.out.println("setSessionAttribute设置完毕 ....");
        return "/success";
    }

    @RequestMapping("getSessionAttribute")
    public String getSessionAttribute(ModelMap model){
        System.out.println("昵称:" + model.get("uname") + ",密码:" + model.get("upassword") + ",价格:" + model.get("price"));
        return "/success";
    }

    @RequestMapping("delSessionAttribute")
    public String delSessionAttribute(SessionStatus status){
        status.setComplete();
        System.out.println("setSessionAttribute 清除完毕 ....");
        return "/success";
    }
}

运些结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_之桐_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值