Spring MVC ModelAndView 简述

Spring MVC 的Controller层常用ModelAndView返回结果,它包含view(指定返回页面)和model(返回参数)。ModelAndView使得参数传递和页面跳转得以同时完成,由InternalResourceViewResolver解析后组合成HTML文档返回。然而,这种方式传输数据量大,过度使用可能导致页面加载慢,适用于关键场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自学了一年JAVA,Spring mvc中的ModelAndView 这个东西困扰了我很久,今天在项目过程中偶然用到,于是乎请教高人,查查资料,总算是把这个心结给解决掉,以下记录我自己的理解及备忘,仅供参考,本文内容是站在一个小白的立场上进行阐述的,有不对之处还请指正。接下来直接进入正题:

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文档返回到请求端,这种方式同时完成了参数的传递和页面的跳转,其缺点在于比起普通的请求来说,这种方式传输的数据要多得多,大量使用会使页面加载变得很慢,影响体验,在关键点使用即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值