您的位置:首页 > 编程语言 > Java开发

Spring MVC ModelAndView 简述

2018-02-06 11:28 253 查看

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

       @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中的配置

[html] view
plain copy

       <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  

    <!-- 给view返回的指定页面名称添加前后缀 -->  

    <property name="prefix" value="/WEB-INF/vie
cd5b
ws/" />  

    <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文档返回到请求端,这种方式同时完成了参数的传递和页面的跳转,其缺点在于比起普通的请求来说,这种方式传输的数据要多得多,大量使用会使页面加载变得很慢,影响体验,在关键点使用即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: