带有JAX-RS和PrimeFaces的RESTful图表

通常,利用图表提供数据的可视表示很有用。 PrimeFaces提供制图解决方案,可轻松将数据的可视表示形式添加到Web和移动应用程序中。 如果将PrimeFaces图表组件与RESTful Web服务数据结合使用,我们可以创建自定义图表,以适合桌面和移动设备。

在本文中,我将更新Java EE 7动手练习MoviePlex应用程序,以提供一个仪表板,我们可以在其中集成PrimeFaces图表组件。 在本示例中,我们将创建一个图表,但是您可以利用本文帮助您以类似的方式构建更多图表。 具体来说,我们将利用RESTful Web服务收集电影院的容量信息,并使用PrimeFaces条形图显示每个剧院的容量。

首先,请下载Java EE 7动手练习应用程序解决方案归档文件 (如果尚未下载)。 从那里,在NetBeans IDE中打开它。 要创建这篇文章,我正在使用NetBeans 8.0.2。 将项目导入到NetBeans中之后,通过右键单击项目并选择“运行”,将其部署到应用程序服务器(在我的情况下为GlasFish 4.1)。 部署完成后,通过打开以下URL在浏览器中打开Theater Web服务:http:// localhost:8080 / ExploringJavaEE7 / webresources / theater /。 该Web服务应产生一个与图1类似的清单。

图1:Theater Web Service XML

图1:Theater Web Service XML

我们将利用此Web服务中的数据来提供仪表板小部件。 首先创建后端代码,然后处理UI。 首先,通过右键单击Source Packages,然后选择“ New…”->“ Java Packages”,创建一个名为org.glassfish.movieplex7.jsf的新软件包。 接下来,通过右键单击该包并选择“ New…”->“ JSF Managed Bean”,创建一个JSF Managed Bean控制器,并将其命名为DashboardController 。 让我们将控制器注释为@SessionScoped ,然后实现java.io.Serializable 。 在此控制器中,我们将获取数据,并为仪表板构建模型。 我们将首先使用JAX-RS客户端查询Web服务,然后将利用数据填充Theater对象的列表。 因此,我们需要定义以下四个字段才能开始:

Client jaxRsClient;
// Typically not hard coded...store in a properties file or database
String baseUri = "http://localhost:8080/ExploringJavaEE7/webresources/theater/";private List<Theater> theaterList;
private BarChartModel theaterCapacityModel;

Client类型为javax.ws.rs.client.Client ,我们将通过调用javax.ws.rs.client.ClientBuilder来初始化类构造函数中的字段,如下所示:

public DashboardController() {jaxRsClient = ClientBuilder.newClient();
}

接下来,我们需要创建一种方法来加载数据,创建和配置模型。 在我们的控制器中, init()方法基本上包含将任务委派给其他方法的实现。 init()方法的实现调用两个方法: loadData()createTheaterCapacityModel()

public void init() {loadData();createTheaterCapacityModel();
}

编写代码是为了方便日后向我们的仪表板添加更多小部件。 loadData()方法提供了将数据从Web服务加载到本地列表的实现。

private void loadData() {theaterList = jaxRsClient.target(baseUri).request("application/xml").get(new GenericType>() {});}

如果我们有更多的小部件,那么我们也将那些数据模型的数据加载代码也添加到此方法中。 接下来,我们需要初始化已定义的org.primefaces.model.chart.BarChartModel ,并使用来自Web服务的数据加载它。 initTheaterCapacityModel()方法包含用于创建BarChartModel的实现,并用一个或多个ChartSeries对象填充它以构建数据。

public BarChartModel initTheaterCapacityModel() {BarChartModel model = new BarChartModel();ChartSeries theaterCapacity = new ChartSeries();theaterCapacity.setLabel("Capacities");for (Theater theater : theaterList) {theaterCapacity.set(theater.getId(), theater.getCapacity());}model.addSeries(theaterCapacity);return model;
}

如您所见,该模型由单个org.primefaces.model.chart.ChartSeries对象组成。 实际上,模型可以包含多个ChartSeries对象,并且将使用不同的彩色条在图表中显示该数据。 在这种情况下,我们只需将剧院ID和每个Theater对象的容量添加到ChartSeries对象,然后将其添加到BarChartModel 。 在我们的init()方法中调用createTheaterCapacityModel()方法,并在其中调用initTheaterCapacityModel()方法来创建org.primefaces.model.chart.BarChartModel ,然后进行相应的配置。

private void createTheaterCapacityModel() {theaterCapacityModel = initTheaterCapacityModel();theaterCapacityModel.setTitle("Theater Capacity");theaterCapacityModel.setLegendPosition("ne");theaterCapacityModel.setBarPadding(3);theaterCapacityModel.setShadow(false);Axis xAxis = theaterCapacityModel.getAxis(AxisType.X);xAxis.setLabel("Theater");Axis yAxis = theaterCapacityModel.getAxis(AxisType.Y);yAxis.setLabel("Capacity");yAxis.setMin(0);yAxis.setMax(200);}

如您所见,在方法内部,我们通过调用initTheaterCapacityModel()初始化模型,然后通过一系列“设置”方法对其进行配置。 具体来说,我们设置标题,位置并提供一些视觉配置。 接下来,通过调用模型的getAxis()方法并传递X和Y轴常量来设置轴。 然后,通过为Y轴设置标签和最小/最大值来配置每个轴。 请参阅本文末尾的课程的完整资源。

这样做是针对服务器端代码的,现在让我们看一下用于显示图表组件的UI代码。 首先,通过右键单击并选择"New..."-> "XHTML..." ,在项目的Web Pages文件夹的根目录处生成一个新的XHTML文件,并将文件命名为dashboard.xhtmldashboard.xhtml的源应包含以下内容:

<html xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:p="http://primefaces.org/ui" xmlns="http://www.w3.org/1999/xhtml"><h:head><title>Theater Dashboard</title></h:head><h:body><f:event listener="#{dashboardController.initView}" type="preRenderView"/><h:form id="theaterDash" prependid="false"><p:growl id="growl" showdetail="true"/><p:layout fullpage="true"><p:layoutUnit position="center"><p:panel header="Capacity for Theaters" id="theater_capacity" style="border: 0px;"><p:chart model="#{dashboardController.theaterCapacityModel}" style="border: 0px; height: 200px; width: 500px;" type="bar"></p:chart></p:panel></p:layoutUnit></p:layout><p:poll interval="60" listener="#{dashboardController.pollData}"/></h:form></h:body>
</html>

相当简单,JSF视图包含PrimeFaces布局,包括面板和图表。 在视图顶部附近,使用了一个f:event标记来调用侦听器方法,该方法在DashboardController类中实现,该类identified by initView() 。 出于本示例的目的, p:chart标签是发生魔术的地方。 尽管可以使用其他选项(在http://www.primefaces.org/showcase),但在这种情况下,图表类型设置为“条形”。 该模型设置为#{dashboardController.theaterCapacityModel} ,我们在控制器类中定义,填充和配置了该模型。 然后,我们提供宽度和高度,以使图表很好地显示。 万一数据发生变化(我知道剧院的大小通常不会增加或减少,但是请与我一起去),我们添加了PrimeFaces民意测验组件,调用pollData( )方法,该组件会定期刷新数据。 在这种情况下,数据将每60秒刷新一次。 完成后,图表应如图2所示。

图2:PrimeFaces条形图

图2:PrimeFaces条形图

图表是交互式的,如果单击标签,则条形图将被隐藏。 如果您有多个类别(通过ChartSeries ),这将很方便。 您甚至可以在图表组件中包含p:ajax标记,并在单击图表时调用一个动作…也许会弹出一个对话框,以显示有关单击的项目的一些其他数据。 做到了……现在您可以利用PrimeFaces和RESTful Web服务创建更多图表。 我建议在MoviePlex应用程序的基础上,看看还有其他可能性。 DashboardController类的完整源代码:

package org.glassfish.movieplex7.jsf;import java.util.List;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.GenericType;
import org.glassfish.movieplex7.entities.Theater;import org.primefaces.model.chart.Axis;
import org.primefaces.model.chart.AxisType;
import org.primefaces.model.chart.BarChartModel;
import org.primefaces.model.chart.ChartSeries;/**** @author Juneau*/
@Named(value = "dashboardController")
@SessionScoped
public class DashboardController implements java.io.Serializable {Client jaxRsClient;// Typically not hard coded...store in a properties file or databaseString baseUri = "http://localhost:8080/ExploringJavaEE7/webresources/theater/";private List theaterList;private BarChartModel theaterCapacityModel;/*** Creates a new instance of FamisEquipPmChartController*/public DashboardController() {jaxRsClient = ClientBuilder.newClient();}public void init() {loadData();createTheaterCapacityModel();}/*** Initializes the view on page render...if we wish to grab a reference* to a panel, etc.*/public void initView(){UIViewRoot viewRoot =  FacesContext.getCurrentInstance().getViewRoot();// Do something}public void pollData() {System.out.println("polling data...");loadData();}/*** JAX-RS client to poll the data*/private void loadData() {theaterList = jaxRsClient.target(baseUri).request("application/xml").get(new GenericType>() {});}/*** Initialize the Bar Chart Model for Displaying PM Estimated Hours by Month** @return*/public BarChartModel initTheaterCapacityModel() {BarChartModel model = new BarChartModel();ChartSeries theaterCapacity = new ChartSeries();theaterCapacity.setLabel("Capacities");for (Theater theater : theaterList) {theaterCapacity.set(theater.getId(), theater.getCapacity());}model.addSeries(theaterCapacity);return model;}private void createTheaterCapacityModel() {theaterCapacityModel = initTheaterCapacityModel();theaterCapacityModel.setTitle("Theater Capacity");theaterCapacityModel.setLegendPosition("ne");theaterCapacityModel.setBarPadding(3);theaterCapacityModel.setShadow(false);Axis xAxis = theaterCapacityModel.getAxis(AxisType.X);xAxis.setLabel("Theater");Axis yAxis = theaterCapacityModel.getAxis(AxisType.Y);yAxis.setLabel("Capacity");yAxis.setMin(0);yAxis.setMax(200);}/*** @return the theaterCapacityModel*/public BarChartModel getTheaterCapacityModel() {return theaterCapacityModel;}/*** @param theaterCapacityModel the theaterCapacityModel to set*/public void setTheaterCapacityModel(BarChartModel theaterCapacityModel) {this.theaterCapacityModel = theaterCapacityModel;}}

翻译自: https://www.javacodegeeks.com/2015/02/restful-charts-with-jax-rs-and-primefaces.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UVAlive 6131 dp+斜率优化

这道题和06年论文《从一类单调性问题看算法的优化》第一道例题很相似。 题意&#xff1a;给出n个矿的重量和位置&#xff0c;这些矿石只能从上往下运送&#xff0c;现在要在这些地方建造m个heap&#xff0c;要使得&#xff0c;sigma距离*重量最小。 思路&#xff1a;O(n ^ 3)的…

c语言程序整数四则运算,c语言中三个整数随机的四则运算

满意答案hors10722014.01.06采纳率&#xff1a;58% 等级&#xff1a;12已帮助&#xff1a;18274人#include #include #include #define N 10 //随机出10道题目int main(){int num1, num2, num3, count0, result,resultTrue,flag;//result:用户输入结果 resultTrue:正确结果 …

带有调试器的Apache Camel Eclipse工具

大约2个月前&#xff0c; Lars Heineman在 JBoss工具堆栈中的博客中介绍了改进的Apache Camel Eclipse工具。 在即将发布的版本中&#xff0c;他们将Camel调试器与本机Eclipse调试器集成在一起&#xff0c;因此当您使用断点时&#xff0c;您将获得Eclipse调试体验&#xff0c;…

HarmonyOS的功能及场景应用

一、基本介绍 鸿蒙HarmonyOS主要应用的设备包括智慧屏、平板、手表、智能音箱、IoT设备等。具体来说&#xff0c;鸿蒙系统是一款面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备…

SX-BOX试用笔记

1.今天开始试用SX-BOX&#xff0c;我将用它来做自己平时的开发和文档的工作&#xff0c;因为我的职责是一个程序员。 1.屏幕如果支持更大的也清晰的话&#xff0c;我会感觉很舒服。 2.USB设备插入还无法识别。。。 3.现在开始安装开发工具&#xff0c;目前我打算在上面安装Adob…

c语言成绩转换绩点,如何将平时成绩转化为GPA成绩?

新东方留学生资料下载姓名手机号短信验证码图片验证码年级请选择5年级6年级7年级8年级9年级高一高二高三高三复习大一大二大三大四大五研一研二研三博一博二在职课程请选择雅思托福GREGMATSAT其他行政区请选择请选择请选择{"name":{"label":"姓名&quo…

Hibernate查询缓存如何工作

介绍 既然我已经介绍了实体和集合缓存&#xff0c;现在该研究查询缓存的工作原理了。 查询缓存与实体严格相关&#xff0c;它在搜索条件和满足该特定查询过滤器的实体之间绘制关联。 像其他Hibernate功能一样&#xff0c;查询缓存也不像人们想象的那么琐碎。 实体模型 对于我…

Javascript学习笔记1 数论

1.Javascript不用担心内存的回收与对象的销毁&#xff01; 2.Javascript有&#xff1a;infinity、NaN全局变量表示 被0整除的无穷 和 非数字。undefined和null表示 未定义 和 空&#xff0c;undefined和null可以互换&#xff0c;判别二者需用 全等 号&#xff08;不光判断值&…

JavaFX技巧20:有很多需要展示的地方吗? 使用画布!

JavaFX应用程序似乎有两种&#xff1a;第一种使用带有节点和CSS样式的场景图&#xff0c;第二种使用单个画布。 但是&#xff0c;将这两种方法混合使用是完全合法的。 尤其是当您的应用程序必须显示大量详细信息时&#xff0c;您很容易最终创建成千上万个节点。 即使JavaFX的整…

VirtualBox命令更改虚拟硬盘空间

主要是使用VBoxManage命令来操作第一步&#xff1a;打开CMD&#xff0c;进入到virtualbox存放虚拟机的目录中(win7 系统可以直接在文件夹空白处按住shift键右键鼠标选择[在此处打开命令窗口])&#xff0c;输入[vboxmanage list hdds]可以查看所有的虚拟机的信息&#xff0c;这里…

华为手机老是android自动升级,华为手机系统怎么升级 华为手机升级系统的两种方法...

华为手机使用的均为安卓系统&#xff0c;升级方法有多种&#xff0c;各位可以根据条件不同自行选择升级。华为手机升级系统的两种方法方法一&#xff1a;手机联网更新首先把手机联网。点击设置。向下拖动点击最后一项“关于手机”点击“系统软件更新”。点击在线升级即可。友情…

linux网络体系架构

原创kylin_zeng:http://blog.csdn.net/kylin_fire_zeng 本文参考国嵌视频教程&#xff0c;再此感谢国嵌教育。 一、协议栈层次对比&#xff1a; 1&#xff09;网络接口层把数据链路层和物理层合并在了一起&#xff0c;提供访问物理设备的驱动程序&#xff0c;对应的网络协议主…

android 自定义弹窗diss,Android中自定义PopupWindow,动态弹窗。

我的第一篇博客&#xff0c;咱们直奔主题。先上个效果图在android中自定义PopupWindow&#xff1a;1、首先定义好你想要显示的窗口的布局文件&#xff0c;再实例化一个View对象&#xff1a;窗口布局可灵活变化&#xff0c;dialog_layout.xml代码如下&#xff1a;android:id&quo…

拼图项目的动机和目标

几周前&#xff0c;我写了一篇关于Jigsaw项目如何破坏现有代码的文章 。 那么&#xff0c;我们能得到什么回报呢&#xff1f; 让我们看一下项目解决的痛点及其在Java 9中解决问题的目标。 系列 这篇文章是正在进行的有关拼图项目系列的一部分。 按照推荐的顺序&#xff08;不同…

android中按一个按钮弹出字,允许用户在Android中长按一次即可编辑按钮文字

我想允许App用户在Android中更改Button文本。 当用户单击按钮时&#xff0c;它应该执行某些操作&#xff0c;但是当他/她长按按钮时&#xff0c;将弹出一个编辑文本&#xff0c;并且无论用户键入什么内容都应另存为按钮文本。到目前为止&#xff0c;我已经完成了以下操作。btn1…

关于单元测试脚手架的几点思考

莱昂&#xff1a;Luc Besson的专业人士 当我开始通过创建相同的对象并准备数据来运行测试来重复使用单元测试方法时&#xff0c;我对设计感到失望。 带有大量代码重复的长时间测试方法看起来并不正确。 为了简化和缩短它们&#xff0c;基本上有两个选项&#xff0c;至少在Java…

android 使用c 代码实现,JNI开发实现helloworld,调用自己的C代码实现(1)

JNI开发&#xff0c;实现自己的C代码&#xff0c;helloworld在这里实现一个简单的demo,完成加载自己的C代码使用Android studio&#xff0c;一步一步教你实现在屏幕上显示出helloworld如下图显示&#xff0c;配置号NDK的路径&#xff0c;没有路径的需要自己下载&#xff0c;在A…

使用WSO2 ESB进行邮件内容过滤

每个集成架构师或开发人员都应该熟悉Gregor Hohpe和Bobby Woolf所描述的企业集成模式&#xff08;EIP&#xff09; 。 模式之一是“内容消息过滤器” &#xff08;不要与消息过滤器模式混淆&#xff09;。 使用不同的Mediator在WSO2中有多种方法可以实现此目的。 一种方法是使…

android壁纸应用,HPSTR - 可能是你见过最会玩的壁纸应用 - Android 应用 - 【最美应用】...

今天这款 HPSTR 壁纸应用也不例外&#xff0c;HPSTR 主要的壁纸素材源来自 Unsplash(ios/android)、500px(android)、Reddit(android)这些素材源的图片都很优秀&#xff0c;特别是 Unsplash 它是著名的无版权图片网站。它家主要以风景为主&#xff0c;数量也足够多&#xff0c;…

android sqlite批量操作,Android: SQLite批量插入数据的最佳实践

大家都知道&#xff0c;Android里数据库用的是SQLite。在实际开发过程中&#xff0c;我们有时候会遇到批量插入数据的场景。这篇文章给大家分享一个小技巧&#xff0c;让批量插入数据达到最快的目的。首先&#xff0c;我先创建一个Table&#xff0c;里面只有一个字段&#xff1…