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,一经查实,立即删除!

相关文章

mysql开发问题解决_开发过程中mysql常见问题的解决方法

本篇文章给大家带来的内容是关于开发过程中mysql常见问题的解决方法&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。记录开发过程中遇到mysql相关的问题以及解决方法&#xff0c;长期更新。远程连接问题mysql默认连接只能给本…

javaone_JavaOne 2015继续进行,Java将永远存在(……也许是长篇大论)

javaone好的。 也许我的标题太夸张了。 我确实相信Java&#xff0c;生态系统&#xff0c;社区&#xff0c;虚拟机和母编程语言将会存在很长一段时间。 有什么可以偏离的&#xff1f; 假定在我的酒店房间中花费很多时间&#xff0c;在我的演讲中增加技巧之间&#xff0c;我认为…

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 插入mysql 日期_Java日期-插入数据库

我需要找出一种将带有java.util.Date字段的记录插入数据库的方法&#xff0c;但我陷入了困境。有谁知道我该怎么做&#xff1f;现在我有类似的东西。java.util.Date myDate new java.util.Date("01/01/2009");sb.append("INSERT INTO USERS");sb.append(&…

jboss fuse 教程_JBoss Fuse –使用MVEL将您的静态配置转换为动态模板

jboss fuse 教程最近&#xff0c;我重新发现了我已经忘记的JBoss Fuse功能&#xff0c;并且我认为其他人可能会从此提醒中受益 。 这篇文章将重点放在JBoss Fuse和Fabric8上&#xff0c;但所有正在寻找最小侵入性方法来为其静态配置文件添加一定程度的动态支持的开发人员也可能…

mysql客户库_你应该知道的10个MySQL客户启动选项

大部分服务器管理员知道MySQL数据库管理系统(RDBMS)是高度灵活的软件块&#xff0c;带有范围广阔的启动选项&#xff0c;可以用来修改相关行为。然而&#xff0c;大部分人却不清楚&#xff0c;标准MySQL客户端带有同等大量的启动选项&#xff0c;其中一些在日常MySQL交互作用中…

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在满足典型需…

php对mysql基础操作_php+mysql的基础操作

标签&#xff1a;PHP可以说是当下很火的一门后端语言了,它小巧玲珑,和html等前端语言配合的可以说是天衣无缝,加之xampp,wampp等工具的出现,更是前端开发者的福音,作为一名前端ER,如果不熟悉一门后端语言的话,那简直都不好意思说自己要加薪,那么我们对于php这门语言学习时,如果…

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;分布式缓存和其他技术集成在一起。 现在可…

java数组和list_Java中的数组和List

一.数组Array1.数组在内存中是连续存储的&#xff0c;所以它的索引速度是非常的快&#xff0c;而且赋值与修改元素也很简单2.声明数组的时候&#xff0c;必须同时指明数组的长度&#xff0c;数组的长度过长&#xff0c;会造成内存浪费&#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基础--正则表达式的规则

注意&#xff1a;正则表达式只关注格式是否正确&#xff0c;不关注内容是否有效。一、字符集合&#xff0c; []表示一个字符。1、[abc] :指a,b,c中的任意一个字符。2、[^abc]:指除了a,b,c外的任意字符。3、[a-z]&#xff1a;表示a到z间的任意一个字符。4、[a-zA-Z0-9]:表示a到z…

获取http请求标头_HTTP请求和标头参数的CDI拦截器–简单示例

获取http请求标头在使用Java EE开发和发展REST API的过程中&#xff0c;有些情况下您希望以更精细的方式&#xff08;视情况&#xff09;对传入的HTTP请求&#xff08;特别是标头参数&#xff09;进行“观察” Servlet过滤器或更具体的ContainerRequestFilters 。 我发现在某些…

java多线程区别_Java中实现多线程的两种方式之间的区别

Java提供了线程类Thread来创建多线程的程序。其实&#xff0c;创建线程与创建普通的类的对象的操作是一样的&#xff0c;而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程&#xff0c;有两种方法&#xff1a;◆需要从Java.lang.Thre…

詹金斯搭建_与詹金斯一起将GitLab中的Gradle项目发布到Artifactory

詹金斯搭建我将详细展示如何定期构建您的项目&#xff0c;然后如何进行发布。 它涉及许多工具的协作&#xff0c;我发现很难正确设置这些工具&#xff0c;这就是我编写此代码的原因。 目标 我将向您展示如何实现以下两种方案。 第一个是如何进行常规开发的非发行版&#xff1a…

java socket优化_Java Socket编程代码优化

1.问题&#xff1a;在学习Java的Socket编程&#xff0c;写了一些代码练习&#xff0c;但是又不知道是否规范&#xff0c;是否有优化的空间&#xff1f;2.代码&#xff1a;package com.nekolr.socket;import com.google.common.util.concurrent.ThreadFactoryBuilder;import jav…