适用场景,封装绑定数据的时候,当咱们想给形参取其余名字的时候能够用这个注解,可是也能够不写java
jsp 中的代码: <!-- requestParams 注解的使用 --> <a href="springmvc/useRequestParam?name=test">requestParam 注解</a> 控制器中的代码: /** * requestParams 注解的使用 * @param username * @return **/ @RequestMapping("/useRequestParam") public String useRequestParam(@RequestParam("name")Stringusername,@RequestParam(value="age",required=false)Integer age){ System.out.println(username+","+age); return "success"; }
这里要特别说明一下,用map接收的时候,必需要添加该注解程序员
@RequestMapping("/request") public String testRequestParamo(@RequestParam Map<String,Object> map) { System.out.println("test is doing...."); System.out.println(map); return "success"; }
做用:用于获取请求体内容。直接使用获得是 key=value&key=value...结构的数据,get 请求方式不适用。ajax
属性:required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。若是取值为 false,get 请求获得是 null。spring
post 请求 jsp 代码: <!-- request body 注解 --> <form action="springmvc/useRequestBody" method="post"> 用户名称:<input type="text" name="username" ><br/> 用户密码:<input type="password" name="password" ><br/> 用户年龄:<input type="text" name="age" ><br/> <input type="submit" value=" 保存 "> </form> get 请求 jsp 代码: <a href="springmvc/useRequestBody?body=test">requestBody 注解 get 请求</a>
控制器代码数据库
/** * RequestBody 注解 * @param user * @return */ @RequestMapping("/useRequestBody") public String useRequestBody(@RequestBody(required=false) String body){ System.out.println(body); return "success"; }
主要是用于响应ajax请求,返回的解析数据有如下的两种模式json
*fastJosn(推荐)
*jackJosncookie
@ResponseBody,也能够返回普通字符串,若是返回对象就报错,若是想要返回对象必须配置JSON转化器,get任何数据均可以,getJSON接收的JSON对象session
配置了转化器以后:也能够返回普通字符串,能够返回json字符串,设置能够将任何的数据转化为Json对象返回,好比java对象,map等等mvc
返回json数据格式:app
配置步骤以下:
导入依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
<!--配置spring开启注解mvc的支持 *配置json格式转化器 --> <mvc:annotation-driven> <mvc:message-converters> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
controller层方法
/** * 返回json字符串 * @return */ @RequestMapping("/Data2") @ResponseBody public JSONObject getDate(){ System.out.println("请求到后台"); JSONObject jsonpObject= JSON.parseObject("{'name':'张三','age':'15','address':'重庆'}"); return jsonpObject; }
AJax请求页面response.jsp
$.getJSON("/user/Data2",function (data) { console.log(data); })
返回java对象数据格式:
实体类代码
private String name; private int age; private String password; @JSONField(format = "yyyy-MM-dd") private Date date;
controller层代码
/** * 返回java对象 * @param student * @return */ @RequestMapping("/testAjax") @ResponseBody public Student testAjax( Student student) { System.out.println("testAjax is working"); student.setName("tom"); student.setPassword("123456"); student.setDate(new Date()); System.out.println(student); return student; }
$.getJSON("/user/testAjax",function (data) { console.log(data); })
访问http://localhost:8080/response.jsp获得console
Json转换日期类型会变成毫秒数,使用jsonfile,在实体类的日期属性上
解决方案:推荐配置方案一
解决方案1、@JSONfile(formart="yyyy-MM-dd")
pivate Data brithday;
解决方案2、配置当心转化器,只能转化为年月日时分秒
<property name="features">
<list>
<!-- 默认就是年月日时分秒格式 -->
<value>WriteDateUseDateFormat</value>
</list>
</property>
做用:
用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
url 支持占位符是 spring3.0 以后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
属性:
value:用于指定 url 中占位符名称。
required:是否必须提供占位符
jsp 代码: <!-- PathVariable 注解 --> <a href="springmvc/usePathVariable/100">pathVariable 注解</a>
控制器代码: /** * PathVariable 注解 * @param user * @return */ @RequestMapping("/usePathVariable/{id}") public String usePathVariable(@PathVariable("id") Integer id){ System.out.println(id); return "success"; }
做用:
用于获取请求消息头。
属性:
value:提供消息头名称
required:是否必须有此消息头
注:
在实际开发中通常不怎么用
jsp 中代码: <!-- RequestHeader 注解 --> <a href="springmvc/useRequestHeader">获取请求消息头</a> 控制器中代 码: /** * RequestHeader 注解 * @param user * @return */ @RequestMapping("/useRequestHeader") public String useRequestHeader(@RequestHeader(value="Accept-Language", required=false)String requestHeader){ System.out.println(requestHeader); return "success"; } 运行结果:
做用:
用于把指定 cookie 名称的值传入控制器方法参数。
属性:
value:指定 cookie 的名称。
required:是否必须有此 cookie
jsp 中的代码: <!-- CookieValue 注解 --> <a href="springmvc/useCookieValue">绑定 cookie 的值</a> 控制器中的代码: /** * Cookie 注解注解 * @param user * @return */ @RequestMapping("/useCookieValue") public String useCookieValue(@CookieValue(value="JSESSIONID",required=false)String cookieValue){ System.out.println(cookieValue); return "success"; } 运行结果:
做用:
该注解是 SpringMVC4.3 版本之后新加入的。它能够用于修饰方法和参数。出如今方法上,表示当前方法会在控制器的方法执行以前,先执行。它能够修饰没有返回值的方法,也可
以修饰有具体返回值的方法,出如今参数上,获取指定的数据给参数赋值。
属性:
value:用于获取数据的 key。key 能够是 POJO 的属性名称,也能够是 map 结构的 key。
应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如:
咱们在编辑一个用户时,用户有一个建立信息字段,该字段的值是不容许被修改的。在提交表单数,据是确定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就能够使用此注解解决问题。
<a href="springmvc/testModelAttribute?username=test">测试 modelattribute</a>
控制器代码: /** * 被 ModelAttribute 修饰的方法 * @param user */ @ModelAttribute public void showModel(User user) { System.out.println("执行了 showModel 方法"+user.getUsername()); } /** * 接收请求的方法 * @param user * @return */ @RequestMapping("/testModelAttribute") public String testModelAttribute(User user) { System.out.println("执行了控制器的方法"+user.getUsername()); return "success"; }
需求: 修改用户信息,要求用户的密码不能修改 jsp 的代码: <!-- 修改用户信息 --> <form action="springmvc/updateUser" method="post"> 用户名称:<input type="text" name="username" ><br/> 用户年龄:<input type="text" name="age" ><br/> <input type="submit" value=" 保存 "> </form>
控制的代码: /** * 查询数据库中用户信息 * @param user */ @ModelAttribute public User showModel(String username) { //模拟去数据库查询 User abc = findUserByName(username); System.out.println("执行了 showModel 方法"+abc); return abc; } /** * 模拟修改用户方法 * @param user * @return */ @RequestMapping("/updateUser") public String testModelAttribute(User user) { System.out.println("控制器中处理请求的方法:修改用户:"+user); return "success"; } /** * 模拟去数据库查询 * @param username * @return */ private User findUserByName(String username) { User user = new User(); user.setUsername(username); user.setAge(19); user.setPassword("123456"); return user; }
jsp 中的代码: <!-- 修改用户信息 --> <form action="springmvc/updateUser" method="post"> 用户名称:<input type="text" name="username" ><br/> 用户年龄:<input type="text" name="age" ><br/> <input type="submit" value=" 保存 "> </form>
控制器中的代码: /** * 查询数据库中用户信息 * @param user */ @ModelAttribute public void showModel(String username,Map<String,User> map) { //模拟去数据库查询 User user = findUserByName(username); System.out.println("执行了 showModel 方法"+user); map.put("abc",user); } /** * 模拟修改用户方法 * @param user * @return */ @RequestMapping("/updateUser") public String testModelAttribute(@ModelAttribute("abc")User user) { System.out.println("控制器中处理请求的方法:修改用户:"+user); return "success"; } /** * 模拟去数据库查询 * @param username * @return */ private User findUserByName(String username) { User user = new User(); user.setUsername(username); user.setAge(19); user.setPassword("123456"); return user; }
做用:
用于屡次执行控制器方法间的参数共享。
属性:
value:用于指定存入的属性名称
type:用于指定存入的数据类型。
jsp 中的代码 : <!-- SessionAttribute 注解的使用 --> <a href="springmvc/testPut">存入 SessionAttribute</a> <hr/> <a href="springmvc/testGet">取出 SessionAttribute</a> <hr/> <a href="springmvc/testClean">清除 SessionAttribute</a>
控制器中的代码 : /** * SessionAttribute 注解的使用 * @author 黑马程序员 * @Company http://www.ithiema.com * @Version 1.0 */ @Controller("sessionAttributeController") @RequestMapping("/springmvc") @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); //跳转以前将数据保存到 username、password 和 age 中,由于注解@SessionAttribute 中有这几个参数 return "success"; } @RequestMapping("/testGet") public String testGet(ModelMap model){ System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("age")); return "success"; } @RequestMapping("/testClean") public String complete(SessionStatus sessionStatus){ sessionStatus.setComplete(); return "success"; } }