【问题标题】:spring MVC XmlViewResolver configurationspring MVC XmlViewResolver 配置
【发布时间】:2012-11-02 00:12:57
【问题描述】:

我们希望提供替代的 PDF 视图以及来自控制器的常规 JSP 视图,并添加了 ContentNegotiatingViewResolverXmlViewResolver 来处理这个问题。 我找到的所有示例,包括 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。 我们调查了几个既不可行又不令人满意的选项:

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

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

感谢您的任何建议。

理查德

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-08
      • 2011-01-08
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      相关资源
      最近更新 更多