【问题标题】:Spring MVC & Rest: different "layout" with same "content"?Spring MVC 和 Rest:具有相同“内容”的不同“布局”?
【发布时间】:2011-07-12 13:23:25
【问题描述】:

我有一个 Spring 3.0 Web 应用程序,只要它是实用的,它就会尝试遵循 REST 原则。

我有一个控制器方法来返回一个文件夹(这是我的业务实体)。 (获取http://.../folders/{id})。如果用户访问此 URL,他将获得一个完整的 HTML 页面:包含页眉、页脚、菜单和文件夹详细信息。 – 页眉、页脚和菜单的“增强”是使用 Apache Tiles 完成的。

现在我有另一个视图,用户可以看到文件夹树,如果他单击其中一个文件夹,文件夹详细信息将/应该通过 AJAX 加载,并显示在树旁边。在这种情况下,AJAX 响应应该是呈现的 HTML(没有 JSON),因为 真实 内容应该是用户直接访问文件夹页面时的样子。

我的问题是,当我请求相同的 URL 时,服务器不仅会返回 real 内容,还会返回页眉、页脚和菜单。

我的问题是如何以时尚的方式处理这个问题:- 当然,我可以使用一个附加参数和两个控制器方法与不同的 tile 模板,但我认为这不太好,因为它为“布局”使用 html 参数,我必须编写两个控制器方法(以及周围的所有东西)才能拥有两个平铺模板

  • 那么,有什么推荐的方式来以其他方式访问具有另一个 HTML“布局”的相同“内容”?
  • 有什么方法可以在图块模板定义中切换模板,这取决于我需要什么(如何指定取决于其他问题的答案)。

【问题讨论】:

    标签: java spring rest tiles


    【解决方案1】:

    在 ReST 中,您所描述的问题将通过基于 Accept 标头的内容协商来解决:请求者将指示预期的类型,例如 test/html、application/json 等。您可以使用通过让您的 Ajax 调用请求不同的类型来实现这一点。由于您使用的是 Spring 3 MVC,因此您应该能够配置您的 ViewResolvers 以根据请求的类型返回修饰或未修饰的视图。这看起来像 reasonable example

    【讨论】:

    • 我知道内容协商。但是我的两个“布局”的正确内容是什么,因为它在 both 情况下都是 HTML。 text/html 和 application/html?
    • 这听起来像是滥用 Content-Accept 标头来为同一个 URL 提供两种不同类型的文档。我会考虑不要为了“时尚”代码的名称而跳过这么多圈。
    • 相反,我认为完美地使用标题(它是 Accept,而不是 Content-Accept),并且将 text/html 用于人类可读的内容是非常标准的。对于机器可读的版本,如果可以的话,我建议使用 application/xhtml+xml,而不是 application/html。后者不在IANA catalog 中。
    【解决方案2】:

    为了让您的基于服务器的应用程序发送不同的内容,您需要为页面的“完整版”和“真实内容”请求不同的 URL。这是无法避免的。

    如果您担心重复代码,那么我会设计主布局,使其使用与单击其中一个文件夹时相同的机制加载页面的内部细节,而不是在控制器渲染视图。

    【讨论】:

      【解决方案3】:

      通过 REST,您有以下选项

      • 为资源定义一个新的IRI,例如:/resource?layout=x
      • 添加自定义 MIME 类型(或 MIME 参数),例如 text/html;layout=x,并从接受标头中询问
      • 发送首选标头,例如Prefer: return=minimal

      另一种可能的解决方案,具有可重复使用的模板并仅发送 JSON 数据。

      (REST 有很多限制,所以您的 Web 服务可能不是真正的 REST 服务。)

      【讨论】:

        猜你喜欢
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 2013-02-04
        • 2010-11-06
        • 1970-01-01
        相关资源
        最近更新 更多