前边我们讲了SpringMVC的概述、SpringMVC如何通过注解将前台页面的请求映射到处理方法中并将请求内容传入到目标方法的参数中、SpringMVC如何将模型数据放入到域对象中以便我们在目标页面获取。即SpringMVC是一个比Struts2优秀的WEB框架,它可以使用注解将一些普通的Java类编程控制器,还支持Rest(资源表现状态转换)风格的URL请求,以及它是一个可插拔的松散耦合结果,因此具有很好的扩展性和灵活性。在将请求映射到对应的处理方法时,我们可以使用@RequestMapping映射请求到指定的处理方法。然后使用@PathVariable、@RequestParam、@RequestHeader将请求信息映射到处理方法的入参中,还可以直接将表单内容直接映射到入参的POJO的属性中。在将模型数据放入域对象中时,我们可以直接在入参中加入一个Map值,这个值中的对象都会被SpringMVC自动的放入到域对象request中;我们可以将返回值设定为ModelAndView,这个对象中的对象也会被SpringMVC自动的放入到域对象request中;我们还可以使用@SessionAttribute属性,指明哪些key或者类型key对应的对象将会被SpringMVC自动的放入到Session对象中;最后我们还可以使用@ModelAttribute注解对将要注入目标方法入参的表单参数做一个简单的处理,即先将表单参数注入到@ModelAttribute注解修饰的方法中创造的从数据库获取的POJO类型的参数中,然后目标方法参数在根据其对应的key值在implicitModel中找到对应的对象。
下边我们来讲一讲如何目标方法入参寻找对象的步骤:
1.确定当前处理方法中入参在implicitModel中的key值
若这个入参有@ModelAttribute修饰,则对应的key值为@ModelAttribute注解中的value值;若没有这个注解修饰,则其对应的key值是其POJO类型的首字母小写。
2.POJO的入参变量根据这个key首先去implicitModel中查找有无对应的对象,若有则注入。
3.若在implicitModel中没有对应的key值的对象,那么SpringMVC会去有@SessionAttribute修饰的类中的Session中寻找key对应的value值的对象。若存在,则将Session中的对象存如到这个处理方法的入参中。
若有对应的key但是没有key对应的对象,则会抛出异常。
4.若是Handler没有使用@SessionAttribute注解修饰或者@SessionAttribute注解中没有对应的key值,那么SpringMVC就会通过反射创建一个处理方法的入参的new的新的对象。
5.同时,在以上的过程中,SpringMVC会将key和POJO类型的对象存如到域对象request或者session中,以便于我们在目标页面进行读取。