SpringMVC 4.0 @ModelAttribute 注解(附源码分析流程)
2017-07-21 14:15
441 查看
@Controller public class Hello { /** * 该标记可以在调用其他函数的时候 先运行 * @ModelAttribute注解也可以用来修饰目标方法的POJO的入参,其属性值有如下作用: * 1>SpringMVC会使用value属性值在implicitModel中查找对应的对象,若存在则会直接传入到目标方法的入参中 * 2>SrpingMVC会value为key,POJO的类型作为value,存入到request中 * @param id * @param map */ @ModelAttribute public void getUser(@RequestParam(value="id",required=false) Integer id, Map<String, Object> map){ if(null != id) { User user = new User(); map.put("user", user); } } /** * @ModelAttribute 注解执行流程 * 1.执行@ModelAttribute直接修饰的方法 springmvc 识别了方法里面的map参数 * 2.SpringMVC 从map中取出了User对象,并把表单的请求参数赋给User对象的对应属性 * 3.SpringMVC 把上述对象传入目标的参数 也就是带有User 的对应请求的方法中去 这样不用重新创建一个新的对象 * * @param user * @param request * @param response * @return forward */ @RequestMapping("/pojo") public String pojo(User user, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("user", user); System.out.println("pojo" + user); return "pojo"; } }
表单
<form action="pojo"> username:<input type="text" name="username"></input><br/> <!--password:<input type="password" name="password"></input><br/> --> phone:<input type="hidden" name="phone" value="123456"></input><br/> city:<input type="text" name="address.city"></input><br/> province:<input type="text" name="address.province"></input><br/><br/> <input type="submit" name="提交"/> </form>
源码分析(反正也没人来看这里的分析)
一.调用@ModdelAttribute 注解修饰的方法,实际上把@ModdelAttribute方法中Map的数据放入到implictiModel中
二.解析请求处理器的目标参数,实际上该目标参数来自于,WebDataBinder对象的target属性
1.创建WebDataBinder对象 :
1>.确定objectName属性:若传入的attrName 属性值为空串“”,则objectName为类名第一 个字母小写,注意:attrName 若目标方法的POJO属性使用了@ModelAttribute来修饰,则 attrName 值即为@ModelAttribute的value属性值
2>.确定traget属性:在implicitModel中查找attrName对应的值,若存在可获取,若不存 在:验证当前Handler是否使用了@SessionAttribute 进行修饰,若使用了,则尝试从 Session中获取attrName所对应的属性,若session中没有对应的属性值则会抛出异常。若 Handler没有使用@SessionAttributes进行修饰,或@SessionAttributes中没有使用 value值指定key和attrName相匹配,则通过反射创建了POJO对象
2.SpringMVC把表单的请求赋值给了WebDataBinder的target对应属性。
3.SpringMVC会把WebDataBinder的attrName和target给到implicitModel
4.把WebDataBinder的target作为参数传递给目标方法的入参
相关文章推荐
- SpringMVC源码分析(2):分析HandlerAdapter.handle方法,了解handler方法的调用细节以及@ModelAttribute注解
- 学习SpringMVC(九)之ModelAttribute源码分析
- springMVC源码分析--@ModelAttribute使用及运行原理
- Spring MVC @ModelAttribute 源码分析流程
- SpringMvc的@ModelAttribute注解
- SpringMVC中@ModelAttribute和@SessionAttributes注解的使用
- 关于整个SpringMVC框架核心流程+核心源码分析
- SpringMVC 启动流程及相关源码分析
- 关于springMVC中@ModelAttribute注解的隐含model属性名
- spring mvc @ModelAttribute注解应用分析
- Spring源码分析: SpringMVC启动流程与DispatcherServlet请求处理流程
- SpringMVC源码分析(1):分析DispatcherServlet.doDispatch方法,了解总体流程
- springMVC源码分析--ModelFactory
- springmvc源码分析系列-请求处理流程
- 关于springmvc中注解@ModelAttribute的bean(对象参数)问题
- springMVC注解之 @ModelAttribute
- SpringMVC源码分析(3)DispatcherServlet的请求处理流程 推荐
- springMVC源码分析--ModelFactory