如何在Spring中使用多个ViewResolvers?

TM.*_*TM. 17 spring spring-mvc spring-webflow

我正在开发一个网络应用程序,我的大部分页面都使用了apache tiles(2.1.2),但其中一些只需要简单的jsps.

我遇到的问题是a InternalResourceViewResolver和a UrlBasedViewResolver都会尝试解决视图,无论如何,所以无论我使用哪种顺序,它都会在普通的JSP页面或tile页面上失败.

这是配置:

<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>
    <property name="order" value="0"/>
</bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>
    <property name="order" value="1"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

为了更清楚我想要做什么,我需要能够拥有这样的视图状态:

<view-state id="someState" view="/someDir/foo"><!--render foo.jsp -->
    <transition on="foo" to="bar"/>
</view-state>

<view-state id="someState" view="something.core"><!--render tile defintion named 'something.core' -->
    <transition on="foo" to="bar"/>
</view-state>
Run Code Online (Sandbox Code Playgroud)

有谁知道如何配置东西,以便我可以让它来渲染瓷砖定义和普通的jsps?

ska*_*man 20

如你所说,你不能把它们连在一起.这两个州的javadoc显然都必须在解析器链的最后.

我建议如果你真的需要使用这些来收集,那么你编写一个简单的ViewResolver自定义实现,它接受视图名称,并决定你的两个"真正的"视图解析器中的哪一个委托给.这假设您可以根据视图名称判断要调用哪个解析程序.


所以你要定义一个这样的自定义ViewResolver:

public class MyViewResolver implements ViewResolver {

    private ViewResolver tilesResolver;
    private ViewResolver jspResolver;

    public void setJspResolver(ViewResolver jspResolver) {
        this.jspResolver = jspResolver;
    }

    public void setTilesResolver(ViewResolver tilesResolver) {
        this.tilesResolver = tilesResolver;
    }

    public View resolveViewName(String viewName, Locale locale) throws Exception {
        if (isTilesView(viewName)) {
            return tilesResolver.resolveViewName(viewName, locale);
        } else {
            return jspResolver.resolveViewName(viewName, locale);
        }
    }

    private boolean isTilesView(String viewName) {
    .....
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要实现isTilesView方法来决定委派给哪个解析器.

在XML配置中,定义这个新的视图解析器,并确保它出现其他视图解析器之前.

<bean class="MyViewResolver">
    <property name="tilesResolver" ref="tilesViewResolver"/>
    <property name="jspResolver" ref="viewResolver"/>
</bean>
Run Code Online (Sandbox Code Playgroud)