精华内容
下载资源
问答
  • springmvc视图解析器作用
    2022-07-03 15:10:11

    SpringMVC视图解析器

    1.InternalResourceViewResolver //请求转发视图解析器

    ​ 在返回视图的时候加上"forword:"前缀就可以,前缀后面跟上Contorller的路径,请求转发

    2.ThemeleafView //Themeleaf视图解析器

    3.RedrictView

    ​ 在返回视图的时候加上"redirect:"前缀就可以,前缀后面跟上Contorller的路径,重定向

    转发和重定向使用原则

    业务成功重定向,业务失败转发。因为成功后就和上次请求没关系了

    视图解析器的配置

    <mvc:view-controller path="/" view-name="index"></mvc:view-controller> 如果控制器中仅仅只返回一个视图没有其他逻辑就可以使用该视图解析器标签去配置    ---配置了这个之后spring-mvc中的使用注解方式实现路径映射就会失效
    
    加上这个就可以恢复
    <!-- 开启springmvc的注解驱动-->
    <mvc:annotation-driven />
    
    更多相关内容
  • springMvc视图解析器作用

    千次阅读 2019-05-04 13:15:40
    我们在配置springMVC时通常会配置如下...-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/&g...

    我们在配置springMVC时通常会配置如下代码段: 

    <!-- 视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>

    InternalResourceViewResolver会把返回的视图名称都解析为InternalResourceView对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。比如在InternalResourceViewResolver中定义了prefix=/WEB-INF/,suffix=.jsp,然后请求的Controller处理器方法返回的视图名称为test,那么这个时候InternalResourceViewResolver就会把test解析为一个InternalResourceView对象,先把返回的模型属性都存放到对应的HttpServletRequest属性中,然后利用RequestDispatcher在服务器端把请求forword到/WEB-INF/test.jsp。

    这就是InternalResourceViewResolver一个非常重要的特性,我们都知道存放在/WEB-INF/下面的内容是不能直接通过request请求的方式请求到的,为了安全性考虑,我们通常会把jsp文件放在WEB-INF目录下,而InternalResourceView在服务器端跳转的方式可以很好的解决这个问题。

    展开全文
  • 本篇文章主要介绍了浅谈SpringMVC视图解析器(ViewResolver),具有一定的参考价值,有兴趣的可以了解一下
  • springmvc视图解析器详解

    目录

    1. 概述

    2. ViewResolver和View接口

    2.1 ViewResolver接口

    2.2 View接口

    3. springmvc中如何解析视图

    3.1 初始化视图解析器

    3.2 解析逻辑视图名

    3.3 请求转发与重定向的视图解析

    3.4 配置JstlView视图

    3.5 产生上面异同的原因

    4. 配置thymeleaf视图

    5. 使用多种视图

    6. 简化返回视图

    1. 概述

            文章有点长,建议收藏阅读

            当一个请求被HandlerMapping处理完后,会返回一个ModelAndView对象,springmvc借助视图解析器(ViewResolver)得到最终将逻辑视图解析为视图对象(View),最终的视图可以是jsp,html,也可能是Excel等,转换成对应的View对象后渲染给用户,即返回浏览器,在这个渲染过程中,发挥作用的就是ViewResolver和View两个接口

            对于最终采取哪种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点在生产模型数据上,从而实现mvc的充分解耦,视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户端,主要就是完成转发或重定向操作

    2. ViewResolver和View接口

    2.1 ViewResolver接口

    public interface ViewResolver {
        /**
         * 只有这一个方法,用于把逻辑视图名称解析为真正视图View
         /
       @Nullable
       View resolveViewName(String viewName, Locale locale) throws Exception;
    
    }

    视图解析器继承关系:

    从上图可以看出,springmvc提供了很多的视图解析器,下面说明一个常用的:

    (1)UrlBasedViewResolver(URL资源视图):

    主要就是提供的一种拼接URL的方式来解析视图,他可以指定前缀和后缀,然后拼接到返回的逻辑视图名称,就是指定的视图URL了

    (2)子类InternalResourceViewResolver:

    将视图名解析为一个URL文件,一般使用该解析器将视图名映射为一个保存在WEB-INF下的程序文件如jsp

    jsp是常见的视图技术,可以使用InternalResourceViewResolver作为视图解析器:

    案例一:

    @Controller
    public class LoginController {
        @RequestMapping(value = "login")
        public String login() {
            return "login";
        }
    }
    
    //在springmvc中没有配置视图解析器的情况下,访问/login,会报错,错误的大概意思就是没有正确设置转发(或包含)到请求调度程序路径
    //意思就是把逻辑视图解析后的URL路径还是/login,因为默认情况下该视图解析器解析视图是没有配置前缀和后缀的

     

     抛出异常的就是下面那一行,准备渲染视图时进行的检查抛出的

     现在在springmvc.xml文件中配置InternalResourceViewResolver视图解析器的前缀和后缀

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

    再次访问/login,得到下图,就能看出区别,两个path是不一样的

    2.2 View接口

            不同的视图解析器解析成对应的视图类型

            View接口有很多实现类,接口中有一个重要方法render(),用于渲染给定模型的视图,下面是继承结构,打钩的是常用的视图类型,当然也可以自己实现ViewResolver和View接口,自定义自己的视图解析器

    InternalResourceView视图:

            将jsp或者其他资源封装成一个视图,是InternalResourceViewResolver默认使用的视图实现类

    文档视图:

            AbstractExcelView: Excel文档视图的抽象类,该视图类基于POI构造excel文档

    JSON视图:

            MappingJacksonJsonView: 将数据模型通过Jackson开源框架的ObjectMapper以JSON方式输出

    如访问localhost:8080/springmvc/login得到的视图(InternalResourceView)如下:

     

    3. springmvc中如何解析视图

    3.1 初始化视图解析器

    private List<ViewResolver> viewResolvers;  //定义视图解析器集合
    private void initViewResolvers(ApplicationContext context) {
        
      	/**
      	 * DispatcherServlet类中通过该方法初始化viewResolvers,如果容器中没有ViewResolver bean,则默认为			  	        * InternalResourceViewResolver
      	 /
      	 
      	 //其他代码不用关心
      	
    }

    3.2 解析逻辑视图名

    也就是依次调用viewResolvers中视图解析器,如果得到了View就返回

    3.3 请求转发与重定向的视图解析

    请求转发: 返回逻辑视图名包含forward:前缀

    重定向: 返回逻辑视图名包含redirect:前缀

    默认的: 返回视图名不带任何前缀

    此时我们知道默认视图解析器为InternalResourceViewResolver,我们也没有配置其他的

    (1)如果是默认的,则解析后是InternalResourceView,如下图

    (2)如果是请求转发,则解析后是InternalResourceView,如下图

     

    (3)如果重定向,则解析后是RedirectView,如下图

     

    3.4 配置JstlView视图

            注意这里是配置视图不是视图解析器,当没有配置其他视图解析器(比如thymeleaf),但配置了InternalResourceViewResolver的viewClass属性

    默认的: 就使用viewClass对应的视图,当前是JstlView

    请求转发: 则解析后还是InternalResourceView

    重定向: 则解析后还是RedirectView

    如果导入相关Jstl相关jar包后,默认的视图会自动切换为JstlView,就不用在下面配置viewClass,也会自动生效

     

            JstlView是InternalResourceView的子类,功能比InternalResourceView更强大,比如可以支持快速国际化,或者如果JSP文件中使用了JSTL国际化标签功能,则需要使用该类视图

    JstlView视图依赖

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    3.5 产生上面异同的原因

            比如访问localhost:8080/springmvc/login

            为什么重定向与请求转发,解析后的视图类型不一样,或者添加JstlView依赖后又会产生不一样?

            就需要知道InternalResourceViewResolver如何解析视图的,当前springmvc中只有这一个默认视图解析器

    InternalResourceViewResolver继承结构如下:

    1.从DispatcherServlet中视图解析入口

     

    2.进入resolveViewName()方法

            此时进入到AbstractCachingViewResolver中的resolveViewName()方法,从上面继承结构知道,只有AbstractCachingViewResolver实现了ViewResolver接口中解析方法,具体源码如下:

    @Override
    @Nullable
    public View resolveViewName(String viewName, Locale locale) throws Exception {
       if (!isCache()) {
          return createView(viewName, locale);
       }
       else {
           /**
    	 	* getCacheKey()实际上就是返回视图名称,在UrlBasedViewResolver中重写的,此时是cacheKey="login"
    	 	*/
          Object cacheKey = getCacheKey(viewName, locale);
           
           /**
    	 	* 尝试从缓存中获取视图,此时viewAccessCache的size为0,因为是第一次获取视图,缓存中肯定没有的
    	 	*  viewAccessCache中key:value比如为:
    	 	*  	key:"redirect:login"  value:"RedirectView"
    	 	* 	key:"login" 		  value:"InternalResourceView"
    	 	*/
          View view = this.viewAccessCache.get(cacheKey);
          if (view == null) {
               /**
    	 	    * 如果没有获取到,就在同步块中创建一个视图并返回,并将其缓存,以便下一次需要该视图的时候直接从缓存中返回即可
    	 	    */
             synchronized (this.viewCreationCache) {
                view = this.viewCreationCache.get(cacheKey);
                if (view == null) {
                     /**
                      **********************************************************************
    	 	          * 重要的就是这个方法,他决定了创建什么类型的视图,但在URLBasedViewResolver被重写了
    	 	          **********************************************************************/
                   view = createView(viewName, locale);
                   if (view == null && this.cacheUnresolved) {
                      view = UNRESOLVED_VIEW;
                   }
                   if (view != null && this.cacheFilter.filter(view, viewName, locale)) {
                     /**
    	 	          * 将逻辑视图名与对应视图存入缓存中
    	 	          */
                      this.viewAccessCache.put(cacheKey, view);
                      this.viewCreationCache.put(cacheKey, view);
                   }
                }
             }
          }
          else {
             if (logger.isTraceEnabled()) {
                logger.trace(formatKey(cacheKey) + "served from cache");
             }
          }
          return (view != UNRESOLVED_VIEW ? view : null);
       }
    }

    3. 进入createView():

    用来创建一个视图, 具体源码如下:

    @Override
    protected View createView(String viewName, Locale locale) throws Exception {
    
       /**
    	* 判断一下当前视图解析器能不能处理给定视图,如果不能处理的话,就返回null,交给下一个视图解析器处理
    	*/
       if (!canHandle(viewName, locale)) {
          return null;
       }
    
       /**
    	* 检查视图名是否以 "redirect:" 开头
    	*/
       if (viewName.startsWith(REDIRECT_URL_PREFIX)) {
           /**
    		* 去掉前缀,得到后面的重定向地址
    		*/
          String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());
           /**
    		* 创建一个重定向视图
    		*/
          RedirectView view = new RedirectView(redirectUrl,
                isRedirectContextRelative(), isRedirectHttp10Compatible());
          String[] hosts = getRedirectHosts();
          if (hosts != null) {
             view.setHosts(hosts);
          }
          return applyLifecycleMethods(REDIRECT_URL_PREFIX, view);
       }
    
        /**
    	 * 检查视图名是否以 "forward:" 开头
    	 */
       if (viewName.startsWith(FORWARD_URL_PREFIX)) {
          String forwardUrl = viewName.substring(FORWARD_URL_PREFIX.length());
            /**
    	 	 * 创建请求转发InternalResourceView视图
    	 	 */
          InternalResourceView view = new InternalResourceView(forwardUrl);
          return applyLifecycleMethods(FORWARD_URL_PREFIX, view);
       }
    
        /**
    	 * 如果视图名不以"redirect:"或"forward:"为前缀,则通过父类中的实现创建视图
    	 */
       return super.createView(viewName, locale);
    }

    4.进入super.createView()

    从上面继承结构知道,所以回到了AbstractCachingViewResolver中,他的实现如下:

    5.进入loadView()

    而loadView()这是个抽象方法,在UrlBasedViewResolver中实现,父类又调用子类实现,spring中有很多这种模式

    实现如下:

     

    6.进入buildView()

            这个方法就在当前类URLBasedViewResolver中的,但是此时视图解析器为InternalResourceViewResolver,在这个子类中又重写了这个方法,下图为InternalResourceViewResolver中的重写,当前实际调用的是这个,而这个实际调用的又是URLBasedViewResolver中的,有点绕,但是跟着debug知道他的设计模式后就会一点一点明白的

     回到URLBasedViewResolver中:

    protected AbstractUrlBasedView buildView(String viewName) throws Exception {
       Class<?> viewClass = getViewClass(); ;//获取viewClass,需要viewClass
       Assert.state(viewClass != null, "No view class");
    
       AbstractUrlBasedView view = (AbstractUrlBasedView) BeanUtils.instantiateClass(viewClass);
       view.setUrl(getPrefix() + viewName + getSuffix());
       view.setAttributesMap(getAttributesMap());
       //********省略部分
       return view;
    }

            最终,我们默认返回的视图类型就在这里创建的,而请求转发和重定向解析的视图类型在上面代码中已经固定

            因为当前项目中添加了Jstl依赖,所以返回默认视图时,解析为JstlView视图,如果不添加Jstl依赖,此时解析为InternalResourcesView视图,这也是为什么配置URLBasedViewResolver解析器时需要配置viewClass,而配置InternalResourcesViewResolver解析器时不用配置viewClass,应该InternalResourcesViewResolver已经设置viewClass默认为InternalResourceView

     

    4. 配置thymeleaf视图

    1. 导入依赖并配置

    <!-- thymeleaf -->
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring5</artifactId>
        <version>3.0.13.RELEASE</version>
    </dependency>
    <!-- 配置Thymeleaf视图解析器 -->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <!-- 视图前缀 -->
                        <property name="prefix" value="/WEB-INF/"/>
                        <!-- 视图后缀 -->
                        <property name="suffix" value=".html"/>
                        <property name="templateMode" value="HTML5"/>
                        <property name="characterEncoding" value="UTF-8" />
                    </bean>
                </property>
            </bean>
        </property>
    </bean>

    2. 查看springmvc中的解析

    直接看图: 此时就只有thymeleaf解析器了,此时

    默认的: 解析为ThymeleafView

    请求转发: 则解析后还是InternalResourceView

    重定向: 则解析后还是RedirectView

    再看一张图:

            thymeleaf解析器继承了AbstractCachingViewResolver,从上面知道,AbstractCachingViewResolver解析视图类型时先从缓存中找,缓存中没有的话就调用createView()方法来创建一个

     

    而此时thymeleaf重写了该方法,源码如下: 

    5. 使用多种视图

            我们可以选用一种视图解析器或混用多种视图解析器,每个视图解析器都实现Ordered接口并开放出一个order属性,springmvc会按照视图解析器顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则抛出异常

    <!-- 配置InternalResourceViewResolver视图解析器 -->
    <bean id="viewResolver2" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
        <property name="order" value="2"/>
    </bean>
    
    <!-- 配置thymeleaf视图解析器 -->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
            <property name="order" value="1"/>
            <property name="characterEncoding" value="UTF-8"/>
            <property name="templateEngine">
                <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                    <property name="templateResolver">
                        <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                            <!-- 视图前缀 -->
                            <property name="prefix" value="/WEB-INF/"/>
                            <!-- 视图后缀 -->
                            <property name="suffix" value=".html"/>
                            <property name="templateMode" value="HTML5"/>
                            <property name="characterEncoding" value="UTF-8" />
                        </bean>
                    </property>
                </bean>
            </property>
        </bean>

    配置的order越小,优先级越高,当前thmeleaf视图解析器在前,如下图:

    6. 简化返回视图

            当控制器只是返回视图时,可以在springmvc配置文件中配置来简化,并且需要加上开启注解驱动,否则造成@Controller注解无法解析,造成404错误

    <!--此时直接访问localhost:8080/springmvc/login就可以获取名为login的逻辑视图 -->
    <mvc:view-controller path="/login" view-name="login"></mvc:view-controller>
    <mvc:annotation-driven/>

    展开全文
  • 这篇文章主要介绍了SpringMVC中几种常用的视图解析器

    这篇文章,主要介绍SpringMVC框架中的几种视图解析器。

    目录

    一、视图解析器

    1.1、什么是视图解析器

    1.2、InternalResourceViewResolver

    1.3、UrlBasedViewResolver

    1.4、FreeMarkerViewResolver

    1.5、ThymeleafViewResolver

    1.6、RedirectView


    一、视图解析器

    1.1、什么是视图解析器

    视图解析器(ViewResolver),是SpringMVC框架中的一个组件,它的主要作用是:根据对应的视图名称,找到具体的视图模板对象。

    视图,是MVC三层结构里面的V表现层,用于向客户端展现数据的,常见的视图有:html、jsp、thymeleaf、freemarker等等。

    SpringMVC框架里面给我们提供了多种视图解析器,并且还可以引入第三方的视图解析模板,例如:thymeleaf、freemarker。

    下面介绍一下SpringMVC框架中的几种视图解析器。

    1.2、InternalResourceViewResolver

    【InternalResourceViewResolver】叫做内部视图解析器,它是实际开发过程里面,使用最多的视图解析器。内部视图解析通过事先配置好【视图前缀】和【试图后缀】信息,然后拼接上【视图名称】,找到具体的视图模板。

    具体拼接格式:【视图前缀】+【视图名称】+【视图后缀】。

    • 在【spring-mvc.xml】配置文件里面,添加【InternalResourceViewResolver】的配置。
    <!-- 配置视图解析器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 视图路径前缀 -->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <!-- 视图文件后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>
    • 然后我们需要在【webapp】目录下,创建【视图前缀】目录路径,上面配置的是【/WEB-INF/pages】。

    •  之后,我们所有的【jsp】页面都需要放在【pages】目录下面,才能够被SpringMVC的视图解析器获取到。

    查看【InternalResourceViewResolver】源码,发现它是继承自【UrlBasedViewResolver】类的,【UrlBasedViewResolver】类是一个通过【URL】拼接来实现的视图解析器。

    继续查看【InternalResourceViewResolver】源码,里面有一个【buildView】方法,这个方法作用就是根据【视图名称】,创建具体的视图对象,它返回的是一个【InternalResourceView】类型的对象。

     以上,就是【InternalResourceViewResolver】视图解析器的大致源码。

    1.3、UrlBasedViewResolver

    【UrlBasedViewResolver】视图解析器,就是一个通过拼接【URL】的视图解析器,使用这种视图解析器,不但需要设置【视图前缀】和【视图后缀】,还需要额外设置一个【视图类】对象,因为【UrlBasedViewResolver】需要根据具体的视图类【viewClass】来创建视图对象,如果没有设置,那么启动时候就会抛出异常。

    • 通过【UrlBasedViewResolver】配置视图解析器。
    <!-- 配置视图解析器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <!-- 配置视图类 -->
        <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
        <!-- 配置视图前缀 -->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <!-- 配置视图后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>
    • 通过上面的配置,我搭建的工程启动时候报错了,报错提示是:
    PropertyAccessException 1: org.springframework.beans.MethodInvocationException:
     Property 'viewClass' threw exception; nested exception is java.lang.IllegalArgumentException: 
    Given view class [org.springframework.web.servlet.view.InternalResourceViewResolver] 
    is not of type [org.springframework.web.servlet.view.AbstractUrlBasedView]
    
    • 大致意思是:给定的viewClass类型不匹配,需要【AbstractUrlBasedView】类型的。

    • 我去查看源码,发现是如下地方进行类型转换时候,报错的。

    •  然后,我查看了【InternalResourceViewResolver】类的继承关系图,发现确实没有【AbstractUrlBasedView】类型的。

    具体没有解决,我知道是springMVC的版本问题,还是其他什么原因,我使用的版本是:【spring-webmvc-5.1.15.RELEASE】。

    如果有朋友知道什么原因,可以评论区告诉我一下,谢谢。

    1.4、FreeMarkerViewResolver

    【FreeMarkerViewResolver】也是【UrlBasedViewResolver】的子类,也是根据拼接【URL】进行视图解析的。要使用【FreeMarkerViewResolver】必须引入【FreeMarker】的依赖,因为【FreeMarker】是第三方的依赖。

    • 引入【freemarker】和【spring-context-support】依赖。
    <!-- 引入 freemarker 依赖 -->
    <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
    <dependency>
      <groupId>org.freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>2.3.28</version>
    </dependency>
    <!-- 引入 spring 对 freemarker 的依赖支持 -->
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>5.2.15.RELEASE</version>
    </dependency>
    • 在【spring-mvc.xml】配置freemarker视图解析器。
    <!-- 配置视图解析器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <!-- 设置响应类型 -->
        <property name="contentType" value="text/html;charset=utf-8"/>
        <!-- 配置视图前缀 -->
        <property name="prefix" value="fm_"/>
        <!-- 配置视图后缀 -->
        <property name="suffix" value=".ftl"/>
    </bean>
    <!-- 配置模板路径 -->
    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <!-- 设置模板路径, 需要引入 spring-context-support 依赖的支持 -->
        <property name="templateLoaderPath" value="/WEB-INF/templates"/>
        <!-- 设置字符集 -->
        <property name="freemarkerSettings">
            <props>
                <prop key="defaultEncoding">UTF-8</prop>
            </props>
        </property>
    </bean>
    • 在【WEB-INF】目录下,创建【templates】目录,用于存放freemarker文件,并且新增一个【fm_free.ftl】文件。

    • 为什么需要添加【fm_】呢???因为我们配置了前缀是【fm_】,所以文件名称必须添加上这个前缀。
    <html>
    <head>
        <meta charset="utf-8">
        <title>视图解析器</title>
    </head>
    <body>
        <h3>${data}</h3>
    </body>
    </html>
    • 创建测试控制器类。
    @Controller
    public class FreeMarkerController {
    
        @RequestMapping("/freemarker")
        public String freemarker(Model model) {
            // 跳转到 fm_free.ftl 页面
            model.addAttribute("data", "采用Freemarker视图解析器");
            return "free";
        }
    
    }
    • 浏览器访问。

    1.5、ThymeleafViewResolver

    SpringMVC框架里面,没有给我们提供ThymeleafViewResolver视图解析器,我们需要引入第三方依赖【thymeleaf】如下所示。

    • 引入【thymeleaf】和【thymeleaf-spring5】依赖(使用哪个版本的spring,就引入哪个版本)。
    <!-- 引入 thymeleaf 依赖 -->
    <!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf -->
    <dependency>
      <groupId>org.thymeleaf</groupId>
      <artifactId>thymeleaf</artifactId>
      <version>3.0.11.RELEASE</version>
    </dependency>
    <!-- 引入 thymeleaf 和 spring5 的支持 -->
    <!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring5 -->
    <dependency>
      <groupId>org.thymeleaf</groupId>
      <artifactId>thymeleaf-spring5</artifactId>
      <version>3.0.11.RELEASE</version>
    </dependency>
    • 在【spring-mvc.xml】中配置thymeleaf视图解析器。
    <!-- 配置视图解析器 -->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <!-- 配置模板解析引擎 -->
        <property name="templateEngine" ref="templateEngine"/>
        <!-- 设置字符集 -->
        <property name="characterEncoding" value="utf-8"/>
    </bean>
    <!-- 配置模板解析引擎 -->
    <bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine">
        <!-- 设置模板解析器 -->
        <property name="templateResolver" ref="templateResolver"/>
    </bean>
    <!-- 配置模板解析器 -->
    <bean id="templateResolver" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
        <!-- 配置模板前缀 -->
        <property name="prefix" value="/WEB-INF/thymeleaf/"/>
        <!-- 配置模板后缀 -->
        <property name="suffix" value=".html"/>
        <!-- 设置模板字符集 -->
        <property name="characterEncoding" value="utf-8"/>
    </bean>
    • 在【WEB-INF】目录下,创建【thymeleaf】目录,新增一个【thymeleaf.html】文件。

    • 新增一个【thymeleaf.html】文件。
    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Thymeleaf视图解析器</title>
    </head>
    <body>
        <h3 th:text="${data}"></h3>
    </body>
    </html>
    • 创建测试控制器类。
    @Controller
    public class ThymeleafController {
    
        @RequestMapping("/thymeleaf")
        public String thymeleaf(Model model) {
            // 跳转到 fm_free.ftl 页面
            model.addAttribute("data", "采用Thymeleaf视图解析器");
            return "thymeleaf";
        }
    
    }
    • 浏览器访问结果如下。

    1.6、RedirectView

    SpringMVC框架中,还提供了重定向视图,顾名思义,就是当重定向的时候,会创建的视图类型。我们在SpringMVC框架中,返回的视图名称之前添加【redirect:】时候,此时调用的就是RedirectView重定向视图。下面看个案例。

    • 编写一个重定向控制器。
    @Controller
    public class RedirectController {
    
        @RequestMapping("/index")
        public String index() {
            // 跳转到 index.jsp 页面
            return "index";
        }
    
        @RequestMapping("/redirect")
        public String redirect() {
            // 重定向到 /index 路径
            return "redirect:/index";
        }
    
    }
    • 打开浏览器,访问【http://localhost:8080/springmvc/redirect】。

    • SpringMVC框架里面,它会从视图名称里面解析【redirect:】,如果存在【redirect:】前缀,那么就会创建一个【RedirectView】对象,然后执行重定向的操作。源代码如下所示:

     以上,就是重定向时候创建的视图对象。

    综上,这篇文章结束了,主要介绍了SpringMVC中几种常用的视图解析器。

    【源代码地址:https://gitee.com/zhuyoubin/ssm_code/tree/master/spring-mvc/springmvc-demo04】。

    展开全文
  • 理解视图和视图解析器的解析流程、使用常用的InternalResourceView和JstlView、实现自定义视图、实现重定向操作
  • SpringMVC-视图和视图解析器

    千次阅读 2019-05-06 22:56:46
    视图(View)和视图解析器(ViewResolver)的工作流程: 当请求处理方法处理完请求之后,会返回String、ModelAndView、或View对象,如return “success”,但这三种返回值最终都会被SpringMVC统一转化为ModelAndView对象...
  • SpringMvc 视图解析器

    2020-05-27 16:26:56
    视图解析器作用 -----bean 视图解析器是写在 springmvc.xml 的配置文件中 一般地视图解析器配置如下: <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver...
  • springmvc配置视图解析器
  • 若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView。 1.ThymeleafView视图 当控制器方法中所设置的视图名称没有任何前缀时,此时...
  • SpringMVC——视图和视图解析器

    千次阅读 2019-07-19 16:10:47
    SpringMVC用于处理视图最重要的两个接口是ViewResolver(视图解析器)和View(视图)。ViewResolver的主要作用是把一个逻辑上的视图名解析为一个真正的视图,解析的时候会向视图中填充模型数据。SpringMVC中用于把视图...
  • SpringMVC视图解析器(ViewResolver)

    千次阅读 2021-05-27 19:41:52
    1,概述 在配置<mvc:annotation-driven.../>...当Controller的处理方法处理完成后,该处理方法可返回:String(逻辑视图名)、View(视图对象)、ModelAndView(同时包括Model与逻辑视图或View),而View对象才.
  • SpringMVC视图解析器

    千次阅读 2021-07-06 20:58:07
    SpringMVC的自定义视图解析器 [1] SpringMVC视图解析器 问题: 我们在使用了SpringMVC后,对于请求的处理由以前我们自己声明 Servlet处理,变为声明单元方法来处理。请求处理完成之后,需要将 处理结果响应给...
  • SpringMVC 视图解析器

    千次阅读 2019-04-22 16:57:24
    1.视图解析器 会 根据 把控制器返回的逻辑视图名 确定渲染模型的视图文件的物理位置。 Spring MVC的一个重要特性:将控制器中处理请求的逻辑 和 视图中渲染实现 解耦。 控制器方法和视图实现 只会在模型内容上保持...
  • 提供了一种拼接 URL 的方式来解析视图。通过 prefix 属性指定前缀,suffix 属性指定后缀。当 ModelAndView 对象返回具体的 View 名称时,它会将前缀 prefix 和后缀 suffix 与具体的视图名称拼接,得到一个视图资源...
  • 配置视图解析器 1.导入依赖包 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.15</version> </...
  • 本篇文章讲述了SpringMVC的视图是怎么进行解析的,讲解了视图、视图解析器以及常用的视图解析器实现类。
  • 在Spring MVC应用程序中,我们经常需要应用一些视图解析器策略来解析视图名称。例如,联合使用三个视图解析器:InternalResourceViewResolver、ResourceBundleViewResolver和XmlViewResolver。 但是,如果返回了...
  • SpringMVC配置thymeleaf视图解析器
  • SpringMVC 视图解析流程

    2019-03-30 20:33:10
    视图和视图解析器 • 请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String,View 或 ModeMap 等类型的 处理方法,Spring MVC 也会在内部将它们装配成一个 ModelAndView 对象,它包含了...
  • 5. SpringMVC视图解析

    2020-06-01 14:37:18
    文章目录SpringMVC视图解析过程1. 视图解析器2. 视图`☆` SpringMVC视图解析过程 首先我们需要明白–不论控制器(就是我们使用@Controller注解标记的类)返回的是String,ModelAndView,View数据SpringMVC都会转换为...
  • SpringMVC配置视图解析器 SpringMVC配置视图解析器 在制定视图的时候,有可能有大量的重复路径,例如: mv.setViewName("/WEB-INF/view/show1.jsp"); mv.setViewName("/WEB-INF/view/show2.jsp"); mv.setViewName("/...
  • SpringMVC中视图解析器作用

    千次阅读 2017-10-30 17:13:41
    视图解析器是写在springmvc的配置文件中, 如果在web-xml文件中没有显示配置这个xml文件的话 会默认加载-servlet.xml, 并且文件自动存放在WEB-INF下;如果显示配置了,如在xml中配置了/config/springmvc-config.xml...
  • 前言前面我们了解了MVC模式,本章...SpringMVC的配置流程导入maven依赖添加spring的配置配置web.xml文件使用注解配置控制导入Maven依赖这里我们需要spring-webmvc包<dependency><groupId>org.springf...
  • 1. 视图解析器定义 把一个逻辑上的视图名称解析为一个真正的视图名称解析成一个真正的视图,即将逻辑视图的名称解析为具体的 View 对象, 让View对象去处理视图,并将带有返回数据的视图反馈给客户端。 视图解析器...
  • * springmvc视图解析 * @Title: viewResolver * @Description: TODO * @Date 2018年8月28日 下午4:46:07 * @author OnlyMate * @return */ @Bean public InternalResourceViewResolver viewResolver(){ ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,032
精华内容 28,012
关键字:

springmvc视图解析器作用

spring 订阅