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

    科技2022-07-13  122

    @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"; }
    Processed: 0.009, SQL: 8