一、ModeAndView:
目标方法返回值类型可以是ModelAndView类型其中可以包含视图和模型信息。
SpringMVC 会把ModelAndView的model中数据放到request域对象中。
二、Map及Model:
入参为org.springframework.ui.model、org.springframework.ui.ModelMap
或 java.uti.Map时,在处理方法返回时,Map中的数据会自动添加到模型中。
三、@SessionAttributes:
--此注解只能放在类上
--通过制定属性名放到会话中
--通过模型属性的对象类型指定哪些模型属性需要放到会话中
(实际上使用的是types属性值)
--将模型中的某个属性暂存到HttpSession中,
--以便多个请求之间可以共享这个属性
四、@ModelAttribute:
--方法入参标注该注解后,入参的对象就会放到数据模型中
--用于修改对象时使用
--有@ModelAttribute标记的方法,会在每个目标方法执行之前被SpringMVC调用
--将数据从数据库中取出 赋给对象 修改要修改的对象
运行流程:用户填写表单--------赋给对象-------传入数据库
1. 执行@ModelAttribute注解修饰的方法:
从数据库中取出对象,把对象放入Map中。
2.SpringMVC从Map中取出User对象,并把表带请求的参数赋给该User对象的属性
3.SpringMVC把上述对象传入目标方法的参数
4.放到map中时的键需要和目标方法入参类型的第一个小写的字符串一致
springMVC确定目标方法POJO类型入参的过程
1.确定一个key:
2.在implicitModel中查找key对应的对象,若存在,在作为入参传入
3.若implicitModel中不存在key对应的对象,则检查当前handler是否使用
四、@SessionAttributes
注解修饰。
若使用了该注解,
且@SessionAttributes注解的value属性值中包含了key,
则会从HttpSession中来获取key所对应的value值。
若存在则直接传入到目标方法的入参中。若不存在则抛出异常。
若Handler没有标识@SessionAttributes注解或@SessionAttributes
注解的value值不包含key
,则会通过反射来创建POJO类型的参数,传入目标方法的参数
SpringMVC会把key和value保存到implicitModel中进而会保存到request中
实例代码:
@SessionAttributes(value={"user"}, types={String.class})
@RequestMapping("/springmvc")
@Controller
public class springMVCTest {
private static final String SUCCESS = "success";
@RequestMapping("/testViewAndViewResolver")
public String testViewAndViewResolver(){
System.out.println("testViewAndViewResolver");
return SUCCESS;
}
@ModelAttribute
public void getUser(@RequestParam(value="id", required=false) Integer id,
Map<String, Object> map){
if(id != null){
//模拟从数据库中获取对象
User user = new User(001, "sunqg", "123456", "sunqg@163.com", 12);
System.out.println("从数据库中获取一个对象: " + user);
map.put("user", user);
}
}
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("修改: " + user);
return SUCCESS;
}
@RequestMapping("/testSessionAttributs")
public String testSessionAttributes(Map<String, Object> map){
User user = new User("Tom", "123456", "tom@163.com", 15);
map.put("user", user);
map.put("school", "sycu");
return SUCCESS;
}
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
map.put("names", Arrays.asList("Tom", "Jerry", "Mike"));
return SUCCESS;
}