我们希望提供替代的 PDF 视图以及来自控制器的常规 JSP 视图,并添加了 aContentNegotiatingViewResolver
和 anXmlViewResolver
来处理这个问题。我找到的所有示例,包括 Spring 文档,都返回一个简单的视图名称,该名称XmlViewResolver
映射到它的 views.xml 文件中的一个 bean ID(在我们的例子中,一个将 PDF 写入HttpResponse
.
但是,我们将 jsps 组织在 InternalResourceViewResolver 中定义的位置的子文件夹中。
例如,
<bean id="viewResolver" class= "org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="2">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
因此,在我们的控制器中,我们为 /WEB-INF/pages/a/b/c.jsp 中的 JSP 返回视图名称,例如“a/b/c”。
这适用于 JSP,除了不能在 views.xml 中将 bean id 定义为“a/b/c”;它不是有效的 bean ID。我们已经调查了几个要么不起作用且不令人满意的选项:
- 将所有 JSP 放在一个文件夹中,这样我们就可以使用 bean-id-naming 兼容的视图名称,该名称可以由
XmlViewResolver
. 这很有效,但对于组织我们的 JSP 来说并不理想。 - 有多个
InternalResourceViewResolver
使用不同前缀的定义。这只是行不通;如果找不到匹配的视图,这种类型的第一个解析器不会返回 null,它只是失败并出现异常并且ViewResolvers
不使用后续。 - 使用单独的控制器方法(或控制器中的条件代码,根据请求的内容类型或 URL 后缀返回视图名称);这些解决方案似乎
Controller
违背了对其观点一无所知的目的。 - 尝试在
location
XmlViewResolver 的属性中使用通配符;这失败了,但有一个例外。
我确信有一个很好的优雅解决方案,但它现在正在躲避我。有没有更好的方法让我可以返回一个视图名称,例如 'a/b/c' ,它有可能被 XmlViewResolver 解析?
感谢您的任何建议。
理查德