springMVC-常用注解

1.requestParam

作用:
把请求中指定名称的参数给控制器中的形参赋值。
属性:
value: 请求参数中的名称。
required:请求参数中是否必须提供此参数。 默认值: true。表示必须提供,如果不提供将报错。

示例

jsp代码
    <form action="anno/testRequestParam" method="post">
        姓名:<input type="text" name="username"/><br/>
        年龄:<input type="text" name="age"/><br/>
        <input type="submit" value="提交"/>
    </form>

控制器代码
@Controller
@RequestMapping("/anno")
public class AnnoController {
    @RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam("username") String name,
                                   @RequestParam(value = "age",required = false) Integer age){
        System.out.println("run...");
        System.out.println("name:" + name);
        System.out.println("age:" + age);
        return "success";
    }
}

执行结果,传递参数中如果没有age,由于配置了false,也没有报错

2.RequestBody注解

作用:
用于获取请求体内容。 直接使用得到是 key=value&key=value...结构的数据。
get 请求方式不适用。get请求没有请求体的,请求全部封装到了地址栏
属性:
required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值
为 falseget 请求得到是 null

示例

jsp    
<form action="anno/testRequestBody" method="post"> 姓名:<input type="text" name="username"/><br/> 密码:<input type="text" name="password"/><br/> 年龄:<input type="text" name="age"/><br/> <input type="submit" value="测试requestBody注解"/> </form> 控制器 @RequestMapping("/testRequestBody") public String testRequestBody(@RequestBody(required = false) String body){ System.out.println("run..."); System.out.println(body); return "success"; }

结果,控制台输出

3.PathVaribale注解

作用:
用于绑定 url 中的占位符。 例如:请求 url 中 /delete/{id}, 这个{id}就是 url 占位符。
url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
属性:
value: 用于指定 url 中占位符名称。
required:是否必须提供占位符

示例

jsp代码
    <a href="anno/testPathVariable/100">测试pathVariable注解</a>

控制器代码
    @RequestMapping("/testPathVariable/{sid}")
    public String testPathVariable(@PathVariable("sid") int id){
        System.out.println("run...");
        System.out.println(id);
        return "success";
    }

结果

4.RequestHeader注解

作用:
用于获取请求消息头。
属性:
value:提供消息头名称
required:是否必须有此消息头
注:
在实际开发中一般不怎么用。

示例

jsp代码
 <a href="anno/testRequestHeader">测试RequestHeader注解</a>

控制器代码
    @RequestMapping("/testRequestHeader")
    public String testRequestHeader(@RequestHeader(value = "Accept",required = false) String requestHead){
        System.out.println("run...");
        System.out.println(requestHead);
        return "success";
    }

结果

5.CookieValue注解

作用:
用于把指定 cookie 名称的值传入控制器方法参数。
属性:
value:指定 cookie 的名称。
required:是否必须有此 cookie。
用得也比较少

浏览器向服务器发送请求,一定会在服务器中创建一个session空间,

然后服务器会通过cookie的形式把session写回来,返回一个JSESSIONID

现在我们就是获取这个JSESSIONID的值

示例

jsp代码
    <a href="anno/testCookieValue">测试CookieValue注解</a>

控制器   
   @RequestMapping("/testCookieValue")
    public String testCookieValue(@CookieValue(value = "JSESSIONID")String cookieValue){
        System.out.println("run...");
        System.out.println(cookieValue);
        return "success";
    }

打印结果

6.ModelAttribute注解

作用:
该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可
以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。
属性:
value:用于获取数据的 key。 key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如:
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数
据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题

示例,被ModelAttribute注解标注的方法会先执行

jsp代码
<a href="anno/testModelAttribute1?name=test">测试被ModelAttribute注解标记的方法先执行</a><br/>

控制器代码
    @RequestMapping("/testModelAttribute1")
    public String testModelAttribut1e(User user){
        System.out.println("run...");
        System.out.println("控制器的方法执行了,用户名是:" + user.getName());
        return "success";
    }
    @ModelAttribute
    public void showModel(User user){
        System.out.println("被ModelAttribute标记的方法执行了,用户名是:" + user.getName());
    }

运行结果

 ModelAttribute注解的用法示例

ModelAttribute注解标注的方法有返回值

比如修改一个用户信息,要求用户的密码不能被修改

pojo类
public class User3 {
    private String name;
    private String password;
    private int age;
    private String addr;
    ...
}

jsp代码
    <form action="anno/updateUser3" method="post">
        姓名:<input type="text" name="name"/><br/>
        地址:<input type="text" name="addr"/><br/>
        年龄:<input type="text" name="age"/><br/>
        <input type="submit" value="修改用户信息"/>
    </form>

控制器
    /**
     * 演示ModelAttribute的基本用法,在不修改密码的前提下修改用户信息
     */
    @RequestMapping("/updateUser3")
    public String testModelAttribute(User3 user){
        System.out.println("修改后的用户:" + user);
        return "success";
    }
    @ModelAttribute
    public User3 showUser3(String name){
        //模拟数据库查询用户
        User3 theUser = findUserByName(name);
        System.out.println("根据用户名查询的用户:" + theUser);
        return theUser;
    }
    //模拟数据库查询
    public User3 findUserByName(String name){
        User3 user = new User3();
        user.setPassword("123456");
        user.setName("rainbow");
        user.setAddr("步行街");
        user.setAge(18);
        return user;
    }

结果

 ModelAttribute标注的方法没有返回值

控制器代码
    @RequestMapping("/updateUser3")
    public String testModelAttribute(@ModelAttribute(value = "rainbow") User3 user){
        System.out.println("修改后的用户:" + user);
        return "success";
    }

        @ModelAttribute
    public void showUser3(String name, Map<String,User3>map){
        //模拟数据库查询用户
        User3 theUser = findUserByName(name);
        System.out.println("根据用户名查询的用户:" + theUser);
        map.put("rainbow", theUser);
    }

结果

7.SessionAttribute注解

作用:
用于多次执行控制器方法间的参数共享。
属性:
value:用于指定存入的属性名称
type:用于指定存入的数据类型

示例

jsp
    <!-- SessionAttribute 注解的使用 -->
    <a href="sa/testPut">存入SessionAttribute</a><br/>
    <a href="sa/testGet">取出SessionAttribute</a><br/>
    <a href="sa/testClean">清除SessionAttribute</a>

控制器
@Controller
@RequestMapping("/sa")
@SessionAttributes(value ={"username","password"},types={Integer.class})
public class SessionAttributeController {
    /**
     * 把数据存入 SessionAttribute
     * @param model
     * @return
     * Model 是 spring 提供的一个接口,该接口有一个实现类 ExtendedModelMap
     * 该类继承了 ModelMap,而 ModelMap 就是 LinkedHashMap 子类
     */
    @RequestMapping("/testPut")
    public String testPut(Model model){
        model.addAttribute("username", "泰斯特");
        model.addAttribute("password","123456");
        model.addAttribute("age", 31);
        System.out.println("put...");
        //跳转之前将数据保存到 username、 password 和 age 中,因为注解@SessionAttribute 中有这几个参数
        return "success";
    }
    @RequestMapping("/testGet")
    public String testGet(ModelMap model){
        System.out.println("get...");
        System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("age"));
        return "success";
    }
    @RequestMapping("/testClean")
    public String complete(SessionStatus sessionStatus){
        sessionStatus.setComplete();
        System.out.println("clean...");
        return "success";
    }
}

结果

爱生活,爱码字

我是匆匆、我曾喂自己半年酒。

好好生活吧,有缘或许相见。

原文地址:https://www.cnblogs.com/ccoonngg/p/11840690.html