在四个域中,我们使用最频繁的域就是request对象。往request域对象中,保存数据,还在以下的几种形式。
我们可以在Controller的方法中,添加Map类型的参数,或者是Model类型的参数。或者是ModelMap类型的参数。都可以直接用来保存域数据到Request对象中。
Map全类名是:
java.util.Map
@RequestMapping(value = "/mapToRequest")
public String mapToRequest(Map<String,Object> map){
System.out.println(" mapToRequest() 方法调用了 ");
// 我们把数据保存到Map中,这些数据也会自动的保存到Reqeust域中.
map.put("mapKey1", "mapValue1");
map.put("mapKey2", "mapValue2");
return "ok";
}
Model全类名是:
org.springframework.ui.Model
@RequestMapping(value = "/modelToRequest")
public String modelToRequest(Model model){
System.out.println(" modelToRequest() 方法调用了 ");
// 我们把数据保存到 model 中,这些数据也会自动的保存到Reqeust域中.
model.addAttribute("modelKey1", "modelValue1");
model.addAttribute("modelKey2", "modelValue2");
return "ok";
}
ModelMap全类名是:
org.springframework.ui.ModelMap
@RequestMapping(value = "/modelMapToRequest")
public String modelMapToRequest(ModelMap modelMap){
System.out.println(" modelMapToRequest() 方法调用了 ");
// 我们把数据保存到 model 中,这些数据也会自动的保存到Reqeust域中.
modelMap.addAttribute("modelMapKey1", "modelMapValue1");
modelMap.addAttribute("modelMapKey2", "modelMapValue2");
return "ok";
}
隐含模型对象 :
/**
* 不管你是Map,还是Model,还是ModelMap,他们都是 BindingAwareModelMap 类
* class org.springframework.validation.support.BindingAwareModelMap
* /\
* ||
* ||
* BindingAwareModelMap extends ExtendedModelMap
* /\
* ||
* ||
* ExtendedModelMap extends ModelMap implements Model
* /\
* ||
* ||
* ModelMap extends LinkedHashMap
*
*
* BindingAwareModelMap 类是隐含模型对象!!!
* BindingAwareModelMap 隐含模型中一般都用来保存 视图渲染时 需要的数据
* 视图 就是页面 ( jsp页面 )
* 渲染 执行
*/
@RequestMapping(value = "/mapAndModelAndModelMap")
public String mapAndModelAndModelMap( Map map , Model model , ModelMap modelMap ){
// org.springframework.validation.support.BindingAwareModelMap
System.out.println( map );
System.out.println( model );
System.out.println( modelMap );
System.out.println(" 最美分隔线================================== ");
map.put("mapKey1", "mapValue1");
System.out.println( map );
System.out.println( model );
System.out.println( modelMap );
System.out.println(" 最美分隔线================================== ");
model.addAttribute("modelKey1", "modelValue1");
System.out.println( map );
System.out.println( model );
System.out.println( modelMap );
System.out.println(" 最美分隔线================================== ");
modelMap.addAttribute("modelMapKey1", "modelMapValue1");
System.out.println( map );
System.out.println( model );
System.out.println( modelMap );
System.out.println(" 最美分隔线================================== ");
System.out.println( map.getClass() );
System.out.println( model.getClass() );
System.out.println( modelMap.getClass() );
return "ok";
}
@RequestMapping(value = "/modelAndViewToReqeust")
public ModelAndView modelAndViewToReqeust(){
ModelAndView modelAndView = new ModelAndView("ok");
//使用 ModelAndView 返回值保存数据到 Reqeuat 域中
modelAndView.addObject("mavKey1", "mavValue1");
modelAndView.addObject("mavKey2", "mavValue2");
return modelAndView;
}
@SessionAttributes 注解可以标注在类上。它的作用是指定隐含模型中哪些数据可以保存到Session域中。
@SessionAttributes(value = { "key1","key2" }, types = { String.class, Book.class })
value属性,它表示把request域中key为key1,key2的键值对信息,也保存到Session中
types属性,它表示把request域中value类型为String.class或Book.class类型的键值对,也保存到Session中
/**
* @SessionAttributes 可以指定哪些隐含模型中的数据也同步保存到Session域中
* names 属性设置哪些 key 数据保存到Session中
* types 属性设置哪些类型的 value 属性也同步到Session中
*/
@SessionAttributes(types = {Integer.class,String.class})
@Controller
public class ScopeController {
@RequestMapping(value = "/sessionAttrubute")
public String sessionAttrubute(Map<String,Object> map){
System.out.println(" sessionAttrubute() 方法调用了 ");
// 我们把数据保存到Map中,这些数据也会自动的保存到Reqeust域中.
map.put("mapKey1", "字符串类型");
map.put("mapKey2", new Integer(100));
return "ok";
}
}
@ModelAttribute这个注解可以标注在方法和参数上。
@ModelAttribute三个常见作用:
1、被标注了@ModelAttribute的方法都会在Controller的目标方法之前执行。
2、目标方法的参数(JavaBean对象)会先从隐含模型中获取值传入。( 参数会覆盖隐含模型中的值 )
3、被标注在参数上,参数值会按照指定的key从隐含模型中获取值。
@ModelAttribute
public void modelAttributeFun( Map<String,Object> map ){
// 可以为目标方法准备数据
System.out.println(" modelAttributeFun() 方法被调用了 ");
map.put("book1",new Book(100,"国哥,为什么你这么帅,帅的不要不要的!"));
}
/**
* 目标方法的参数,如果是JavaBean,SpringMVC会先把这个参数的类型
* 取类名Book,然后首字母小写.然后到隐含模型中取值传入
*/
@RequestMapping(value = "/target")
public String target( @ModelAttribute("book1") Book book){
System.out.println(" target() 方法调用了 =====>>>> " + book);
return "ok";
}