ปัญหาการเพจเป็นปัญหาทั่วไปที่นักพัฒนาเกือบทุกคนจะพบ ฉันจะไม่พูดถึงวิธีการเพจโดยเฉพาะที่นี่ แต่จะอธิบายหลักการของเพจในโหมดเว็บ วิธีแรกคือการสืบค้นเพื่อให้ได้ชุดผลลัพธ์ (แสดงเป็นผลลัพธ์ที่ได้จากการสืบค้นฐานข้อมูล) หากมีผลลัพธ์จำนวนมาก โดยทั่วไปเราจะไม่แสดงข้อมูลทั้งหมดพร้อมกัน จากนั้นเราจะใช้เพจจิ้งเพื่อแสดงข้อมูลบางอย่าง (เช่น จำนวน 20 รายการ) เนื่องจากลักษณะไร้สัญชาติของ HTTP การส่งแต่ละครั้งจะถือเป็นคำขอใหม่ แม้ว่าหน้าจะมีการเปลี่ยนแปลง แต่ผลลัพธ์สุดท้ายจะไม่มีผลกระทบกับหน้าถัดไป
ต่อไปนี้เป็นสามวิธีในการใช้เพจจิ้ง ฉันไม่รู้ว่ามีวิธีอื่นอีกไหม!
1. รับข้อมูลทั้งหมดของผลลัพธ์แบบสอบถามในแต่ละครั้ง จากนั้นแสดงบันทึกที่ระบุตามหมายเลขหน้า
2. รับข้อมูลเพียงหน้าเดียวตามหน้านั้น จากนั้นจึงแสดงหน้านี้ ที่นี่ คุณจะต้องสร้างคำสั่ง sql
3. การรับข้อมูลจำนวนหนึ่งเป็นการประนีประนอมระหว่างสองหน้าก่อนหน้า
สิ่งที่ควรสังเกตที่นี่คือว่าข้อมูลถูกวางไว้ในคำขอหรือเซสชัน ซึ่งจะกล่าวถึงทีละรายการที่นี่
1. โดยทั่วไปจะไม่ถูกวางไว้ในเซสชันเนื่องจากจะใช้หน่วยความจำมาก ดังนั้นจึงควรวางไว้ในคำขอ
ข้อดี: การใช้งานค่อนข้างง่ายและความเร็วในการสืบค้นค่อนข้างรวดเร็ว
ข้อเสีย: ใช้หน่วยความจำมากขึ้นและส่งข้อมูลจำนวนมากผ่านเครือข่าย
วิธีนี้เหมาะกับการสืบค้นที่มีข้อมูลค่อนข้างน้อยมากกว่า บางคนใส่ข้อมูลไว้ในเซสชันเพื่อไม่ให้ต้องค้นหาซ้ำเมื่อเปลี่ยนหน้า อย่างไรก็ตาม การดำเนินการนี้แย่มาก และไม่แนะนำให้ใช้ในลักษณะนี้
2. มันจะไม่ถูกวางไว้ในเซสชั่นอย่างแน่นอน เพราะมันไม่มีเหตุผลที่จะใส่ไว้ในเซสชั่น
ข้อดี: ใช้หน่วยความจำน้อยกว่า
ข้อเสีย: จะยุ่งยากกว่า คุณต้องได้รับผลลัพธ์การสืบค้นทั้งหมดก่อน เนื่องจากคุณจำเป็นต้องทราบจำนวนระเบียนจึงจะทราบว่ามีกี่หน้า นอกจากนี้ จำเป็นต้องสร้างคำสั่งแบบสอบถามเพจจิ้ง ซึ่งจะแตกต่างกันไปตามฐานข้อมูลที่แตกต่างกัน
3. สถานการณ์นี้จะต้องอยู่ในเซสชัน ไม่เช่นนั้นเหตุใดฉันจึงต้องดึงข้อมูลหลายหน้า การใช้งานนี้คือการลดจำนวนการสืบค้นฐานข้อมูล ตัวอย่างเช่น ถ้าฉันบันทึกบันทึก 1 ถึง 10 แล้วถ้าฉันเปลี่ยนหน้า ระหว่าง 1 และสามารถรับ 10 รายการได้โดยตรงจากเซสชัน ถ้าฉันเปลี่ยนเป็นหน้า 11 ฉันสามารถรีเซ็ตแคชเป็น 11 ได้
ข้อมูล 20 หน้า (หรือข้อมูล 5 ถึง 15 หน้า) ในกรณีนี้ จำเป็นต้องมีการดำเนินการสืบค้นฐานข้อมูลเพียงครั้งเดียวเท่านั้นสำหรับการเปลี่ยนแปลง 10 รายการ
ข้อดี: ใช้หน่วยความจำค่อนข้างน้อยและปรับปรุงความเร็วการสืบค้นโดยเฉลี่ย
ข้อเสีย: การใช้งานมีความซับซ้อนมากกว่า อาจมีข้อมูลสกปรก และคุณต้องกำหนดคอลเลกชันแคชด้วยตัวเอง หากปริมาณข้อมูลที่สืบค้นค่อนข้างมาก คุณสามารถลองใช้วิธีนี้ได้
การออกแบบต่อไปนี้จะได้รับข้อมูลเพียงหน้าเดียวในแต่ละครั้ง และจำนวนแบบสอบถามทั้งหมดจะต้องถูกรีเซ็ตในแต่ละครั้ง
ออกแบบอินเทอร์เฟซที่นี่:
package treeroot.util;import java.util.List;/*** อินเทอร์เฟซนี้ใช้เพื่อใช้ฟังก์ชันเพจจิ้ง โปรดทราบว่าไม่มีฟังก์ชันการแก้ไขให้ไว้ที่นี่ * @author treerot* @version 1.0* @since 2004-9-30*/public interface Pageable{ /** * รับผลลัพธ์ข้อมูล* @return */ public List getResult(); /** * รับจำนวนคำค้นหาทั้งหมด * @return */ public int getCount(); /** * รับจำนวนบันทึกต่อหน้า* @return */ public int getPageSize(); /** * รับหมายเลขหน้าปัจจุบัน* @return */ public int getCurrentPage(); /** * รับจำนวนหน้าทั้งหมด* @return */ public int getPages(); /** * จำนวนบันทึกเริ่มต้นที่แสดงในแต่ละหน้า*/ public Final static int DEFAULT_PAGESIZE=20;} อินเทอร์เฟซนี้เรียบง่ายมาก ประกอบด้วยรายการผลลัพธ์และข้อมูลที่จำเป็นสำหรับเพจ
1. การใช้อินเทอร์เฟซนี้แสดงถึงหน้าข้อมูลบางหน้าในการสืบค้นบางรายการ ซึ่งไม่มีส่วนเกี่ยวข้องกับการสืบค้นครั้งล่าสุด
2. การใช้งานอินเทอร์เฟซนี้ควรเป็นแบบอ่านอย่างเดียว ซึ่งหมายความว่าไม่สามารถแก้ไขได้
3. เมธอด getPages() ซ้ำซ้อน แต่เมธอดนี้ยังคงให้ไว้ที่นี่
การใช้งานเชิงนามธรรมได้รับด้านล่าง:
แพ็คเกจ treeroot.util; นำเข้า java.util.List;/*** @author treerot* @version 1.0* @since 2004-9-30*/public abstract class AbstractPage ใช้งาน Pageable { private int currentPage; private int pageSize; จำนวนหน้าที่ได้รับการป้องกัน ผลรายการที่ได้รับการป้องกัน /** * ระบุหน้าปัจจุบัน* @param currentPage * @throws PageException */ public AbstractPage(int currentPage) นี้(currentPage,Pageable.DEFAULT_PAGESIZE); } /** * ระบุหน้าปัจจุบันและขนาดหน้า* @param currentPage * @param pageSize * @throws PageException */ public AbstractPage(int currentPage,int pageSize) { this.currentPage=currentPage ; this.pageSize=pageSize; } การป้องกันเป็นโมฆะ checkPage(int currentPage) พ่น PageException{ if((currentPage<1)||(currentPage>this.getPages())) Throw new PageException("หน้าอยู่นอกช่วง: จำนวนหน้าทั้งหมดคือ "+this.getPages()+", หน้าปัจจุบันคือ " +currentPage); } /** * วิธีการนี้ถูกแทนที่โดยคลาสย่อยสำหรับการเริ่มต้น นั่นคือ เพื่อคำนวณค่าการนับและผลลัพธ์ และถูกเรียกในตัวสร้างของคลาสย่อย */ บทคัดย่อที่ได้รับการป้องกัน init() พ่น PageException; public list getResult() { return result; } public int getCount() { return count; } public int getPageSize() { return pageSize; } public int getCurrentPage() { return currentPage; } public int getPages() { if(pages==0) this.pages=(count+pageSize-1)/pageSize; หน้า; }}คลาสนามธรรมนี้ใช้วิธีการทั้งหมดในอินเทอร์เฟซ แต่กำหนดวิธีการนามธรรม init() ซึ่งจะต้องนำไปใช้ในคลาสย่อย อินเทอร์เฟซและคลาสนามธรรมด้านบนดูค่อนข้างเรียบง่าย คุณอาจรู้สึกว่าพวกเขาไม่ได้ทำอะไรเลย จริงๆ แล้วพวกเขาไม่ได้ทำอะไรเลยในแง่ของการนำไปใช้งาน แต่สามารถช่วยในการพัฒนาได้มาก เราสามารถสืบทอดคลาสนามธรรมนี้ได้ตามความต้องการของเราเอง และข้อมูลสามารถรับได้หลายวิธี เช่น โดยตรงผ่าน List หรือผ่าน JDBC, Hibernate เป็นต้น แต่เราทุกคนจำเป็นต้องสรุปผลลัพธ์ไว้ใน List ผ่านไฮเบอร์เนต ดูเหมือนสะดวกเป็นพิเศษ
PageException เป็นข้อยกเว้นแบบกำหนดเอง
แพ็คเกจ treeroot.util /*** @author treeroot* @version 1.0* @since 2004-9-30*/public class PageException ขยายข้อยกเว้น{ public PageException(){ super(); } public PageException(String message){ super( ข้อความ); }}