懶惰的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.pswp.cn/news/372815.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372815.shtml
英文地址,請注明出處:http://en.pswp.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;提示“訪問被拒絕”&…