我想知道是否可以在调度程序servlet中创建多个InternalResourceViewResolver

类似这样的东西,

<bean id="jspViewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" /> 


和另一个这样的视图解析器,

<bean id="jspViewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/folder/jsp/"
          p:suffix=".jsp" /> 


我不是要创建多个视图解析器。例如,Tiles,XML视图解析器

我需要按此处尝试配置两个不同的InternalResourceViewResolver,但是我不清楚,它是否可以实现?

预先感谢

#1 楼

不会。由于javadoc中提到的相同原因,您只能在上下文中使用它们之一:


链接ViewResolvers时,始终需要一个InternalResourceViewResolver
最后,因为它将尝试解析任何视图名称,所以与基础资源是否实际存在无关。


InternalResourceViewResolver始终返回答案(因为它只是委托给Servlet) API,即使它是错误的,它也总是有一个答案),因此拥有两个将无法解决您的问题,因为永远不会咨询第二个。

您需要找到另一个将JSP视图名称重新映射到单个解析器的方法。

评论


我的问题中的链接说我们可以覆盖默认功能。有可能这样做吗

–山多士
2014年7月31日14:39

这不是完全正确的,如果实现HandlerMapping模式,则可以有多个(每个配置都不同)。或者,您可以继承InternalResourceViewResolver的子类并重写#canHandle(String,Locale)或使用#setViewNames(String)限制该实例将解析的内容(例如* .html)。确保您在XML中使用唯一ID,并且还使用#setOrder(int)指定优先级顺序。

–达里尔·迈尔斯(Darryl Miles)
15年8月7日在18:36

@DarrylMiles的答案是最正确的答案!谢谢!

–突尼斯的Theodor
17年5月10日在12:58

#2 楼

但您可以使用2个不同的视图解析器。最后保留InternalViewResolver的顺序。

    <bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
    <property name="prefix" value="/WEB-INF/pages1/" />
    <property name="suffix" value=".jsp" /> 
    <property name="order" value="0" />
</bean>

    <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/pages2</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
    <property name="order" value="1" />
    </bean>


#3 楼


创建此类


public class ChainableUrlBasedViewResolver extends UrlBasedViewResolver {

public ChainableUrlBasedViewResolver() {

    setViewClass(InternalResourceView.class);
}

@Override
protected AbstractUrlBasedView buildView(String viewName) throws Exception {

    String url = getPrefix() + viewName + getSuffix();
    InputStream stream = getServletContext().getResourceAsStream(url);
    if (stream == null){
        return new NonExistentView();
    }
    return super.buildView(viewName);
}

private static class NonExistentView extends AbstractUrlBasedView {

    @Override
    protected boolean isUrlRequired() {

        return false;
    }

    @Override
    public boolean checkResource(Locale locale) throws Exception {

        return false;
    }

    @Override
    protected void renderMergedOutputModel(Map<String , Object> model, 
    HttpServletRequest request, HttpServletResponse response) throws Exception {
        // Purposely empty, it should never get called
    }
}
}



,然后创建此类


@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "ch.frankel.blog.spring.viewresolver.controller")
public class WebConfig {

@Bean
public ViewResolver pageViewResolver() {

    UrlBasedViewResolver resolver = new ChainableUrlBasedViewResolver();
    resolver.setPrefix("/resources/myApp/");
    resolver.setSuffix(".html");
    resolver.setOrder(1);
    return resolver;
}
}

基于这种方式,您可以使用以下代码从servlet-context.xml中为jsp映射:

<beans:bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>


,并通过创建资源文件夹中的html或其他类。
此链接可以为您提供帮助