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视图名称重新映射到单个解析器的方法。
#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或其他类。
此链接可以为您提供帮助
评论
我的问题中的链接说我们可以覆盖默认功能。有可能这样做吗
–山多士
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