天天看点

SpringMVC 第六章 模型数据

Spring MVC 提供了以下几种途径输出模型数据

1.ModelAndView:

    处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据

    既包含视图信息,也包含模型数据信息。

    ModelAndView中包含两个添加数据模型的方法:

        1.ModelAndView addObject(String attributeName, Object attributeValue)

        2.ModelAndView addAllObject(Map<String,?>modelMap)

    ModelAndView包含两个设置视图的方法:

        1.void setView(View view)

        2.void setViewName(String viewName)

实例:
	@RequestMapping(value="testModelAndView")
	public ModelAndView testModelAndView () {
	    System.out.println("entry in ModelAndView");
	    ModelAndView mv = new ModelAndView();
	    mv.setViewName("success");
	    // ModelAndView中模型数据的值,都是放置到request范围中的
	    mv.addObject("name", "MIKE");
	    return mv;
	}
	success.jsp中:
	    ${requestScope.name}显示输出
	注意事项:
		核心业务方法的返回值为ModelAndView:模型数据,视图
		ModelAndView当中模型数据是放置到请求范围当中的
           

2.Map及Model:

    入参为org.springframework.ui.Model/org.springframework.ui.ModelMap或java.util.Map时,

    处理方法返回时,Map中的数据会自动添加到模型中。

    具体步骤:

        SpringMVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器

        如果方法的入参为Map或Model类型,SpringMVC会将隐含模型的引用传递给入参。

        在方法体内,可以通过这个入参对象访问到模型中的所有数据,

        也可以向模型中添加新的属性数据

    使用方法:

        Map.put(String , Object)

        Model.addAttribute(String , Object)

        ModelMap.addAttribute(String, Object)

实例:
	Map:
	    @RequestMapping(value="/testMap")
	    public String testMap(Map<String,Object>map) {
		map.put("age", 12);
		return "success";
	    }

	Model:
	    @RequestMapping(value="/testModel")
	    public String testModel(Model model) {
		model.addAttribute("email", "[email protected]");
		return "success";
	}

	ModelMap:
	    @RequestMapping(value="/testModelMap")
	    public String testModelMap(ModelMap modelMap) {
		modelMap.addAttribute("city", "wuhan");
		return "success";
	    }
           

[email protected]:

    将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性。

    @SessionAttributes除可以通过属性名指定需要放到会话中的属性外,还可以通过

    模型属性的对象类型指定哪些模型属性需要放到会话中

        @SessionAttributes(type=User.class)

            会将隐含模型中所有类型为User.class的属性添加到会话中

        @SessionAttributes(value={"user1", "user2"})

        @SessionAttributes(types={User.class, Dept.class})

        @SessionAttributes(value={"user1", "user2"}, types={Dept.class})

    注意事项:    

        1.要求放置的值,必须在模型数据里面(request范围中有限)

        2.复制的方式:

            通过属性的key值完成session的共享数据设置

            value:String[]

            value=["a","b"]

            也可以通过模型数据当中的类型,共享数据的设置

[email protected]:

    1.在方法定义上使用@ModelAttribute注解:

        SpringMVC 在调用目标处理方法前,会逐个调用在方法级上标注了@ModelAttribute的方法

        1.1 修饰没有返回值的方法

            执行ModelAttribute修饰方法

            获取的原始数据放置到请求范围中指定key对应的value

            pojo入参会从请求范围当中查找指定key对应的value,找到的话,会将值赋给入参

            前端用户输入的值与入参进行绑定

实例:	
	@ModelAttribute
	public void start (Map<String,Object>map) {
	    // 模拟数据库访问
	    UserInfo info = new UserInfo(101,"Tom","[email protected]","2015-10-12");
	    map.put("abc", info);
	}
	
	@RequestMapping(value="/testModelAttribute")
	public String testModelAttribute(@ModelAttribute(value="abc")UserInfo info) {
	    System.out.println("userInfo:"+ info);
	    return "success";
	}
           

1.2 修饰有返回值的方法

实例:	
    @ModelAttribute(value="abc")
    public UserInfo start (Map<String,Object>map) {
	// 模拟数据库访问
	UserInfo userInfo = new UserInfo(101,"Tom","[email protected]","2015-10-12");
	return userInfo;
    }
	
    @RequestMapping(value="/testModelAttribute")
    public String testModelAttribute(@ModelAttribute(value="abc")UserInfo info) {
	System.out.println("userInfo:"+ info);
	return "success";
    }
           

2.在方法的入参前使用@ModelAttribute注解:

        可从隐含对象中获取隐含的模型数据中获取对象

        再将请求参数绑定到对象中,再传入入参

        将方法入参对象添加到模型中

继续阅读