通过OmniFaces缓存组件以编程方式缓存PrimeFaces图表

在这篇文章中,您将看到如何结合PrimeFaces和OmniFaces获得可缓存的图表。 为了使事情变得简单,我们将使用PrimeFaces 折线图。 对于这种图表,我们可以在页面中使用<p:chart />标记和一个简单的托管bean。 因此,在页面中我们可以有:

<p:chart id="someChartId" type="line"model="#{chartView.lineModel}"style="height:300px;width:600px;"/>

ChartView可以编写如下:

@Named
@ViewScoped
public class ChartView implements Serializable {private LineChartModel lineModel;@PostConstructpublic void init() {createLineModels();}private void createLineModels() {lineModel = initLinearModel();lineModel.setTitle("Linear Chart");lineModel.setLegendPosition("e");lineModel.setZoom(true);Axis yAxis = lineModel.getAxis(AxisType.Y);yAxis.setMin(0);yAxis.setMax(10);}private LineChartModel initLinearModel() {LineChartModel model = new LineChartModel();LineChartSeries series1 = new LineChartSeries();series1.setLabel("Series 1");Random rnd = new Random();series1.set(rnd.nextInt(10), rnd.nextInt(10));series1.set(rnd.nextInt(10), rnd.nextInt(10));series1.set(rnd.nextInt(10), rnd.nextInt(10));series1.set(rnd.nextInt(10), rnd.nextInt(10));series1.set(rnd.nextInt(10), rnd.nextInt(10));LineChartSeries series2 = new LineChartSeries();series2.setLabel("Series 2");series2.set(rnd.nextInt(10), rnd.nextInt(10));series2.set(rnd.nextInt(10), rnd.nextInt(10));series2.set(rnd.nextInt(10), rnd.nextInt(10));series2.set(rnd.nextInt(10), rnd.nextInt(10));model.addSeries(series1);model.addSeries(series2);return model;}public LineChartModel getLineModel() {return lineModel;}
}

此代码将产生一个简单的折线图,如下图:

primfaces线性图样本

现在,让我们假设在应用程序运行期间,该图表会定期更新或重新创建(我们将通过随机序列值和“ Refresh按钮对此进行模拟)。 每次发生这种情况时,我们都会丢失当前图表。 但是,缓存(如保存)某些图表可能很有用,并且有可能稍后在当前会话(对于属于某些用户的图表)/应用程序(对于所有用户通用的图表)中加载它们。

为了完成此任务,我们可以使用OmniFaces 缓存组件。 基本上,此组件在OmniFaces Showcase和Mastering OmniFaces书中都有很好的描述,但主要思想是:

  • Cache组件通过以下方式向JSF页面作者公开
    <o:cache>标记。
  • Cache为“渲染响应”阶段生成的标记实现了服务器端缓存机制。
  • Cache在“渲染响应”阶段执行操作。
  • 缓存的标记存储在OmniFaces生成的密钥下,或者通过可选的<o:cache>密钥属性指示。
  • 可以通过可选的<o:cache>禁用的flag属性禁用每个请求的<o:cache>
  • 可以通过<o:cache> reset flag属性来重新缓存已缓存的条目。
  • 默认情况下,缓存的数据存储在会话范围内(也支持应用程序范围)。

例如,从JSF页面作者的角度来看,我们可以表明我们想在键foo下重新缓存一块标记,如下所示:

<o:cache id="cacheId" key="foo" disabled="false" reset="true">      ... // the markup produced for this snippet of code will be cached
</o:cache>

显然,在此示例中, disabled属性可以跳过,因为那是其隐式值。 如果还跳过了key ,则OmniFaces将生成一个。 如果跳过了reset ,则不会重新缓存标记。

既然我们要必须决定哪些图表缓存和负载的可能性/删除某个图表从缓存中,我们不能简单地做只有这个:

<o:cache id="cacheId">      <p:chart id="someChartId" type="line"model="#{chartView.lineModel}"style="height:300px;width:600px;"/>                   
</o:cache>

基本上,这将缓存第一个图表,并且在每次回发时,将从缓存中为该图表提供服务。

因此,一种快速的方法将包括以编程方式处理<o:cache>属性。 就像我在上面说的, Cache在“渲染响应”阶段采取行动。 这意味着我们可以从我们的控制
ChartView bean在实际发生Cache之前是Cache组件。 此实现的核心将包含以下private方法,该方法允许我们以编程方式配置Cache组件:

private void configureCache(String key, boolean disabled, boolean reset) {Cache cache = Components.findComponent("cacheId");cache.setDisabled(disabled);cache.setReset(reset);cache.setKey(key);
}

现在,我们将添加一对一的控制缓存所需的UI。 首先,我们添加一个标记为“
刷新。 实际上,每次我们按下此按钮时,都会生成一个新图表(新数据)。 这是用于模拟图表更新。

<h:commandButton action="#{chartView.redrawAction()}" value="Refresh"/>

redrawAction()确保新图表不被缓存,因此缓存被禁用并且密钥不相关:

public void redrawAction() {configureCache("none", true, false);createLineModels();
}

此外,我们添加了一个名为Save的按钮。 按下此按钮时,当前图表将缓存在key_ random-number类型的键下(在实际情况下,您可能希望允许用户提供该键作为图表标题)。 该key将在代表已保存图表的列表中向用户公开:

<h:commandButton action="#{chartView.saveChart()}" value="Save"/>

saveChart()方法启用缓存并生成一个新密钥。 密钥存储在列表中:

private List<String> keys;
...
public void saveChart() {String key = "key_" + new Random().nextInt(1000);configureCache(key, false, true);keys.add(key);
}

接下来,我们列出缓存的键和一个标记为Load的按钮。 用户可以选择一个键,然后单击
加载按钮以加载缓存的图表:

<h:selectOneMenu value="#{chartView.selected}"><f:selectItem itemLabel="Select a chart ..." noSelectionOption="true"/><f:selectItems value="#{chartView.keys}" var="t" itemLabel="#{t}" itemValue="#{t}"/>
</h:selectOneMenu><h:commandButton value="Load Chart" action="#{chartView.loadChart()}"disabled="#{chartView.keys.size() eq 0}"/>

loadChart()是:

public void loadChart() {if (selected != null) {configureCache(selected, false, false);}
}

最后,我们添加一个标记为Delete的按钮,该按钮将从缓存中删除所选图表:

<h:commandButton value="Delete Chart" action="#{chartView.deleteChart()}"disabled="#{chartView.keys.size() eq 0}"/> |

并且, deleteChart()是:

public void deleteChart() {if (selected != null) {CacheFactory.getCache(Faces.getContext(), "session").remove(selected);keys.remove(selected);configureCache("none", true, false);           resetLineModels();}
}private void resetLineModels(){       lineModel.getSeries().clear();
}

注意这里,我们如何使用CacheFactory通过密钥从缓存中删除条目。

这是一个提示性屏幕截图:

Primefaces和Omnifaces图表

  • 完整的应用程序可在此处获得 。

翻译自: https://www.javacodegeeks.com/2015/11/programmatically-caching-primefaces-charts-via-omnifaces-cache-component.html

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

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

相关文章

ReactNative——打包发布

1、生成一个签名密钥 ‘ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000 ’ 生成一个my-release-key.keystore的密钥库文件 2、找到路径/android/app/src/main,并在该目录下新建assets文件夹 3、在工程…

oracle版本说明,Oracle版本说明

Oracle 的版本号很多&#xff0c;先看11g的一个版本号说明&#xff1a; 注意&#xff1a; 在Oracle 9.2 版本之后&#xff0c; oracle 的maintenance release number 是在Oracle的版本号很多&#xff0c;先看11g的一个版本号说明&#xff1a;注意&#xff1a;在Oracle 9.2版本之…

linux 用户 组区别吗,Linux系统的用户和用户组有什么区别

1.用户和用户组的概念Linux是一个多用户系统,要使用系统资源就必须在系统内拥有合法的用户账号, Linux系统可以存在多个用户,但是需要使用唯一的用户名来区分不同的用户,同时所有非系统用户都需要设置密码才可以登录到系统。和人类不同, Linux系统只能使用数字来记录用户。在实…

Opserver配置Redis、SqlServer监控

简介 Opserver是Stack Overflow的开源监控解决方案&#xff0c;由Stack Exchange发布&#xff0c;基于.NET框架构建。开源地址&#xff1a;https://github.com/opserver/Opserver 使用 github下载源代码编译后&#xff0c;发布至IIS&#xff0c;需要先修改Opserver/Config目录下…

Linux挂载多个文件夹读不出,FTP不显示Linux挂载文件夹怎么办?-处理FTP不显示Linux挂载文件夹的方案 - 河东软件园...

最近有位用户向小编反映&#xff0c;声称自己在Linux中使用vsftpd启FTP服务&#xff0c;并在FTP用户下挂载一个Windows的共享盘&#xff0c;但是登陆FTP后却无法显示该挂载的共享盘。出现这种问题真是令人十分头疼呢&#xff0c;想要快速解决这个问题又找不到合适的方法。该怎么…

以太坊智能合约Hello World示例程序

简介 以太坊(Ethereum)是一提供个智能合约(smart contract)功能的公共区块链(BlockChain)平台. 本文介绍了一个简单的以太坊智能合约的开发过程. 开发环境 在以太坊上开发应用&#xff0c;首先需要安装其客户端&#xff0c;本文使用基于Go语言的Geth, 其官网为https://github.c…

play 打包 模块_全新的Play模块资料库

play 打包 模块早在11月&#xff0c;我就Play框架的 Nicolas Leroux谈到了如何创建模块存储库。 他同意这将是一个好主意&#xff0c;但是时间不足使我无法开始。 在上周Google Play小组发生了暴风雨之后&#xff0c;我决定将其优先处理。 可以在几周内提供可用的原型。 概述&a…

linux统计字符串频数,Linux 统计某个字符串出现的次数

系列文章&colon;老项目的&num;iPhone6与iPhone6Plus适配&num;&lpar;持续更新中&comma;更新日期2014年10月12日 星期日 &rpar;本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** .…

【读书笔记】《深入浅出nodejs》第五章 内存控制

海量请求长时间运行 -> 内存控制 -> 一切资源高效循环利用 1. V8的垃圾回收机制与内存限制 在Node中通过JavaScript使用内存时&#xff0c;只能使用部分内存&#xff08;64位系统下约1.4GB&#xff0c;32位系统下约为0.7GB&#xff09;。 在V8中&#xff0c;所有的JavaSc…

Java到LDAP教程(包括如何安装LDAP服务器/客户端)

本教程将向您展示如何编写Java代码以与LDAP交互。 但是在执行此操作之前&#xff0c;我们需要在计算机上设置LDAP服务器和客户端。 如果此时您不确定到底是什么LDAP&#xff0c;建议您参考这篇文章&#xff0c;其中提供了一个很好的定义示例。 &#xff08;简而言之&#xff0…

linux 嗅探密码,Linux下嗅探又一实例截取

在SecureCRT下利用rz命令上传我们用到的arpsniffer.c&#xff0c;然后编译&#xff1a;[rootbbs111 root]# gcc -I/usr/local/include -L/usr/local/lib -o arpsniffer arpsniffer.c -lpcap -lnet报错&#xff0c;可能是没装libnet的缘故&#xff0c;看说明Make: first you mus…

清北学堂十一培训酱油记

【day0】 要坐大巴去北京……&#xff08;没错是大巴&#xff01;&#xff09;然而说好的六点走&#xff0c;生生等到了七点……不过一路上还是很happy的&#xff01;某导游兔子 然而到华电之后&#xff0c;身子都散架了……这次的酒店在北农&#xff0c;感觉还可以&#xff0c…

在linux下赋予000权限,【linux】对于文件权限的理解

本篇博文旨在介绍linux下的权限问题&#xff1b;介绍了Linux下&#xff0c;查看权限、修改权限等方法&#xff1b;并通过分别在超级用户(root)和普通用户下进行测试&#xff0c;探索不同等级的用户进入目录需要的权限&#xff0c;以及进入后&#xff0c;显示和创建文件需要的权…

手把手教你制作简易计算器

实现过程&#xff1a; HTMLCssJS 具体通过标签实现计算器整个的框架 通过Css样式实现计算器页面布局及框架优化 通过JavaScript算法实现计算器计算过程 次实验过程&#xff1a; 背景图片背景音乐&#xff08;看个人意愿加&#xff01;&#xff09; 安排&#xff1a; <!--HT…

【dp】导弹拦截

拦截导弹 (missile.pas/c/cpp) 来源&#xff1a;NOIP1999(提高组) 第一题 【问题描述】 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不…

安装tron_具有Tron效果的JavaFX 2 Form

安装tron这是一个具有TRON效果的简单JavaFX登录表单。 在此示例中&#xff0c;我使用CSS设置TextField和Button的样式。 这是CSS和Effect代码的片段&#xff1a; .text-field{-fx-background-color: transparent;-fx-border-color: #00CCFF;-fx-text-fill: white; }.password-f…

linux版本photoshop,在linux上使用ps(转载)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼用Photoshop的&#xff0c;虽说GIMP也是不错&#xff0c;但是用起来总有点不顺的感觉&#xff0c;决定搞一个运行在Linux下的Photoshop&#xff0c;找了好多资料都没有虚拟CS的&#xff0c;不过倒是了解了不少虚拟Photoshop 这方面…

优美三角剖分_递归

问题 D: 优美三角剖分 时间限制: 1 Sec 内存限制: 64 MB提交: 13 解决: 4[提交][状态][讨论版]题目描述 小X同学为了搞好和小C同学的关系&#xff0c;特意寻找了一些优美的图像作为礼物。这是一些由无穷无尽三角形组成的极为优美的图形&#xff0c;小X同学很想实现这些极富美…

在Spring 4.2中更简单地处理异步事务绑定事件

介绍 如您可能已经知道的&#xff08;例如&#xff0c;从我以前的博客文章中 &#xff09;&#xff0c;不再需要创建一个单独的类&#xff0c;该类使用onApplicationEvent方法实现ApplicationListener以便能够对应用程序事件做出响应&#xff08;包括来自Spring Framework本身和…

linux chattr 无权限,从零开始学习Linux(二十八):文件权限之chattr权限

1、chattr命令命令格式&#xff1a; chattr [-] [选项] 文件名或者目录名&#xff1b;参数说明&#xff1a;&#xff1a;增加权限&#xff1b;-&#xff1a;删除权限&#xff1b; 等于某权限&#xff1b;选项说明&#xff1a;i&#xff1a;如果对文件设置i属性&#xff0c;则不…