springmvc如何设置多个同类型的视图器(springmvc 多个 ViewResolver)

  • Post author:
  • Post category:其他


在做页面静态化处理时,有时候我们需要 两种或者两种以上的视图解析方式,比如 jsp,html,json,jstl,ftl等等,显然默认的 springmvc 只配置一种视图解析方式是满足不了我们的,但是放心,springmvc提供了配置多视图解析的方式:

比如:一种视图解析用来 解析 freemarker静态化后的html,另一种视图解析用来解析 jsp(jstl)

网上好多方式都有提到用 order 来设置解析器的优先级,但是低优先级的还是会失效,页面抛回404证明没有对视图进行正确的解析导致最终没有找到正确的视图资源位置,最终查看源码才发现原来springmvc 只给我们提供了 待我们重写的方法,看源码:

import java.util.Locale;
import org.springframework.beans.factory.InitializingBean;

public abstract class AbstractUrlBasedView extends AbstractView implements
        InitializingBean {
    private String url;

    protected AbstractUrlBasedView() {
    }

    protected AbstractUrlBasedView(String url) {
        this.url = url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUrl() {
        return this.url;
    }

    public void afterPropertiesSet() throws Exception {
        if ((isUrlRequired()) && (getUrl() == null))
            throw new IllegalArgumentException("Property 'url' is required");
    }

    protected boolean isUrlRequired() {
        return true;
    }

    public boolean checkResource(Locale locale) throws Exception {
        return true;
    }

    public String toString() {
        StringBuilder sb = new StringBuilder(super.toString());
        sb.append("; URL [").append(getUrl()).append("]");
        return sb.toString();
    }
}


public boolean checkResource(Locale locale) throws Exception { return true; }

我们能很明确的看出他是如何实现的资源检查方法,这样显然是不行的。

所以怎么做就很明确了:

第一步:新建一个html的解析器并继承 InternalResourceView 后重写 checkResource

package com.csdn.mrleehy;

import java.io.File;
import java.util.Locale;

import org.springframework.web.servlet.view.InternalResourceView;

public class HtmlResourceView extends InternalResourceView{

    @Override
     public boolean checkResource(Locale locale) {
      File file = new File(this.getServletContext().getRealPath("/") + getUrl());
      // 判断该页面是否存在
      return file.exists();
     }
}

第二步:在xml配置文件中 指定解析器的 viewClass为该解析类

<bean id="htmlviewResolver"  
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
        <property name="viewClass" value="com.csdn.mrleehy.HtmlResourceView"/>
        <property name="order" value="0" />
        <property name="prefix" value="/html/"/>
        <property name="suffix" value=".html" />  
        <property name="contentType" value="text/html;charset=UTF-8"></property>  
    </bean>

    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="order" value="1" />
        <property name="prefix" value="/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>


注意:

<property name="viewClass" value="com.csdn.mrleehy.HtmlResourceView"/>

这里我们可以很明晰的看出来,我们可以配置多个同类型的视图解析器,除了最后有一个以外都要对资源存在性进行优先检查,以确保视图解析能够找到视图资源地址



版权声明:本文为Mr_LeeHY原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。