SpringMVC基础--常用注解-@RequestParam、@RequestBody、@PathVariable、@ModeAttribute

@RequestParam

处理请求参数与控制器处理方法形参不一致的问题。
下面的请求中,参数名为username

<a href="hello?username=mcs">请求<a>

而处理函数中形参名为name

@RequestMapping("/hello")
    public String requestParamTest(String name) {
    
    
        System.out.println("username:" +name);
        return "hello";
    }

两个参数名称不一致,无法获取到请求中参数的值,使用@RequestParam来处理

@RequestMapping("/hello")
    public String requestParamTest(@RequestParam("username") String name) {
    
    
        System.out.println("username:" +name);
        return "hello";
    }

注意:指定的value值一定要和请求中参数名称一样。

@ReponseBody

如果直接作用于函数上,将控制器处理请求方法返回值显示在网页上,默认是覆盖跳转到的网页内容。

@ResponseBody
@RequestMapping("/testRequestParam")
    public String requestParamTest(@RequestParam("username") String name) {
    
    
        System.out.println("username:" +name);
        return "hello";
    }

将返回值hello打印在网页上。

@RequestBody

可以作用于参数上,获取请求中参数的请求体。

@ResponseBody
@RequestMapping("/testRequestBody")
    public String requestParamTest(@RequestBody String body) {
    
    
        System.out.println("body:" +body);
        return "hello";
    }

请求

<a href="testRequestBody?username=123&password=123"></a>

对bod形参加上@RequestBody注解后,body的内容就被赋值为请求中参数的请求体:username=123&password=123

@PathVariable

@RequestMapping在处理请求时只能处理固定的请求,如果我们根据id获取数据,100个人要写100个控制器处理请求方法岂不是太麻烦了,使用@PathVariable可以实现REST风格的请求,它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
例如:根据不同的id来处理不同的请求

@RequestMapping("/testPathVariable/{id}")
    public String PathVariableTest(@PathVariable("id") String id) {
    
    
        System.out.println("id:" + id);
        return "hello";
    }

请求

<a href="testPathVariable/1">PathVariable</a>

在数据库根据id查询单的时候经常应用这种
另外,也可以请求路径相同,根据不同的请求方式(PUT、GET、POST等)来找到对应的请求处理。

@ModelAttribute

加上该注解的方法会在控制器处理请求方法前执行,可以利用该属性处理表单提交时一些不能输入的表单属性,比如:
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数 据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。
第一种方法:没有返回值
请求

<form action="anno/testModelAttribute" method="post">
        年龄:<input type="text" name="uage"/><br/>
        出生日期:<input type="text" name="date"/><br/>
        <input type="submit" value="提交">
    </form>

我们将表单中的年龄和出生日期封装成一个User类,该类还有一个不可修改属性叫做address,那么我们就可以使用该注解创建个执行前执行的方法,先处理address属性,再通过控制器。

@ModelAttribute
    public User ModelAttribute(String uage) {
    
    
        // 模拟数据库查询
        System.out.println("先执行了");
        User user = new User();
        user.setUage(uage);
        Date date = new Date();
        user.setDate(date);
        user.setAddress("宿州");
        System.out.println("先执行:user:"+ user);
        return user;
    }
@RequestMapping("/testModelAttribute")
    public String ModelAttributeTest(User user) {
    
    
        System.out.println("user:" + user);
        return "hello";
    }

在这里插入图片描述

注意:先执行的方法只能对没有复制的属性就行修改生效,其他属性一概不生效,如果表单中有该属性,就算不输入赋值,也不能对该属性进行修改。>

第二种方法:
利用Map集合对User进行封装

@ModelAttribute
    public void ModelAttribute(String uage, Map<String,User> map) {
    
    
        // 模拟数据库查询
        System.out.println("先执行了");
        User user = new User();
        user.setUage(uage);
        Date date = new Date();
        user.setDate(date);
        user.setAddress("宿州");
        System.out.println("先执行:user:"+ user);
        map.put("change",user);
}

如果Map集合保存的键名和控制器形参不一样,需要使用@ModeAttribute进行绑定。

@RequestMapping("/testModelAttribute")
    public String ModelAttributeTest(@ModeAttribute("change") User user) {
    
    
        System.out.println("执行后user:" + user);
        return "hello";
    }

猜你喜欢

转载自blog.csdn.net/qq_44660367/article/details/108918160