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 请求方式会报错。如果取值 为 false, get 请求得到是 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"; } }
结果