2

如何将 RESTful 服务的结果传递给 JSF 组件?我阅读了很多帖子,但找不到一个简单的方法。尽可能使用 RESTful API 是我的应用程序的主要要求。性能也是一个关键,因为每天将处理数千个数据元素。如果我在 JSF 中找不到解决方案,我可能不得不切换到另一种技术。

因此,我问的是我是否完全从其他帖子中遗漏了一些东西,因为我是新手。这里有几个简单的场景。

在 JSF 页面上,有一个数据表(基于 Primefaces 复选框的选择)。数据表显示可用的记录(多达数千个)。数据表需要通过 RESTful api 即时加载。下面是我的数据表的代码。

    <p:dataTable id="addSampleTable" var="sample" value="#{testBean.sampleDataModel}"
            selection="#{testBean.selectedSamples}" >

    <p:column selectionMode="multiple" style="width:2%" /> 
    <p:column headerText="Sample">
        <h:outputText value="#{sample.name}" />
    </p:column>
</p:dataTable>

加载数据的最佳方式是什么?如果每次我必须从服务器端调用 API(而不是使用 jquery 和纯 html 的客户端),是否存在性能问题?

第二种情况,在同一页面上,还有一个按钮,允许用户通过另一个 RESTful api 添加新记录。反过来,新添加的记录应该显示在数据表中。

在我调用 RESTful API 插入记录后,该 api 还会返回创建的记录。如何将此新记录插入我的数据模型#{testBean.sampleDataModel},这样我就不必再次加载整个表?我想我可以用纯 html 替换这个数据表,并使用 jQuery 将新记录附加到表中,但是我不能利用 JSF 中的选择表。

我有哪些选择?

4

3 回答 3

4

您的问题似乎太广泛了,但是我尝试给出一些答案。

如何将 RESTful 服务的结果传递给 JSF 组件?

您可以使用 NetBeans 的人实现的模式。如果您使用此 IDE,则可以选择从数据库自动构建 RESTful Web 服务。本质上,这种模式在一个名为AbstractFacade. 然后,对于 JPA 表示中存在的每个具体 Entity 类,它创建一个 Stateless 类扩展AbstractFacade,并向其添加 jax-rs 注释,以使其通过 RESTful Web 服务公开 Entity 类。

然后,您可以通过 EJB 注入直接访问该服务。只需使用@EJB 注释将您的服务注入到任何容器管理的类中(在同一个应用程序中,但也可以在您使用可移植 JNDI 命名规则的其他应用程序中)。特别是,您将对在支持您的 facelets 组件的托管 bean 中注入外观类感兴趣。

加载数据的最佳方式是什么?如果每次我必须从服务器端调用 API(而不是使用 jquery 和纯 html 的客户端),是否存在性能问题?

由于您需要显示数千条记录,因此最好的办法是在数据表中使用 Primefaces 的延迟加载。然后,您的应用程序将仅调用 db 来检索当前页面中显示的几十条记录。绝对避免显示超过这些记录,否则客户端浏览器可能会受到负面影响。

如何将此新记录插入我的数据模型#{testBean.sampleDataModel},这样我就不必再次加载整个表?

请区分从 db加载和从jsf 加载。您可以对支持 bean 进行编程,以便仅在您认为有必要时才调用 db(这通常是最昂贵的操作)。据我所知,JSF 和 PrimeFaces 的 dataTable 实现都不能让您在行级别管理表内容:每次 ajax 更新时,都会重新加载整个表。然而,正如已经说过的,这不会影响您的应用程序的性能,只要您正确地编写了您的支持 bean(即选择正确的 bean 范围避免在 getters 中调用 db 服务)。

有用的链接:

于 2013-08-19T07:52:37.073 回答
1

虽然这个问题有点老了,但它仍然是一个当前的问题。我对上面的回答者不满意,因为上面提到的两种技术都是不匹配的。

这里最重要的问题是:给定的 RESTful API 是否真的充当...

  • 服务/业务层或...
  • ...它只提供 CRUD 操作吗?如果它只提供典型的 CRUD 操作,它作为一个持久层,需要一个服务层。

在第二种情况下,您可以使用您选择的技术来实现您的服务层,JSF 支持的 bean 甚至 EJB 都是不错的选择。在 Java EE 上下文中,JAX-RS 规范是一个不错的选择,Jersey 是该规范的一个实现。您可以使用此客户端 API 从 Java 访问 RESTful API:[1]

但...

当您设计一个完整的新应用程序时,请确保您的 RESTful api 不仅提供 CRUD 操作,还提供更高级别的服务层操作(通过 https POST 方法访问)并处理安全问题。

在这种情况下,异构系统(如 Web 应用程序、移动 Web 应用程序、原生移动应用程序等)可以直接访问服务层,并且特定视图(REST 服务消费者)与服务层松散耦合(这在软件工程中是一件好事一般的)。

我的观点:忘记像 JSF、Struts 等老式的服务器端 Web 框架,提供带有服务层操作的 RESTful API,并使用 AngularJS 等 JavaScript 框架来直接访问 RESTful 操作……移动应用程序是下一步。完整的 Java EE 技术栈有点生疏了 ;-)

[1] https://jersey.java.net/documentation/latest/user-guide.html#client

于 2014-09-26T09:45:54.900 回答
0

加载数据的最佳方式是什么?如果每次我必须从服务器端调用 API(而不是使用 jquery 和纯 html 的客户端),是否存在性能问题?

是的,存在性能问题。最好的方法是将您的集合加载到页面上下文中并在此上下文中对列表进行操作。然后,一旦您完成所有更改,您将与无状态 REST 服务同步。

如何将这条新记录插入我的数据模型 #{testBean.sampleDataModel} 以便我不必再次加载整个表?我想我可以用纯 html 替换这个数据表并使用 jQuery 将新记录附加到表中,但是我无法利用 JSF 的选择表。

不,你不必那样做!有几个 JSF 数据表实现使用 AJAX 部分提交,数据表代码已经包含您上面描述的逻辑。您在页面范围内的集合使用新元素扩展,而无需再次重新呈现整个列表。

于 2013-08-19T04:47:49.057 回答