1

我们希望提供替代的 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。我们已经调查了几个要么不起作用且不令人满意的选项:

  1. 将所有 JSP 放在一个文件夹中,这样我们就可以使用 bean-id-naming 兼容的视图名称,该名称可以由XmlViewResolver. 这很有效,但对于组织我们的 JSP 来说并不理想。
  2. 有多个InternalResourceViewResolver使用不同前缀的定义。这只是行不通;如果找不到匹配的视图,这种类型的第一个解析器不会返回 null,它只是失败并出现异常并且ViewResolvers不使用后续。
  3. 使用单独的控制器方法(或控制器中的条件代码,根据请求的内容类型或 URL 后缀返回视图名称);这些解决方案似乎Controller违背了对其观点一无所知的目的。
  4. 尝试在locationXmlViewResolver 的属性中使用通配符;这失败了,但有一个例外。

我确信有一个很好的优雅解决方案,但它现在正在躲避我。有没有更好的方法让我可以返回一个视图名称,例如 'a/b/c' ,它有可能被 XmlViewResolver 解析?

感谢您的任何建议。

理查德

4

1 回答 1

1

当然,bean 别名是要走的路……经过一番挖掘:

在 XmlViewResolver 定位的 views.xml 文件中:

<bean id="PdfView" class="com.blah.PdfDocView" /> 
<alias name="PdfView" alias="/a/b/structuredDocument"/>

它将“/a/b/structuredDocument”映射到 PdfDocView bean。

于 2012-11-02T00:38:37.583 回答