我想知道我是否可以在我的调度程序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,但我无法清楚地理解它。是否可以实现?
提前致谢
答案 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可以为您提供帮助