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

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>的可选禁用标志属性来禁用每个请求的<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

primefaces

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

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

相关文章

hmailserver mysql密码_第二步:点晴MIS系统Email模块hMailServer数据库连接配置指引

点击&#xff1a;windows系统-》开始-》所有程序-》hmailserver-》hMailServer Database Setup&#xff0c;在弹出的对话框中输入默认管理密码“clicksun2010”&#xff0c;进入后按照以下步骤操作&#xff1a;输入登陆密码&#xff1a;clicksun2010&#xff0c;务必使用这个密…

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

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

java实现ldap服务器_Java到LDAP教程(包括如何安装LDAP服务器/客户端)

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

java 程序增加 防盗_防盗Java EE –保护Java EE企业应用程序的安全

java 程序增加 防盗redev离我们仅有几天的路程&#xff0c;我受邀作了两次演讲。 其中之一是关于我最喜欢的主题&#xff1a;安全性和Java EE。 它旨在实现两个目标。 一方面向典型的Java EE开发人员介绍整个应用程序安全过程和主要目标。 而且还要查看有关Java EE在满足典型需…

js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏

js内存泄露 垃圾回收Java内存架构&#xff08;Java内存模型&#xff09; 上面是堆的Java内存模型以及Java虚拟机&#xff08;JVM&#xff09;中运行的任何Java应用程序的PermGen。 还提供了比率&#xff0c;以使您更好地了解如何在每种生成类型之间分配允许的内存。 以上所有内…

qlineedit文本改变时_PyQt5 QLineEdit(单行编辑器) 学习

QLineEdit is a widget that allows to enter and edit a single line of plain text. There are undo and redo, cut and paste, and drag & drop functions available for the widget.代码&#xff1a;# codingutf-8from PyQt5.QtWidgets import QApplication, QWidget,\…

jboss7.0.2_红帽JBoss企业应用平台7.0 ALPHA发布了!

jboss7.0.2红帽JBoss企业应用程序平台7&#xff08;JBoss EAP 7&#xff09;是基于开放标准构建并符合Java Enterprise Edition 7规范的中间件平台。 它将WildFly Application Server 10与高可用性群集&#xff0c;消息传递&#xff0c;分布式缓存和其他技术集成在一起。 现在可…

sts集成jboss_与JBoss BPM Travel Agency更新了Modern BPM数据集成

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

java 线程组作用_Java线程组(ThreadGroup)使用

JDK 对线程组类注释&#xff1a;A thread group represents a set of threads. In addition, a thread group can also include other thread groups. The thread groups form a tree in which every thread group except the initial thread group has a parent.A thread is a…

java左上角图标太小_Eclipse在高分屏下图标过小的解决方法

自己败了一台Surface Pro 4&#xff0c;打算用来看PDF、练代码。安装了Eclipse并且打开之后&#xff0c;发现图标显示极其细小&#xff0c;肉眼几乎无法看清了。这是由于Eclipse对高分屏没有作适配导致的。Windows 10本身对于高分屏的支持已是相当不错&#xff0c;苏菲4的屏幕分…

activiti 多租户_Activiti中具有独立数据库架构的多租户

activiti 多租户我们过去听到的一项功能请求是以多租户方式运行Activiti引擎&#xff0c;使租户的数据与其他数据隔离。 当然&#xff0c;在某些云/ SaaS环境中&#xff0c;这是必须的。 几个月前&#xff0c;波恩大学的学生拉斐尔吉伦&#xff08;Raphael Gielen&#xff09;…

jigsaw kaggle_使用Project Jigsaw的JDK 9 Early Access上的Eclipse IDE

jigsaw kaggle几周前&#xff0c;我写了关于在Java 9上运行Eclipse Neon的文章 &#xff08;尽管&#xff0c;我在帖子标题中错误地且令人尴尬地留下了“火星”&#xff09;。 值得注意的是&#xff0c;我列出的步骤也适用于带有Project Jigsaw &#xff08;Java模块化&#xf…

win7 activemq_带有骆驼,ActiveMQ,Elasticsearch的关键HL7用例

win7 activemqML7上的HL7是可以说HL7协议格式的系统的一种非常常见的传输机制。 JBoss Fuse是一个非常强大的微服务样式集成平台&#xff0c;在为关键医疗保健提供者构建灵活&#xff0c;有弹性&#xff0c;高可用性的集成方案方面拥有良好的经验。 此外&#xff0c;在JCAPS上替…

java boundary_上传文件multipart form-data boundary 说明

含义 ENCTYPE"multipart/form-data" 说明&#xff1a;通过 http 协议上传文件 rfc1867协议概述&#xff0c;客户端发送内容构造。概述在最初的 http 协议中&#xff0c;没有上传文件方面的功能。 rfc1867为 http 协议添加了这个功能。客户端的浏览器&#xff0c;如 M…

crud-table_我个人的CRUD故事-或我如何来到CUBA平台

crud-table在此博客文章中&#xff0c;我想介绍一下我如何使用CUBA平台以及该工具的好处。 在我年轻的“业务应用程序开发”历史上&#xff0c;我将深入探讨各个阶段&#xff0c;只是给您一些背景知识。 因此&#xff0c;让我们从如何进入典型的CRUD应用程序开始&#xff0c;以…

python api接口生成_Django 自动生成api接口文档教程

最近在写测试平台&#xff0c;需要实现一个节点服务器的api,正好在用django&#xff0c;准备使用djangorestframework插件实现。需求实现一个接口&#xff0c;在调用时&#xff0c;通过传递的参数&#xff0c;直接运行对应项目的自动化测试环境Python3.6 ,PyCharm,W7项目结构功…

eclipse clean_Clean Sheet – Windows 10的人体工程学Eclipse主题

eclipse cleanClean Sheet是适用于Windows 10的符合人体工程学的Eclipse主题。它基于干净&#xff0c;低眩光的外观和感觉&#xff0c;旨在减轻视觉疲劳和眼睛疲劳。 它融合了均衡的颜色选择&#xff0c;可以突出谐波语法并注重可读性。 除自定义滚动条外&#xff0c;它还努力满…

什么时候需要使用cqrs_在CQRS读取模型中使用Hibernate进行快速开发

什么时候需要使用cqrs在本文中&#xff0c;我将分享一些在CQRS读取模型中使用Hibernate工具进行快速开发的技巧。 为什么要Hibernate&#xff1f; Hibernate非常流行。 从外观上看&#xff0c;它也很容易&#xff0c;而从内部看&#xff0c;它却相当复杂。 它可以很容易地上手…

java 隐藏了什么_JAVA程序中封装与隐藏是什么意思

qq_遁去的一_1隐藏就是封装吧。。。。封装是把过程和数据包围起来&#xff0c;对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念&#xff0c;即现实世界可以被描绘成一系列完全自治、封装的对象&#xff0c;这些对象通过一个受保护的接口访问其他对象。封装是一…

esb 和 开源esb_如果今天完成,ESB会是什么样子?

esb 和 开源esbJavaOne 2015即将结束&#xff0c;这又是一次很棒的社区活动。 我和Rafael进行了两次会议和一次HOL 。 我最喜欢的会议之一实际上是&#xff1a;谈论ESB&#xff0c;如果今天完成的话。 我以为那是过去&#xff1f; 我通常也倾向于这样说。 但是&#xff0c;系统…