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指定返回的参数,以下是示例代码。
- @RequestMapping(method=RequestMethod.GET ,value = "/getShareInfo") //指定访问此接口方式和地址
- public ModelAndView getShareInfo(Integer liveBroadcastId,String language,Integer userId) {
- ModelAndView mav = new ModelAndView("share"); //指定页面名称为share
- ResultTemplateModel<Object> liveModel = liveBroadcastService.getLiveById(liveBroadcastId, language, userId);//执行功能
- LiveDetailInfoModel liveInfo = (LiveDetailInfoModel) liveModel.getData(); //执行功能,得到结果对象
- mav.addObject("replayName", liveInfo.getReplayName()); //从结果对象中取出参数放入 ModelAndView 中
- mav.addObject("startPlayTime()", liveInfo.getStartPlayTime());
- mav.addObject("address", liveInfo.getAddress());
- mav.addObject("attentionState", liveInfo.getAttentionState());
- return mav; //返回ModelAndView
- }
然后是它在spring.xml中的配置
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <!-- 给view返回的指定页面名称添加前后缀 -->
- <property name="prefix" value="/WEB-INF/views/" />
- <property name="suffix" value=".jsp" />
- </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文档返回到请求端,这种方式同时完成了参数的传递和页面的跳转,其缺点在于比起普通的请求来说,这种方式传输的数据要多得多,大量使用会使页面加载变得很慢,影响体验,在关键点使用即可。