Santhosh
Santhosh

Reputation: 8197

Creating Multiple InternalResourceViewResolver

I was wondering if i could create a multiple InternalResourceViewResolver in my dispatcher servlet.

Something like this ,

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

and another view resolver like this ,

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

I am not referring about creating multiple view resolvers. For ex, Tiles,XML view resolvers

I need to configure two different InternalResourceViewResolver as tried here but i can't clearly understand it , .Is it possible to achieve ?

Thanks in advance

Upvotes: 4

Views: 9888

Answers (3)

Reza
Reza

Reputation: 543

Create this class

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

then create this one

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

based on this way you have a mapping for your jsp from servlet-context.xml using this code:

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

and a mapping by creating those classes for html or others in resources folder. this link can help you

Upvotes: 1

sud_shan
sud_shan

Reputation: 303

but you can use 2 different view resolvers . Andkeep the order of InternalViewResolver last.

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

Upvotes: 2

skaffman
skaffman

Reputation: 403551

No. You can only ever have one of them in your context, because of the same reason mentioned in the javadoc:

When chaining ViewResolvers, an InternalResourceViewResolver always needs to be last, as it will attempt to resolve any view name, no matter whether the underlying resource actually exists.

InternalResourceViewResolver always returns an answer (because it just delegates to the Servlet API, which always has an answer, even if it's wrong), so having two of them won't get you anywhere, since the 2nd one will never be consulted.

You'll need to find another way to remap your JSP view names on to a single resolver.

Upvotes: 4

Related Questions