如何将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中的选择表。
我有什么选择?
答案 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实际上是否充当......
在第二种情况下,您可以使用您选择的技术实现服务层,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数据表实现,数据表代码已经包含了您在上面描述的逻辑。页面范围中的集合使用新元素进行扩展,而无需再次重新呈现整个列表。