jax-ws和jax-rs_带有JAX-RS和PrimeFaces的RESTful图表

jax-ws和jax-rs

通常,利用图表提供数据的直观表示很有用。 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

jax-ws和jax-rs

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

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

相关文章

udp 使用connect优点_nodejs源码分析第十九章 -- udp模块

udp不是面向连接的协议&#xff0c;所以使用上会比tcp简单&#xff0c;他和tcp一样&#xff0c;使用四元组来标记通信的双方&#xff08;单播的情况下&#xff09;。我们看看udp作为服务器和客户端的时候的流程。1 在c语言中使用udp1.1 服务器流程&#xff08;伪代码&#xff0…

C语言与Java的对比,你想好选谁了吗?

点击上方蓝字关注我&#xff0c;了解更多咨询很多同学纠结自己应该学C语言还是学Java&#xff0c;本篇文章带你细致了解C语言与Java的各方面的不同之处&#xff0c;让你能够更全面的把握编程语言&#xff01;1.Java与C语言各自的优势C语言是面向过程的语言&#xff0c;执行效率…

C语言:初始C语言

点击上方蓝字关注我&#xff0c;了解更多咨询什么是C语言为什么学习C语言&#xff1f;第一个C语言程序什么是C语言说到语言&#xff0c;可能会想到汉语&#xff0c;英语这些人与人之间交流的语言&#xff0c;语言是人与人之间沟通的桥梁&#xff0c;通过语言&#xff0c;我们得…

apache camel_带有调试器的Apache Camel Eclipse工具

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

服务器皮肤在哪个文件里,服务器怎么使用皮肤

服务器怎么使用皮肤 内容精选换一换在使用云服务器备份制作的整机镜像创建弹性云服务器时&#xff0c;创建速度很慢&#xff0c;或者界面提示用户&#xff1a;该镜像不支持快速创建云服务器功能。CSBS服务早期提供的老备份格式无法支持快速创建云服务器&#xff0c;因此&#x…

c语言中?:的用法

点击上方蓝字关注我&#xff0c;了解更多咨询?:是C语言中的三目运算符&#xff0c;可以用来替代 if—else 语句。?:的使用方法为&#xff1a;<表达式1>?<表达式2>:<表达式3>它是对第一个表达式作真/假检测&#xff0c;然后根据结果返回另外两个表达式中的…

字符斜杠是合法常量吗_【面试秘籍】你对String的intern方法了解吗

我们先来看个例子&#xff1a;public class StringTest { public static void main(String[] args) { String a "A"; String b new String("A"); System.out.println(a b); // false String c b.intern(); Syst…

http协议下需要服务器推送吗,HTTP/2.0 服务器推送实现

前言HTTP/2.0发布于2015年&#xff0c;作为新一代HTTP协议&#xff0c;其由于推进互联网加密技术的使用&#xff0c;所以只能作用于https连接当中。HTTP/2.0提供HTTP语义的有效序列化&#xff0c;是一个二进制协议&#xff0c;所有的框架开始一个8字节的头&#xff0c;紧跟着的…

C语言最常用的编译器

点击上方蓝字关注我&#xff0c;了解更多咨询对于大部分工科类专业的学生来说&#xff0c;如果说是需要学习c语言的话&#xff0c;那选择编译器就是我们第一个遇到的问题了&#xff0c;这一类软件有很多&#xff0c;每一个软件都有他各自的优点&#xff0c;当然了也有他各自的缺…

word一键生成ppt 分页_如何一键把Word转换为PPT?

看到评论区有人问可以一键转换吗&#xff1f;当然可以&#xff0c;比如简单好用的【迅捷PDF转换器】迅捷PDF转换器 - 多功能的PDF转换成Word|JPG|PPT转换器安装打开软件之后&#xff0c;在PDF转换栏目下&#xff0c;点击PDF转换其它&#xff0c;就可以看到文件格式转PPT&#x…

jboss4 迁移_JBoss BPM Travel Agency的微服务迁移故事

jboss4 迁移不久前&#xff0c;我们启动了一个规模较大的JBoss Travel Agency演示项目&#xff0c;以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 &#xff0c;不仅向您展示了如何安装它&#xff0c;项目中各种规则和流程工件的含义&#xff0c;还向您介绍…

windows系统c 实现ftp服务器,windows系统c 实现ftp服务器

windows系统c 实现ftp服务器 内容精选换一换弹性云服务器卸载磁盘。弹性云服务器状态为stopped时支持系统盘(也就是/dev/sda挂载点)和用户盘的卸载&#xff0c;没有操作系统限制&#xff0c;也不需要在弹性云服务器内部安装vmtools。弹性云服务器状态为active态时有如下约束限制…

怎么学好C语言数据结构?

点击上方蓝字关注我&#xff0c;了解更多咨询C语言的数据结构与算法&#xff0c;难就难在链表&#xff0c;学会了链表&#xff0c;可能后面就一点都不难了。书籍推荐《数据结构与算法分析—C语言描述版》&#xff0c;要深入学习的话可以选择这本书&#xff0c;因为针对链表的讲…

c# 去除转义符号_c#语法

一、.net面向对象什么是面向对象&#xff1f;1、面向对象编程英文 Object-Oriented Programming 简称 OOP2、面向过程——是指把问题分解成步骤&#xff0c;一步一步实现。面向对象——是把构成问题的事务分成各个对象&#xff0c;利用对象之间的关系来解决问题&#xff0c;面向…

win7系统如何访问xp系统的服务器,WIN7系统怎么让XP系统访问呢

WIN7系统怎么让XP系统访问呢如果你发现某些程序出现兼容性问题&#xff0c;你有以下4种选择&#xff1a;1) XP兼容模式。右击程序文件或开始菜单中的快捷方式&#xff0c;选择属性&#xff0c;点击兼容性选项&#xff0c;在下拉菜单中选择在XP环境下运行。2) 升级到最新版本&am…

C语言基础知识储备,给你送干货啦!

点击上方蓝字关注我&#xff0c;了解更多咨询C 语言的特点C 语言程序设计就是结构化程序设计&#xff0c;它的主要观点是采用自顶向下、逐步细分和模块化的程序设计方法&#xff0c;使用顺序、选择、循环三种基本控制结构来构造程序。世间万物都有两面性&#xff0c;C 语言既有…

dalsa工业相机8k参数_工业传感器再掀巨浪 | Teledyne 以80亿美元收购FLIR,互补性产品组合又增体量...

收购 / Acquisitions2021年1月4日&#xff0c;Teledyne和FLIR联合宣布&#xff0c;双方已经达成了一项最终协议&#xff0c;Teledyne将以价值约80亿美元的现金和股票交易收购FLIR。根据协议条款&#xff0c;FLIR股东将以每股FLIR股份的价格获得每股28美元的现金和0.0718股Tele…

配置多个git账号_docker随手笔记第七节 jenkins通过git部署java微服务插件安装

docker随手笔记第一节 docker概念及安装docker随手笔记第二节 docker常用命令解析docker随手笔记第三节 docker构建java镜像docker随手笔记第四节 docker安装mysql5.7docker随手笔记第五节 docker安装redis4.0jenkins部署git的java微服务需要如下插件SSH plugin (远程登陆到服务…

适合新手入门—嵌入式C语言

点击上方蓝字关注我&#xff0c;了解更多咨询你现在被数百种电子设备包围着&#xff0c;虽然这些设备表面看起来很简单&#xff0c;但它们的体内都运行着复杂的微处理器(或微控制器)。微处理器的功能由嵌入式系统软件控制、引导和监督。嵌入式软件和嵌入式硬件构成了一个嵌入式…

如何学习C语言数据结构?

点击上方蓝字关注我&#xff0c;了解更多咨询C语言的数据结构与算法&#xff0c;难就难在链表&#xff0c;学会了链表&#xff0c;可能后面就一点都不难了。书籍推荐《数据结构与算法分析—C语言描述版》&#xff0c;要深入学习的话可以选择这本书&#xff0c;因为针对链表的讲…