Reputation: 8197
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
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
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
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