Spring MVC ModelAndView 简述



http://blog.csdn.net/u010889145/article/details/50488634

ModelAndView 分为两部分:model和view。model负责参数,view就是视图,也就是页面。相当于统一了Model对象和View对象的功能。

先说说它的工作过程,为保证逻辑清晰,spring mvc搭建的后台一般分为分发功能的Controller层,逻辑判断的Service层,数据库交互的Dao层(也就是按照功能分类的接口和类)。ModelAndView 一般在Controller层作为结果类型返回,其内部的view部分指定返回的页面,model指定返回的参数,以下是示例代码。

[java]   view plain  copy
  1.        @RequestMapping(method=RequestMethod.GET ,value = "/getShareInfo")     //指定访问此接口方式和地址  
  2. public ModelAndView  getShareInfo(Integer liveBroadcastId,String language,Integer userId) {  
  3.     ModelAndView mav = new ModelAndView("share");       //指定页面名称为share  
  4.     ResultTemplateModel<Object> liveModel = liveBroadcastService.getLiveById(liveBroadcastId, language, userId);//执行功能  
  5.     LiveDetailInfoModel liveInfo = (LiveDetailInfoModel) liveModel.getData();     //执行功能,得到结果对象  
  6.     mav.addObject("replayName", liveInfo.getReplayName());    //从结果对象中取出参数放入 ModelAndView 中  
  7.     mav.addObject("startPlayTime()", liveInfo.getStartPlayTime());   
  8.     mav.addObject("address", liveInfo.getAddress());   
  9.     mav.addObject("attentionState", liveInfo.getAttentionState());   
  10.     return mav;       //返回ModelAndView  
  11. }  

然后是它在spring.xml中的配置

[html]   view plain  copy
  1.        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  2.     <!-- 给view返回的指定页面名称添加前后缀 -->  
  3.     <property name="prefix" value="/WEB-INF/views/" />  
  4.     <property name="suffix" value=".jsp" />  
  5. </bean>  

可以看到我指定的视图名称为share,在返回之前,InternalResourceViewResolver会加上前后缀,也就是找到/WEB-INF/views/share.jsp这个文件,然后将你设置在ModelAndView中的参数拼入到share.jsp中。jsp文件中以  ${requestScope.replayName}的形式来接收你在  mav.addObject("replayName", liveInfo.getReplayName());  中设置的参数。于是参数就一个一个固定到jsp文件中了,这个过程也就是ModelAndView的渲染过程。

在当时我还有这么一个疑问:为什么要用jsp页面?为什么不用html页面?到现在仔细想想也就释然了:html是静态页面,它仅有解释作用,就是写什么就看到什么,它并不能像java一样解析一个类,取出一个类中的参数,InternalResourceViewResolver拿到html页面和参数后没办法把两者组合。所以这里也只能使用动态页面来接收ModelAndView类型中的参数,jsp,asp等都是可以的。

上图是对这个接口请求返回的结果,可以看出来这是一个完整的html页面,这个页面也就是我在上面所指定的share.jsp拼完参数之后的结果,所以在请求返回成功后,浏览器应该会自动跳转到请求返回来的这个页面。所以,返回modelandview的方式在实现参数传递的同时也实现了页面跳转。这也解决了我的另外一个问题:如何把当前页面的参数传递到将要跳转的页面中?

总结一下:spring mvc 中的modelandview对象由InternalResourceViewResolver解析器解析后,将modelandview中的参数和指定的页面组合在一起,当成一个完整的html文档返回到请求端,这种方式同时完成了参数的传递和页面的跳转,其缺点在于比起普通的请求来说,这种方式传输的数据要多得多,大量使用会使页面加载变得很慢,影响体验,在关键点使用即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值