懒惰的JSF Primefaces数据表分页–第1部分

今天,我们将使用带有视图范围的托管bean的惰性列表进行JSF数据表分页。 这些单词/表达式是什么意思?

如今,有几个JSF框架为数据表提供现成的分页,列排序器和其他功能。 今天,我们将使用Primefaces数据表。

通常,数据表会将显示的列表和实体放在用户http会话中。 增加用户会话中的对象将直接影响服务器性能。 每个显示数据表并在会话中保留列表的用户将在服务器中分配越来越多的内存。

为了看起来真实,我们的文章将使用JPA和HSQLDB作为数据库,并且将使用JPQL查询数据。

在本文的结尾,您将找到下载源代码的链接。

我们将使用:

  • JSF 2.0 – JBoss 7实施
  • JBoss 7.1 –本文的代码应应用于所有服务器
  • 日食靛蓝
  • JPA 2.0 – JBoss 7实施
  • HSQLDB(2.2.8)– HSQL是一个内存数据库,它将更易于运行。
  • Primefaces 3.2

这篇文章不是关于好的开发实践,也不是关于添加项目建模的类层。 我只是想展示如何在没有会话托管bean的情况下进行分页。

我们只有一个实体,即Player类。 下面是班级代码:

package com.model;import java.io.Serializable;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class Player implements Serializable{private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int hashCode() {return getId();}@Overridepublic boolean equals(Object obj) {if(obj instanceof Player){Player player = (Player) obj;return player.getId() == getId();}return false;}
}

我们将需要在“ src / META-INF”文件夹中创建一个persistence.xml文件:

<?xml version="1.0" encoding="UTF-8"?><persistence version="2.0"xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"><persistence-unit name="JSFPU" transaction-type="JTA"><jta-data-source>java:/JSFDS</jta-data-source><properties><property name="hibernate.show_sql" value="false" /><property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /><property name="hibernate.connection.shutdown" value="true" /><property name="hibernate.hbm2ddl.auto" value="create-drop" /></properties></persistence-unit>
</persistence>

为了抽象数据库事务,我们将使用一个名为MyTransaction的类:

package com.connection;import java.io.Serializable;import javax.persistence.EntityManager;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;public class MyTransaction implements Serializable {/****/private static final long serialVersionUID = 1L;private Connection connection = new Connection();   public void begin() throws NotSupportedException, SystemException {connection.begin();}public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException, SecurityException, IllegalStateException,SystemException {connection.commit();}public int getStatus() throws SystemException {return connection.getStatus();}public void rollback() throws IllegalStateException, SecurityException, SystemException {connection.rollback();}public void setRollbackOnly() throws IllegalStateException, SystemException {connection.setRollbackOnly();}public void setTransactionTimeout(int timeout) throws SystemException {connection.setTransactionTimeout(timeout);}public static MyTransaction getNewTransaction() {return new MyTransaction();}public EntityManager getEntityManager() {return connection.getEntityManager();}
}

您可以在上面的代码中看到,该类只是数据库连接的抽象; 它将帮助我们进行数据库查询。 您可以使用任何类型的连接,甚至可以使用EJB来避免这种手动连接管理。

检查连接类代码:

package com.connection;import java.io.Serializable;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;public class Connection implements Serializable {private static final long serialVersionUID = 1L;/*** Get the user transaction by JNDI** @return the user transaction*/public UserTransaction getUserTransaction() {UserTransaction ut = null;try {Context c = new InitialContext();ut = (UserTransaction) c.lookup("java:comp/UserTransaction");} catch (Exception e) {e.printStackTrace();}return ut;}/*** Get the EntityManayger by JNDI** @return the entity manager*/public EntityManager getEntityManager() {EntityManager em = null;try {Context initCtx = new InitialContext();// The JSFPU must be written in the web.xmlem = (EntityManager) initCtx.lookup("java:comp/env/JSFPU");} catch (Exception e) {e.printStackTrace();}return em;}public void begin() throws NotSupportedException, SystemException {getUserTransaction().begin();}public void commit() throws SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException, SystemException {getUserTransaction().commit();}public int getStatus() throws SystemException {return getUserTransaction().getStatus();}public void rollback() throws IllegalStateException, SecurityException, SystemException {getUserTransaction().rollback();}public void setRollbackOnly() throws IllegalStateException, SystemException {getUserTransaction().setRollbackOnly();}public void setTransactionTimeout(int timeout) throws SystemException {getUserTransaction().setTransactionTimeout(timeout);}
}

我们可以使用JSF注入的UserTransaction,但是我们选择使用JNDI查找。 有几个在JSF上下文之外调用的Primefaces调用,如果尝试访问应注入的引用,则可能会出现NullPointerException。 有几种方法可以解决此问题,但是我们将对EntityManager和UserTransaction使用JNDI查找。

我们的最后一堂课是PlayerDAO:

package com.dao;import java.io.Serializable;
import java.util.List;import javax.persistence.EntityManager;
import javax.persistence.Query;import com.connection.MyTransaction;
import com.model.Player;public class PlayerDAO implements Serializable {private static final long serialVersionUID = 1L;private MyTransaction myTransaction;public PlayerDAO(MyTransaction transaction) {this.myTransaction = transaction;}/*** Find players in the DB** @param startingAt the first "row" db that the query will search* @param maxPerPage the amount of records allowed per "trip" in the DB* @return a players java.util.List*/@SuppressWarnings("unchecked")public List<Player> findPlayers(int startingAt, int maxPerPage) {EntityManager em = myTransaction.getEntityManager();// regular query that will search for players in the dbQuery query = em.createQuery("select p from Player p");query.setFirstResult(startingAt);query.setMaxResults(maxPerPage);return query.getResultList();}/*** Creates 100 players in the DB*/public void create100Players() {EntityManager em = myTransaction.getEntityManager();Player player;for (int x = 0; x < 100; x++) {player = new Player();player.setName("Player: " + x);player.setAge(x);em.persist(player);}em.flush();}/*** Sum the number of players in the DB** @return an int with the total*/public int countPlayersTotal() {EntityManager em = myTransaction.getEntityManager();Query query = em.createQuery("select COUNT(p) from Player p");Number result = (Number) query.getSingleResult();return result.intValue();}
}

在PlayerDAO类中,只有3种方法可用于分页。 注意,没有方法可以列出数据库中的所有玩家。

创建文件夹“ YOU_JBOSS / modules / org / hsqldb / main”。 在此文件夹中,创建一个名为“ module.xml”的文件。 将下面的代码写在“ module.xml”文件中:

<module xmlns="urn:jboss:module:1.0" name="org.hsqldb"><resources><resource-root path="hsqldb.jar" /></resources><dependencies><module name="javax.api" /><module name="javax.transaction.api" /></dependencies>
</module>

将“ hsqldb.jar”文件复制到刚创建的文件夹“ main”中。 您可以在下载的HSQLDB jar中找到此文件,其路径为“ hsqldb-2.2.8.zip/hsqldb-2.2.8/hsqldb/lib”。

编辑文件“ YOU_JBOSS / standalone / configuration / standalone.xml”,然后在“数据源”节点中添加以下代码:

<datasource jndi-name="java:/JSFDS" pool-name="JSFDS_POOL"enabled="true" jta="true" use-java-context="true" use-ccm="true"><connection-url>jdbc:hsqldb:mem:jsfinmemory</connection-url><driver>hsqldb</driver><pool><prefill>false</prefill><use-strict-min>false</use-strict-min><flush-strategy>FailingConnectionOnly</flush-strategy></pool><security><user-name>sa</user-name><password></password></security>
</datasource>

在驱动程序节点中添加:

<driver name="hsqldb" module="org.hsqldb"/>

参考: uaiHebert博客上我们JCG合作伙伴 Hebert Coelho的懒惰JSF数据表分页(Primefaces) 。


翻译自: https://www.javacodegeeks.com/2012/04/lazy-jsf-primefaces-datatable.html

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

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

相关文章

java 动态增加定时任务

直接上代码 import org.apache.tools.ant.util.DateUtils; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory;import java.util.Calendar; import…

基于JavaFX的SimpleDateFormat演示程序

对于使用Java Date进行格式化的新手甚至对于使用Java Date进行格式化的有经验的Java开发人员而言&#xff0c;可能有些棘手的事情是使用SimpleDateFormat规范日期/时间格式。 SimpleDateFormat的基于类级别的Javadoc的文档非常详尽&#xff0c;涵盖了表示日期/时间的各个组成部…

mysql中预定义常量_PHP预定义常量

这些常量在 PHP 的内核中定义。它包含 PHP、Zend 引擎和 SAPI 模块。PHP_VERSION (string)PHP_OS (string)PHP_EOL (string)自 PHP 4.3.10 和 PHP 5.0.2 起可用PHP_INT_MAX (integer)自 PHP 4.4.0 和 PHP 5.0.5 起可用PHP_INT_SIZE (integer)自 PHP 4.4.0 和 PHP 5.0.5 起可用D…

iOS与H5交互

前提&#xff1a;在iOS控制器中加载UIWebView&#xff0c;设置代理&#xff0c;遵守UIWebViewDelegate协议。 一、iOS调用JS方法 通过iOS调用JS代码实现起来比较方便直接调用UIWebView的方法- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script…

cocos2dx 3.x 蒙板 遮罩 点击圆功能

//注册触摸EventListenerTouchOneByOne *listener EventListenerTouchOneByOne::create();listener->onTouchBegan CC_CALLBACK_2(HelloWorld::onTouchBegan,this);listener->onTouchMoved CC_CALLBACK_2(HelloWorld::onTouchMoved,this);listener->onTouchEnded …

markdownTest

MARKDOWNTEST 11111111111111有一种神奇的语言&#xff0c;它比html还简单&#xff0c;它巧妙地将内容与格式整合在一起——它就是Markdown有一种神奇的语言&#xff0c;它比html还简单&#xff0c;它巧妙地将内容与格式整合在一起——它就是Markdown 111111111111111222222222…

python模拟密码有效性检测功能_检查密码有效性(Django/Python)

我有一个非常小的Django应用程序&#xff0c;主要是为了学习。我使用的是Django提供的内置用户模型。为了学习这个功能&#xff0c;我创建了一些页面&#xff0c;这些页面允许我创建和编辑用户&#xff0c;而不必进入管理面板。在register页面允许我非常容易地检查密码和电子邮…

教程:Hibernate,JPA –第1部分

这是关于使用Hibernate和JPA的教程的第一部分。 这部分是对JPA和Hibernate的介绍。 第二部分将研究使用Spring ORM组合Spring MVC应用程序以减少创建CRUD应用程序所需的代码量。 为此&#xff0c;您需要熟悉Maven&#xff0c;JUnit&#xff0c;SQL和关系数据库。 依存关系 首…

TCP、UDP套接字的数据传输

tcp发送数据&#xff1a; 1 #include <sys/types.h> 2 #include <socket.h> 3 ssize_t send(int sockfd,const void *msg,size_t len,int flags); 函数send只能对面向连接的套接字使用。参数sockfd为已经建立好连接的套接字描述符。参数msg指向待发送数据的缓冲区&…

Windows下用PIP安装scipy出现no lapack/blas resources found

Windows下升级了pandas&#xff0c;但是发现scipy包随后引用出错&#xff0c;后来确认需重新安装scipy&#xff0c; 在用PIP安装scipy出现no lapack/blas resources found的错误&#xff0c;具体原因可参考 这里。 后来找到一种简便的解决方案&#xff0c;只要在网站 Unofficia…

Aleri –复杂事件处理

Sybase的Aleri流媒体平台是CEP市场中最受欢迎的产品之一。 它在Sybase的交易平台RAP版本中使用&#xff0c;该版本在资本市场中广泛用于管理投资组合中的头寸。 今天&#xff0c;在这个由多个部分组成的系列文章的第一个部分中&#xff0c;我希望提供Aleri平台的概述&#xff0…

python版本回退_Python爬虫之BeautifulSoup解析之路

上一篇分享了正则表达式的使用&#xff0c;相信大家对正则也已经有了一定的了解。它可以针对任意字符串做任何的匹配并提取所需信息。但是我们爬虫基本上解析的都是html或者xml结构的内容&#xff0c;而非任意字符串。正则表达式虽然很强大灵活&#xff0c;但是对于html这样结构…

0615 团队第二阶段贡献

0615 团队第二阶段贡献 列志华http://www.cnblogs.com/liezhihua/ 26% 组长 黄柏堂 http://www.cnblogs.com/huang123/ 22% 团队 韩麒麟 http://www.cnblogs.com/hanqilin/ 26% 团队 王俊杰 http://www.cnblogs.com/wangjunjie123/ 28%团队posted on 2016…

WebStorm 运行Rect Native 项目

今天教大家如何直接使用WebStorm这个IDE直接完成编码运行项目工作.这样就可以不用打开Xcode了. 1.首先点击WebStorm右上方的下拉箭头弹出的Edit Configurations.... 2.然后会进入一个配置页面.点击左上方的.在弹出的列表中选中npm.如图. 3.在右边的配置框中,先选择Command为hel…

python编程比赛_用Python编程分析4W场球赛后,2018世界杯冠军竟是…

比赛已经开始&#xff0c;我们不妨用 Python 来对参赛队伍的实力情况进行分析&#xff0c;并大胆的预测下本届世界杯的夺冠热门球队吧&#xff01;通过数据分析&#xff0c;可以发现很多有趣的结果&#xff0c;比如&#xff1a;找出哪些队伍是首次进入世界杯的黑马队伍找出2018…

GlassFish 3.1.2充满了MOXy(EclipseLink JAXB)

我非常高兴地宣布&#xff0c; EclipseLink JAXB&#xff08;MOXy&#xff09;现在是GlassFish 3.1.2中的JAXB&#xff08; JSR-222 &#xff09;提供程序。 我要感谢EclipseLink和GlassFish提交者为实现这一目标付出的​​辛勤工作。 在本文中&#xff0c;我将介绍如何利用MOX…

梦断代码阅读笔记03

读完《梦断代码(Dream In Code)》样书&#xff0c;我感觉心情有点沉重&#xff0c;Chandler项目的结局&#xff0c;它失败了&#xff0c;它成了众多失败软件项目中的一个。这个结局让那个我感受到软件实在是太难了&#xff0c;我觉得当初选这个专业可能到最后只是一个码农。但是…

Java访问权限的范围

二、下面用表格来展示四种修饰符的访问权限范围&#xff1a; 同一个类 同一个包 不同包的子类 不同包的非子类 public √ √ √ √ protected √ √ √ 默认(default) √ √ private √ 转载于:https://www.cnblogs.com/jianxin-lilang/p/6…

JavaFX 2 GameTutorial第2部分

介绍 Ť他的是一系列与一个JavaFX 2游戏教程博客条目的第二批。 如果您尚未阅读第1部分&#xff0c;请参阅JavaFX 2游戏教程的简介部分。 在第1部分中&#xff0c;我提到了游戏的某些方面以及原型飞船的简单演示&#xff08;原型由简单的形状组成&#xff09;&#xff0c;该飞船…

sqlyog连接mysql教程_如何用SQLyog实现远程连接MySQL

SQLyog客户端&#xff0c;用root用户远程链接MySQL时&#xff0c;提示ldquo;访问被拒绝rdquo;&#xff0c;在网上搜索了一下原因。原来是MySQL没有授权其远程链1&#xff0c;SQLyog客户端&#xff0c;&#xff0c;用root用户远程链接MySQL时&#xff0c;提示“访问被拒绝”&…