【发布时间】:2012-11-02 00:12:57
【问题描述】:
我们希望提供替代的 PDF 视图以及来自控制器的常规 JSP 视图,并添加了 ContentNegotiatingViewResolver 和 XmlViewResolver 来处理这个问题。
我找到的所有示例,包括 Spring 文档,都返回一个简单的视图名称,XmlViewResolver 映射到其 views.xml 文件中的 bean ID(在我们的例子中,一个将 PDF 写入 HttpResponse 的 bean )。
但是,我们将 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 放在一个文件夹中,这样我们就可以只使用可以由
XmlViewResolver解析的 bean-id-naming-compatible 视图名称。这可行,但不适合组织我们的 JSP。 - 有多个使用不同前缀的
InternalResourceViewResolver定义。这只是行不通;这种类型的第一个解析器如果找不到匹配的视图,则不会返回 null,它只是失败并出现异常,并且不使用后续的ViewResolvers。 - 使用单独的控制器方法(或控制器中的条件代码,根据请求的内容类型或 URL 后缀返回视图名称);这些解决方案似乎违背了让
Controller对其观点一无所知的目的。 - 尝试在 XmlViewResolver 的
location属性中使用通配符;这会失败并出现异常。
我确信有一个很好的优雅解决方案,但它现在正在躲避我。有没有更好的方法让我可以返回一个视图名称,如“a/b/c”,它有可能被 XmlViewResolver 解析?
感谢您的任何建议。
理查德
【问题讨论】:
标签: spring-mvc