被@ModelAttribute注解修饰的方法,会在每个目标方法调用之前被SpringMVC调用 /* * 被@ModelAttribute注解修饰的方法,会在每个目标方法调用之前被SpringMVC调用 */@ModelAttributepublic void getUser(@Req
/* * 被@ModelAttribute注解修饰的方法,会在每个目标方法调用之前被SpringMVC调用 */ @ModelAttribute public void getUser(@RequestParam(value="id",required=false)Integer id,Map@ModelAttribute注解运行流程map) { if(id != null) { /* * 这里本意是从数据库中获取对象属性然后封装成对象 * 但是模拟省去,直接new */ Student stu=new Student(1, "zsl", "sddas", "zsl@yeah.net"); System.out.println("从数据库中获取该对象="+stu); map.put("student", stu); } }
/** * 运行流程 * 1. 运行@ModelAttribute注解修饰的方法,从数据库中取出数据,并将该数据封装成对象放入map中,value为"stu" * 2. SpringMVC从map中取出对象stu,把表单的请求参数附给对象对应的参数 * 3. SpringMVC把该对象传入目标方法的参数 * * 注意: map中的键需与目标方法的入参名一致 * * SpringMVC确定目标方法POJO类型入参的过程 * 1. 确定一个 key * 1). 若目标方法的 POJO 类型参数没有使用@ModelAttribute注解修饰,则 key 为POJO类型的第一个字母小写的字符串 * 2). 若使用了@ModelAttribute注解修饰,则 key 为@ModelAttribute注解的 value 值 * 2.在 implicitModel 中查询有 key 对应的对象,则作为入参传入 * 1).若在@ModelAttribute标记的方法中在 Map 中保存过,且 key 和1中对应的 key 一致,则会获取到 * 3.若 implicitModel 中查询不到 key 对应的对象,则检查当前 Handler 是否使用@SessionAttributes注解修饰, * 若使用了该注解,且@SessionAttributes注解的 value 属性值中包含了 key,则会从 sessionScope 中获取 key * 所对应的 value 值,若存在将传入方法入参,若不存在,则抛出异常。 * 4.若 Handler 没有标识@SessionAttributes注解或@SessionAttributes注解的value属性值中不包含 key 值, * 会通过反射来创建对应的 POJO 类型的对象,传入目标方法作为入参。 * 5.SpringMVC会将 key 和 POJO 类型的对象保存到 implicitModel 中,进而保存到 requestScope 中。 */ @RequestMapping("/testModelAttribute") public String testModelAttribute(Student stu) { System.out.println("修改后的User="+stu); return success; }index1.jsp请求页面(包含了testModelAttribute,testModelAndView,testRequestParam等测试案例的请求)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here
Test ModelAndView
Test Map
Test SessionAttributes
Test testView =