SpringMVC-处理模型数据

7.2.4-处理模型数据

对于MVC框架来说,模型数据是最重要的,因为控制(C)是为了产生模型(M)数据,而视图(V)是为了渲染模型数据。

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

ModelAndView

@ModelAttribute

Map及Model

@SessionAttribute


ModelAndView

控制器处理方法如果返回值为ModelAndView,则其既包含视图信息也包含模型数据信息,这样SpringMVC就可以使用试图对模型数据进行渲染了。(目前我理解的视图信息就是一个字符串,这个字符串代表一个url地址也就是一个显示页面,表明模型数据会在这个页面里渲染)可以简单的将模型数据看成一个Map<String ,Object>对象。(模型数据就是一个保存属性的容器,控制器方法将要渲染的数据保存在这里面,传递给试图View进行渲染。)

可以使用以下方法添加模型数据

ModelAndView addObject(String attributeName,Object attributeValue);

ModelAndView addAllObjects(Map<String,?> modleMap);


@ModelAttribute

如果希望将方法入参添加到模型中,仅需在相应入参中使用@ModleAttribute注解即可。

示例:

@RequestMapping(value="/model1")

public String handleModel1(@ModelAttribute("user") User user) {

    user.setUserID("1000");

    return "/user/createSucess";

}

Spring将请求参数绑定到User对象中,然后再以“user”为键将User对象放到模型中。在准备对视图进行渲染前,SpringMVC还会进一步将模型中的数据转储到视图上下文中以暴露给视图对象。对于JSP视图来说,SPingMVC会将模型数据转储到ServletRequest的属性列表中。

handleModel1()返回的逻辑视图名为/user/createSucess,对应createSucess.jsp对象,这样createSucess.jsp对象就可以使用${user.userName }等方式顺利的访问到模型中的数据了


还可以在方法定义处使用@MdoelAttribute注解。SpringMVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute的方法,并将这些方法的返回值添加到模型中。 

UserController.java:在方法中定义处使用@ModelAttribute

@ModelAttribute(“user”) //在访问UserController中的任何一个请求处理方法钱,SPringMVC先执行该方法,并将返回值以user为键添加到模型中。
public User getUser()     //这里应该就是将user对象添加到隐含模型里区了
{
    User user=new User();
    user.setUserID("1001");
    return user;
}
@RequestMapping(value="/model2")  //在此,模型数据会赋给User的入参,然后根据HTTp请求消息进一步填充覆盖user对象
public String handleModel2(@ModelAttribute("user") User user) {
    user.setuserName("tom")
    return "/user/showUser";
}

提示:处理方法入参最多只能使用一个SpringMVC的注解,即@RequestParam、@CookieValue、@ModelAttribute只能使用其中更多一个,如果使用了两个就会抛出异常。


Map及Model

SpringMVC在调用方法前会创建一个隐含的模型对象,作为模型数据的存储容器,我们称之为“隐含模型”。如果处理方法的入参为Map或Model类型,SpringMVC就会将隐含模型的引用传给这些入参。在方法体内,开发者既可以通过这个入参对象访问到模型中的左右数据,也可以像模型中添加新的属性数据。

@ModelAttribute(“user”) 
public User getUser()    
{
    User user=new User();
    user.setUserID("1001");
    return user;
}
@RequestMapping(value="/modle3")
public String handleModel3(ModelMap modelMap) {
    modelMap.addAttribute("tesetAttr","value1");
    user=(User)modelMap.get("user");
    return "/user/showUser";
}

SpringMVC一旦发现Map或Model类型的入参,就将隐含模型对象传递给这些参数。


@SessionAttributes

SpringMVCdui @RequestAttribute和@SessionAttribute的处理流程

(目前还不是很明白)

1、SpringMVC在调用处理方法钱,在请求线程中自动创建一个隐含模型对象

2、调用所有在方法级标注了@ModelAttribute的方法,并将方法的返回值加入隐含模型中。

3、查看Session中是否存在@SessionAttribute(“xxx”)所制定的xxx属性,如果有,将其添加到隐含模型中。如果隐含模型中已经有xxx属性,该步骤会覆盖模型中已有的属性值。

4、对标注了@ModelAttribute(“xxx”)处理方法的入参按如下流程处理

4、1    如果隐含模型中拥有名为xxx的属性,将其赋给改入参,在有请求消息填充该入参对象直接返回,否则到步骤4.2

4.2    如果xxx是会话属性。即在处理类定义出标注了@SessionAttribure(“xxx”),则尝试从绘画中获取该属性,并将其赋给该入参,然后再用请求消息填充该入参对象。如果会话中找不到对应的属性,则抛出HttpSessionRequiredException异常,否则步骤4.3

4.3    如果隐含模型不存在xxx属性,且xxx也不是会话属性,则创建入参对象实力,在用请求消息填充该入参。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值