zoukankan      html  css  js  c++  java
  • SpringMVC:多视图解析器配置以及问题

    参考文章:https://www.cnblogs.com/daxin/p/3551537.html

    多个视图解析器的配置

    在SpringMVC模式当中可以通过如下配置来支持多视图解析

        <!-- jsp jstl -->
        <bean id="JSPViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
            <property name="viewNames" value="*jsp" />
            <property name="contentType" value="text/html; charset=utf-8"/>  
            <property name="prefix" value="/" />
            <property name="suffix" value="" />
            <property name="order" value="1"></property>
        </bean>
    <bean id="FMViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
            <property name="viewNames" value="*html" />
            <property name="contentType" value="text/html; charset=utf-8"/>
            <property name="cache" value="true" />
            <property name="prefix" value="/" />
            <property name="suffix" value="" />
            <property name="order" value="0"></property>
    </bean>

    首先可以使用order属性进行设置 系统首先按解析器的order值进行查找 首先使用FreeMarkerViewResolver解析器调用canHandle方法,判断当前解析器对视图是否能够解析。如不能解析在依次调用。

    具体使用

    单个视图解析器:

    1、springmvc配置文件

         <!-- 3.配置jsp 显示ViewResolver视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
        </bean>

    2、静态页面

     3、Controller接口

     可以成功跳转!

    问题,如果jsp页面不在jsp目录下,怎么跳转?

    关于springmvc多视图解析器解析的问题:

    假设我现在有两个jsp页面,分别在其它的目录下怎么办:

    1、WEB-INF/A/a.jsp  

    2、WEB-INF/B/b.jsp  

    controller接口

    但是报404,因为jsp目录下没有a.jsp这个页面,显然返回的视图名有一开始定义的视图解析器处理了。

    那要如何按照自己的设想进行跳转呢? 

    解决方案

    最简单的办法是使用其viewNames属性,来指定一个是否可以处理的规则

    <property name="viewNames" value="A*"/>

    <property name="viewNames" value="B*"/>

    如上两个的意思是对A或B开头的视图名进行处理,比如返回的视图名为A/a(或者A_a) 那么会交给viewNames为A*的那个解析器处理;支持的规则可以查看javadoc。

     

    多视图解析器配置

    controller层

    SpringMVC配置

        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
            <!--
                支持通配符,如果返回的视图名的开头是A,则使用该视图解析器
                也可以定义为 *A*:表示包含A的
             -->
            <property name="viewNames" value="A*"/>
            <!-- 如果定义为:value="/WEB-INF/A/",返回的视图名为A/a,会拼接成/WEB-INF/A/A/a.jsp就找不到了 -->
            <property name="prefix" value="/WEB-INF/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
            <property name="viewNames" value="B*"/>
            <property name="prefix" value="/WEB-INF/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
        </bean>

    注意点

    新增两个视图解析器,注意默认的视图解析器(就是没有设置viewNames属性的),必须放在新增的视图解析器的后面。

    否则返回的页面还是由默认的视图解析器解析的,就会导致404。

    如果就想要默认的视图解析器写在最上面该怎么办,我们可以通过设置视图解析器的顺序。

        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 默认的视图:不定义顺序或者定义的顺序要比其他的视图解析器的order值要大 -->
            <property name="order" value="2"/>
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
        </bean>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- viewNames和order属性需要同时定义,先后顺序可随意-->
            <property name="order" value="1"/>
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
            <!--
                支持通配符,如果返回的视图名的开头是A,则使用该视图解析器
                也可以定义为 *A*:表示包含A的
             -->
            <property name="viewNames" value="A*"/>
            <!-- 如果定义为:value="/WEB-INF/A/",返回的视图名为A/a,会拼接成/WEB-INF/A/A/a.jsp就找不到了 -->
            <property name="prefix" value="/WEB-INF/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="order" value="1"/>
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
            <property name="viewNames" value="B*"/>
            <property name="prefix" value="/WEB-INF/"/>
            <property name="suffix" value=".jsp"/>
        </bean>

     成功!

    致力于记录学习过程中的笔记,希望大家有所帮助(*^▽^*)!
  • 相关阅读:
    controller接收前台数据—中文乱码问题
    如何将Object类型转换成String类型
    Spring MVC 关于controller的字符编码问题
    互联网金融--支付结算平台的测试
    delphi控件安装(安装ODAC、TeeChart、TServerSocket、TWSocketServer、TComm)
    软件业虽然建立在硬件行业之上,门槛低、更容易,但同时也是食物链的顶端(各行各业都需要信息化,所以就造成良莠不齐。大部分人,甚至大部分公司都是搬砖的)
    要会包装自己,包装自己的第一步就是合理的写简历(适当夸大自己、争取机会)
    OSChina 周三乱弹 —— 致力于做一名优秀的女程序员鼓励师
    35岁不是不行,而是某些公司培养方式让你无论多少岁都是一颗螺丝(要避免碰到这样的公司)
    Web层的搭建
  • 原文地址:https://www.cnblogs.com/zxhbk/p/12994433.html
Copyright © 2011-2022 走看看