Spring MVC ModelAndView

使用ModelAndView类用来存储处理完后的结果数据,以及显示该数据的视图。从名字上看ModelAndView中的Model代表模型,View代表视图,这个名字就很好地解释了该类的作用。

业务处理器调用模型层处理完用户请求后,把结果数据存储在该类的model属性中,把要返回的视图信息存储在该类的view属性中,然后让该ModelAndView返回该Spring MVC框架。框架通过调用配置文件中定义的视图解析器,对该对象进行解析,最后把结果数据显示在指定的页面上。

它既能返回视图(html页面), 还能携带该html页面所需要的数据,只要把html页面连同数据一起返回给前端,我们后端的工作就结束了。

知道了它强大的功能,下面解析一下该如何使用。

首先它是如何返回视图的?
一个ModelAndView只能返回一个html页面,你只需要把html页面的名字给ModelAndView就可以了。
例如我想打开home.html页面: ModelAndView.setViewName(“home”)

其次它如何携带数据?
它有很多函数,其中最好用的就是addObject(name,object ),把你想要传到前端的object起一个名字,在前端就可以根据你起的名字获得这个object。

它可以携带很多数据,但是注意起名不能重复。

通过ModelAndView构造方法可以指定返回的页面名称,也可以通过setViewName()方法跳转到指定的页面 , 使用addObject()设置需要返回的值,addObject()有几个不同参数的方法,可以默认和指定返回对象的名字。

========================================

一,ModelAndView 介绍:

  1)ModelAndView 用于后台与前端页面交互;

  2)可以用于重定向与转发到指定页面,

  3)可以保存数据然后渲染到页面

二,使用:

  1)在Controller层的方法返回值写为ModelAndView 

  2)在方法内 new一个 ModelAndView

  3)给ModelAndView 赋值

  4)返回ModelAndView

三,常用返回类型与页面渲染方法:

1)返回值

// List
 List<String> list = new ArrayList<String>();
 list.add("张三");
 list.add("李四");
 list.add("王五");
 mav.addObject("userList", list);
 
// Map
 Map<String, String> map = new HashMap<String, String>();
 map.put("zhangsan", "张三");
 map.put("lisi", "李四");
 map.put("wangwu", "王五");
 mav.addObject("map", map);

2)页面

//list 
<%@ prefix="c" taglib uri="http://java.sun.com/jsp/jstl/core" %>
   <c:forEach items="${userList}" var="u"> 
   <c:out value="${u}"></c:out> 
</c:forEach>

//map
<c:forEach items="${map}" var="n"> 
   <c:out value="${n.value}"></c:out> 
</c:forEach>

四,Spring MVC 配置:

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<!-- 
prefix用于给返回的视图名之前添加路径,例如返回index,
那就在项目的根路径下加上 /index (如果项目路径是:http://localhost:8080/portal)
那么返回的路径就是:http://localhost:8080/portal/index
-->
<property name="suffix" value=".jsp" />
<!-- 
suffix用于给返回的视图名之前添加后缀,例如返回index,
那么返回的路径就是:http://localhost:8080/portal/index.jsp
-->
</bean>

========================================

 示例 1:

注解的方式

package com.itheima.config;


import com.itheima.interceptor.ResourcesInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import java.util.List;

@Configuration
@PropertySource("classpath:ignoreUrl.properties")
//等同于<context:component-scan base-package="com.itheima.controller"/>
@ComponentScan({"com.itheima.controller"})
/*@Import({MyWebMvcConfig.class})*/
@EnableWebMvc
public abstract class SpringMvcConfig implements WebMvcConfigurer {

    @Value("#{'${ignoreUrl}'.split(',')}")
    private List<String> ignoreUrl;

    @Bean
    public ResourcesInterceptor resourcesInterceptor(){

        return new ResourcesInterceptor(ignoreUrl);
    }

    /*
     * 在注册的拦截器类中添加自定义拦截器
     * addPathPatterns()方法设置拦截的路径
     * excludePathPatterns()方法设置不拦截的路径
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor( resourcesInterceptor()).addPathPatterns("/**").excludePathPatterns("/css/**","/js/**","/img/**");
    }

    /*
     *开启对静态资源的访问
     * 类似在Spring MVC的配置文件中设置<mvc:default-servlet-handler/>元素
     */
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {

        configurer.enable();
    }

    /* 配置视图解析器的,该方法的参数 ViewResolverRegistry 是一个注册器,用来注册你想自定义的视图解析器等。 */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        /*   前缀为 /admin/   后缀为 .jsp  */
        registry.jsp("/admin/",".jsp");
    }

}

========================================

REF

https://blog.csdn.net/qq_40774175/article/details/87932825

https://www.cnblogs.com/alsf/p/9134589.html

原文地址:https://www.cnblogs.com/emanlee/p/15731581.html