创建多个InternalResourceViewResolver

时间:2014-07-31 09:39:44

标签: java spring jsp spring-mvc

我想知道我是否可以在我的调度程序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 作为已尝试here,但我无法清楚地理解它。是否可以实现?

提前致谢

3 个答案:

答案 0 :(得分:2)

没有。由于javadoc中提到的相同原因,您在上下文中只能拥有其中一个:

  

在链接ViewResolvers时,始终使用InternalResourceViewResolver   需要是最后的,因为它将尝试解析任何视图名称,不   关于底层资源是否确实存在。

InternalResourceViewResolver总是返回一个答案(因为它只是委托给Servlet API,它总是有答案,即使它错了),所以有两个人不会得到你任何地方,因为第二个永远不会被咨询。

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

答案 1 :(得分:1)

但您可以使用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>

答案 2 :(得分:0)

  

创建此类

Exit*
  

然后创建一个

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
    }
}
}

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

@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;
}
}

以及通过在资源文件夹中为html或其他类创建这些类的映射。 这个link可以为您提供帮助