2013-08-18 43 views
2

如何将RESTful服务的结果传递给JSF组件?我读了很多帖子,但找不到一个简单的方法。尽可能使用RESTful API是我的应用程序的主要要求。性能也是一个关键,因为成千上万的数据元素将在一天内处理。如果我在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

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

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

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

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

什么是加载数据的最佳方式?如果每次我必须从服务器端调用API(与使用jQuery和纯HTML的客户端相反),是否会有性能问题?

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

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

请从数据库装载和装载在JSF区分。只有当你认为有必要的时候,你才可以编写你的支持bean来调用db(这通常是最昂贵的操作)。据我所知,JSF和PrimeFaces的dataTable实现都不能让你在行级别管理表内容:在每次ajax更新时,整个表都将被重新加载。但是,如前所述,只要您已正确设置了后台bean(即选择了正确的bean范围,避免在获取程序中调用数据库服务),就不会影响应用程序的性能。

相关链接:

0

什么是加载数据的最佳方式?如果每次我必须从服务器端调用API(与使用jQuery和纯HTML的客户端相反),是否会有性能问题?

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

我怎样才能插入此新记录插入到数据模型我#{} testBean.sampleDataModel这样我就不必再加载整个表?我想我可以代替这个数据表与普通的HTML和追加新使用jQuery记录到表中,但是我无法利用JSF中的选择表。

不,你不必这么做!有几个使用AJAX部分提交的JSF数据表实现,数据表代码已经包含了上面描述的逻辑。您的页面范围内的集合会使用新元素进行扩展,而不会再次渲染整个列表。

1

虽然这个问题有点旧了,但它仍然是一个当前的问题。我并不满意上面的图片,因为上面提到的两种技术在一起都是一个错误。

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

  • 服务/商务大层或...
  • ...它只提供CRUD操作吗?如果它仅提供典型的CRUD操作,则它充当持久层,并且需要服务层。

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

但是...

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

在这种情况下,像web应用程序,移动webapps,原生移动应用程序等异构系统可以直接访问服务层,特定视图(REST服务使用者)与服务层松散耦合(这是一件好事通常在软件工程中)。我的观点:忘记老式的服务器端Web框架如JSF,Struts等,提供一个RESTful API与服务层操作和使用JavaScript框架像AngularJS直接访问RESTful操作...移动应用程序下一步。完整的Java EE技术堆栈有点生疏;-)

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