如何将RESTful api的结果与JSF集成?

时间:2013-08-18 06:24:14

标签: java jsf rest jsf-2

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

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

在JSF页面上,有一个数据表(基于Primefaces Checkbox的选择)。数据表显示可用的记录(最多数千个)。需要通过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和plain html的客户端),是否存在性能问题?

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

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

我有什么选择?

3 个答案:

答案 0 :(得分:4)

你的问题似乎过于宽泛,但我试着给出一些答案。

  

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

您可以使用NetBeans员工实施的模式。如果使用此IDE,则可以选择从数据库自动构建RESTful Web服务。本质上,此模式在名为AbstractFacade的抽象泛型类中创建所有DAO基本功能。然后,对于JPA表示中存在的每个具体Entity类,它创建一个扩展AbstractFacade的Stateless类,并向其添加jax-rs注释,以便让它通过RESTful Web服务公开Entity类。

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

  

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

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

  

如何将此新记录插入我的datamodel#{testBean.sampleDataModel},以便我不必再次加载整个表?

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

有用的链接:

答案 1 :(得分:1)

虽然这个问题有点陈旧,但它仍然是当前的问题。我不满意上面提到的那些,因为上面提到的两种技术都是一个错配。

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

  • service / buisness layer或...
  • ...它是否只提供CRUD操作?如果它只提供典型的CRUD操作,它就像一个持久层,需要一个服务层。

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

<强>可是...

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

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

我的观点:忘记旧式的服务器端Web框架,如JSF,Struts等,提供RESTful API和服务层操作,并使用像AngularJS这样的JavaScript框架,以便直接访问RESTful操作...移动应用程序是下一步。完整的Java EE技术堆栈有点生疏; - )

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

答案 2 :(得分:0)

  

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

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

  

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

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