【问题标题】:Bootstrapping backbone.js models with java server使用 java 服务器引导主干.js 模型
【发布时间】:2012-05-22 04:40:11
【问题描述】:

我正在计划一个带有backbone.js 和一个运行jersey 的java 后端的单页webapp。正如主干.js 文档所建议的那样,我有兴趣在初始加载时将模型数据引导到页面中以防止额外的 ajax 请求:

当您的应用首次加载时,通常会有一组您知道您将需要的初始模型来呈现页面。与其触发额外的 AJAX 请求来获取它们,更好的模式是让它们的数据已经引导到页面中。

backbone-patterns 为 ruby​​ 和 php 提供了我认为我需要做的示例,但我并没有完全将这些点与它在 java 中的工作方式联系起来。我是否需要使用诸如 mustache.java 之类的模板库并在页面提供之前对其进行预处理?有人可以给我一个例子吗?

谢谢,马克

【问题讨论】:

    标签: java backbone.js mustache


    【解决方案1】:

    是的,您需要某种形式的模板才能将动态数据与 HTML 页面的静态布局混合。但是,如果您只需要一个页面,您可能不想投资建立一个完整的模板方案。相反,您可以简单地将您的页面分成两部分并通过将第一部分放在您的 JSON 表示之后再放在第二部分来提供您的主页。这有点难看,但是否值得为这个单一案例添加模板取决于您。如果你选择使用模板,你可以使用 mustache 或者我可能会建议 Velocity Templates.

    通读 Jersey 代码,您似乎必须显式调用 Jackson 才能将自举模型对象从 Java 转换为 JSON。

    【讨论】:

    • 感谢老专业人士的建议。虽然 webapp 一开始只有一个页面,但我希望它会随着时间的推移而扩展,所以我想在一开始就整理好架构。在我不熟悉 Jersey 时,我不知道 ViewProcessor 接口,它允许与模板库集成。我现在有一个 MustacheViewProcessor,它处理从控制器返回的数据实体的 Viewable 和 Map。不过,从控制器显式返回 json 是绝对正确的。 (虽然如果不使用视图处理器这可能是可能的)
    【解决方案2】:

    我对 Jersey 不熟悉,但看了看文档,它似乎主要是一个 Restful Web Service 框架。看来您可以使用 @Produces 注释提供“text/html”的内容类型,但我没有看到使用模板系统呈现视图的明显方法。因此,您可能应该从诸如SpringPlay Framework 之类的Java Web 框架开始,以通过视图模板(如果您愿意,可以使用Mustache)来提供包含引导数据集合的初始HTML。您仍然可以使用 Jersey 来提供后续的 Ajax/Restful 调用,但 Spring 和 Play 也都内置了 Restful 概念。

    【讨论】:

    • 衷心感谢您的帮助 - 我实际上花了几个小时阅读 Play 文档,认为这可以让我的生活更轻松,然后读到 Play 2.0 将(很可能)永远无法运行GAE,并决定反对它。正如对 Old Pro 的评论中提到的,Jersey 具有与模板库的集成点,我只需要找到它们。不知道这里的正确礼仪是什么,但我会接受他的回答,主要是因为详细的答案在我的评论中,希望你没问题!
    【解决方案3】:

    解决方案因模板引擎而异。我不太了解 Moustache.java 来翻译这个 JSP 示例。使用 Jackson 进行 JSON 序列化,这将是 JSP 标记文件:

    public class JsonTag extends SimpleTagSupport {
    
    /** the instance to serialize as JSON JSON */
    private Object value;
    
    @Override
    public void doTag() throws JspException, IOException {
        String json = new ObjectMapper().writeValueAsString(value);
        getJspContext().getOut().print(json);
    }
    
    public void setValue(Object value) {
        this.value = value;
    }
    
    }
    

    还有你的 HTML 页面:

    <script>
    var router = new App.TabRouter({
        model: new App.MyModel(<k:json value="${it}"/>)
    });
    </script>
    

    对于一个严肃的应用程序,您应该重用 ObjectMapper 实例,而不是每次都创建一个新实例。

    【讨论】:

      【解决方案4】:

      要引导您对数据建模,您只需将模型 JSON 呈现到标签中即可。转自backbone-patters链接:

      <script>
        // app data, rendered on server
        var photosJSON = [
          { id: 2, name: "My dog", filename: "IMG_0392.jpg" },
          { id: 3, name: "Our house", filename: "IMG_0393.jpg" },
          { id: 4, name: "My favorite food", filename: "IMG_0394.jpg" },
          { id: 5, name: "His bag", filename: "IMG_0394.jpg" },
        ];
       </script>      
       ...
      
       <script>
        var Photo = Backbone.Model.extend({
        // photo attributes (from above)
        });
      
        var PhotoCollection = Backbone.Collection.extend({
           model:Photo
        });
      
        // build collection model without AJAX call using
        // server rendered JSON above
        var photosCollection = new Photos(photosJSON);
      </script>
      

      您可以在服务器上使用任何适当的技术来呈现带有 JSON 数据的脚本。

      【讨论】:

      • 这个答案完全回避了关于在服务器端使用什么技术来渲染带有 JSON 数据的脚本的问题。
      猜你喜欢
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多