好久沒(méi)有寫(xiě)點(diǎn)東西了,這次想把JSF中的分頁(yè)系列文章再擴充一點(diǎn),說(shuō)明一下查詢(xún)和分頁(yè)結合的情況,當我們把查詢(xún)條件和查詢(xún)結果放到一個(gè)頁(yè)面上時(shí),查詢(xún)還是非常容易實(shí)現的,甚至不需要我們手工去從數據庫中查詢(xún)。
在本系列文章中的第二篇中,介紹了一種 Load On Demand的方式,我們在這里需要繼續利用這種方式,并對其做一些小小的擴展。這里我們使用 Hibernate3 作為持久化方案。
簡(jiǎn)單的介紹一下應用情景,一個(gè)系統中包含了一些 Customer 的信息,我們需要對其進(jìn)行查詢(xún)并對查詢(xún)結果進(jìn)行分頁(yè)。
首先處理條件查詢(xún)的情況,通常會(huì )根據 VO 中的字段進(jìn)行 like 型查詢(xún),有時(shí)候時(shí)間或數字之類(lèi)的會(huì )使用Between查詢(xún),因為查詢(xún)條件一般不會(huì )很復雜,在這里,使用 Hibernate3 中的 Criteria 查詢(xún)來(lái)處理這樣的情況,我們把所有的查詢(xún)條件通過(guò) Customer 這個(gè) VO 傳進(jìn)來(lái),然后只對非空字段進(jìn)行 like 查詢(xún),我們用到這樣的方法。
另外對應的一個(gè)count方法略去,只需要在前面加入一個(gè)
criteria.setProjection(Projections.count("customerId"));
因為考慮到以后的擴展,使用了一個(gè)Utils方法,QueryUtils.getCriteriaParam方法
我們可以很容易的在 Backing Bean 上通過(guò) Service 層拿到這個(gè)查詢(xún)結果的 List 和 Count 值,相關(guān)的getDatePage方法如下。
如果你不了解這個(gè) getDataPage 方法的含義,請仔細閱讀“在JSF中實(shí)現分頁(yè)(二)”一文,并仔細思考該方法的含義。
在同一個(gè) Backing Bean 中,我們放了一個(gè)存放查詢(xún)條件的VO - Customer,并在頁(yè)面中使用<t:saveState>保存其狀態(tài),使其查詢(xún)條件不會(huì )隨著(zhù)翻頁(yè)而丟失。
<t:saveState value="#{customerListBean.customer}"/>
在頁(yè)面中,我們把所有的查詢(xún)條件都放到該 VO 中,在 getDataPage 方法中就會(huì )在適當的時(shí)候調用新的查詢(xún)條件來(lái)查詢(xún)新的數據,這一切都不需要我們動(dòng)手的。
在 Backing Bean 中有這樣的一個(gè)方法:
只是把數據清空,并強制 PagedListDataModel 讀取數據,然后我們返回相同的頁(yè)面,這個(gè)時(shí)候,系統按照用戶(hù)輸入的查詢(xún)條件拿到查詢(xún)結果以后,返回同一頁(yè)面,該頁(yè)面中的使用 LocalDataModel 的那個(gè) DataTable 就會(huì )把結果顯示出來(lái)。
請注意,這里 LocalDataModel 和 Customer 都在同一個(gè) Backing Bean 中。
是不是覺(jué)得很簡(jiǎn)單呢,一切都歸功于 getDataPage 這個(gè)方法,我們幾乎不需要做什么額外的操作就可以達到我們的目的。
因為該方法在一個(gè)商業(yè)項目中使用,代碼不便公布,只能把里面的一些代碼抽取出來(lái),零零碎碎的拿給大家看,如果大家有什么疑問(wèn)的話(huà),可以在論壇上提出來(lái),我會(huì )盡力解答的,另外這個(gè)方法也會(huì )在空閑的時(shí)候 Merge 到 MyPSP 項目中去。
聯(lián)系客服