?? struts.txt.txt
字號:
頁面實(shí)體類為Page.java,代碼如下所示:
package org.shirdrn.page;
import java.util.List;
public class Page {
private int pageSize; // 每頁顯示的記錄數(shù)
private int totalPage; // 頁數(shù)
private int rowCount; // 總記錄數(shù)
private int currentPage; // 當(dāng)前頁
private int prePage; // 上一頁
private int nextPage; // 下一頁
private boolean hasNextPage; // 是否有下一頁
private boolean hasPreviousPage; // 是否有前一頁
private List list;
public Page(){ // 實(shí)例化一個Page對象時,初始化頁面顯示記錄數(shù)
this.pageSize = 5;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getNextPage() {
return nextPage;
}
public void setNextPage(int nextPage) {
this.nextPage = nextPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPrePage() {
return prePage;
}
public void setPrePage(int prePage) {
this.prePage = prePage;
}
public int getRowCount() {
return rowCount;
}
public void setRowCount(int rowCount) {
this.rowCount = rowCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public boolean isHasNextPage() {
return hasNextPage;
}
public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
}
public boolean isHasPreviousPage() {
return hasPreviousPage;
}
public void setHasPreviousPage(boolean hasPreviousPage) {
this.hasPreviousPage = hasPreviousPage;
}
}
分頁邏輯的實(shí)現(xiàn)類為PageUtil.java,代碼如下所示:
package org.shirdrn.page;
import org.hibernate.Query;
import org.hibernate.Session;
import org.shirdrn.hibernate.HibernateSessionFactory;
public class PageUtil {
private Page page; // 分頁邏輯處理的對象是頁面實(shí)體
private int start; // start是點(diǎn)擊“上一頁”或“下一頁”傳遞進(jìn)來的頁碼
private String hql; // 檢索的HQL語句
public PageUtil(int start,String sql){
// 實(shí)例化一個PageUtil對象。在這里調(diào)用了除了最后一個方法getPage()以外的,該P(yáng)ageUtil類的所有實(shí)現(xiàn)方法,具體實(shí)現(xiàn)可以看下面的方法實(shí)現(xiàn)
// 注意:必須保證其中方法的順序如下所示
page = new Page(); // 初始化一個Page,即指定了pageSize=5,這個可以到Page類中自定義
this.start = start;
this.hql = sql;
setRowCount(); // 設(shè)置page的屬性rowCount值,即該次查詢的總記錄數(shù)
setTotalPage(); // 設(shè)置總頁數(shù)
setCurrentPage(); // 設(shè)置當(dāng)前頁
setPrePage(); // 設(shè)置上一頁
setNextPage(); // 設(shè)置下一頁
setPreOrNextBoolean(); // 設(shè)置是否有“上一頁”或者是否有下一頁的boolean型標(biāo)識
}
public void setPreOrNextBoolean(){ // 設(shè)置是否有“上一頁”或者是否有下一頁的boolean型標(biāo)識
if(page.getCurrentPage()<=1){ // 第一頁時,沒有上一頁,則上一頁鏈接失效
page.setHasPreviousPage(false);
}
else{
page.setHasPreviousPage(true);
}
if(page.getCurrentPage()>=page.getTotalPage()){ // 最后一頁時,沒有下一頁,則下一頁鏈接失效
page.setHasNextPage(false);
}
else{
page.setHasNextPage(true);
}
}
public void setCurrentPage(){ // 設(shè)置當(dāng)前頁
if(start<1){
page.setCurrentPage(1);
}
if(start>page.getTotalPage()){
page.setCurrentPage(page.getTotalPage());
}
page.setCurrentPage(start);
}
public void setPrePage(){ // 設(shè)置上一頁
page.setPrePage(page.getCurrentPage()-1);
}
public void setNextPage(){
page.setNextPage(page.getCurrentPage()+1);
}
public void setTotalPage(){ // 設(shè)置總頁數(shù)
int rowCount = getRowCount();
int pageSize = page.getPageSize();
if(rowCount>pageSize){
if(rowCount%pageSize == 0){
page.setTotalPage(rowCount/pageSize);
}
else{
page.setTotalPage(1+(rowCount/pageSize));
}
}
else{
page.setTotalPage(1);
}
}
public void setRowCount(){ // 設(shè)置page的屬性rowCount值,即該次查詢的總記錄數(shù)
page.setRowCount(getRowCount());
}
public int getRowCount(){ // 獲取總記錄數(shù)
Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery(hql); // 執(zhí)行檢索
int size = query.list().size();
session.close();
return size;
}
public int getStartIndex(){ // 當(dāng)傳遞進(jìn)來一個頁碼,根據(jù)這個頁碼設(shè)置執(zhí)行后臺檢索的起始索引
int startIndex = 0;
if(start<0){
startIndex = 0;
}
else{
if(start>page.getTotalPage()){
startIndex = page.getPageSize()*(page.getTotalPage()-1);
}
else{
startIndex = page.getPageSize()*(start-1);
}
}
return startIndex;
}
public Page getPage(){ // 這個方法不是在初始化PageUtil時調(diào)用的,而是初始化之后調(diào)用,返回一個頁(主要是一個頁所要顯示的記錄列表query.list())
Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery(hql);
query.setFetchSize(10);
query.setFirstResult(getStartIndex());
query.setMaxResults(page.getPageSize());
page.setList(query.list());
session.close();
return page;
}
}
頁面listPersons.jsp代碼的編寫如下所示:
<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html:html locale="true">
<head>
<base href="<%=basePath%>">
<title>查詢記錄列表</title>
<style type="text/css">
body{
background:#000000;
font-size:12px;
color:yellow;
}
a:link{
color:yellow;
text-decoration:none;
}
a:hover{
color:red;
text-decoration:none;
}
a:visited{
color:yellow;
text-decoration:none;
}
</style>
</head>
<body>
<table width="60%" align="center" bgcolor="green" border="1">
<tr>
<th colspan="10">人員查詢列表</th>
</tr>
<tr align="center">
<td width="20%"><b>ID</b></td>
<td width="20%"><b>姓名</b></td>
<td width="20%"><b>性別</b></td>
<td width="20%"><b>年齡</b></td>
<td width="20%"><b>住址</b></td>
</tr>
<logic:present name="persons">
<logic:iterate id="person" name="persons" type="org.shirdrn.entity.Person">
<logic:present name="person">
<tr align="center">
<td width="20%" height="10"><bean:write name="person" property="id"/></td>
<td width="20%" height="10"><bean:write name="person" property="name"/></td>
<td width="20%" height="10"><bean:write name="person" property="gender"/></td>
<td width="20%" height="10"><bean:write name="person" property="age"/></td>
<td width="20%" height="10"><bean:write name="person" property="addr"/></td>
</tr>
</logic:present>
</logic:iterate>
</logic:present>
</table>
<table align="center" width="60%" bgcolor="green" border="1">
<tr>
<td align="center" colspan="10">
<logic:present name="myPage">
<html:link page="/page.do?page=1">首頁</html:link>
<logic:equal name="myPage" property="hasPreviousPage" value="false">上一頁</logic:equal>
<logic:equal name="myPage" property="hasPreviousPage" value="true">
<a href="<%=path%>/page.do?page=<bean:write name="myPage" property="prePage"/>">上一頁</a>
</logic:equal>
每頁<bean:write name="myPage" property="pageSize"/>條記錄
共<bean:write name="myPage" property="rowCount"/>條記錄
當(dāng)前第(<bean:write name="myPage" property="currentPage"/>/<bean:write name="myPage" property="totalPage"/>)頁
<logic:equal name="myPage" property="hasNextPage" value="false">下一頁</logic:equal>
<logic:equal name="myPage" property="hasNextPage" value="true">
<a href="<%=path%>/page.do?page=<bean:write name="myPage" property="nextPage"/>">下一頁</a>
</logic:equal>
<a href="<%=path%>/page.do?page=<bean:write name='myPage' property='totalPage'/>">末頁</a>
</logic:present>
</td>
</tr>
</table>
</body>
</html:html>
其中,每次點(diǎn)擊“首頁”、“上一頁”、“下一頁”、“末頁”鏈接的時候,都去請求Action,將頁碼傳到Action中,根據(jù)傳遞進(jìn)去的頁碼來處理下次顯示的記錄的查詢。
Action的實(shí)現(xiàn)為PageAction,代碼如下所示:
package org.shirdrn.struts.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.shirdrn.page.Page;
import org.shirdrn.page.PageUtil;
public class PageAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
String page = request.getParameter("page");
String hql = "from Person";
int start = (new Integer(page)).intValue();
PageUtil pu = new PageUtil(start,hql);
Page myPage = pu.getPage();
List persons = pu.getPage().getList();
HttpSession session = request.getSession();
session.setAttribute("myPage", myPage);
session.setAttribute("persons", persons);
return mapping.findForward("list_persons");
}
}
測試時,直接在瀏覽器地址欄中鍵入鏈接:
http://localhost:8080/HibernateStrutsPage/page.do?page=1
測試頁面的效果如下所示:
第一頁的時候,“上一頁”鏈接是無效的,即在頁面listPersons.jsp中執(zhí)行代碼:
<logic:equal name="myPage" property="hasPreviousPage" value="false">上一頁</logic:equal>
最后一頁的時候,“下一頁”的鏈接是無效的,即在頁面listPersons.jsp中執(zhí)行代碼:
<logic:equal name="myPage" property="hasNextPage" value="false">下一頁</logic:equal>
否則,如既不是第一頁,又不是左后一頁,則執(zhí)行下面的代碼顯示“上一頁”和“下一頁”,而且鏈接是有效的,可以請求Action執(zhí)行查詢獲取相應(yīng)頁顯示的記錄:
<logic:equal name="myPage" property="hasPreviousPage" value="true">
<a href="<%=path%>/page.do?page=<bean:write name="myPage" property="prePage"/>">上一頁</a>
</logic:equal>
<logic:equal name="myPage" property="hasNextPage" value="true">
<a href="<%=path%>/page.do?page=<bean:write name="myPage" property="nextPage"/>">下一頁</a>
</logic:equal>
而首頁和末頁在頁面顯示的任何時候,都是有效的:
<html:link page="/page.do?page=1">首頁</html:link>
</logic:equal>
<a href="<%=path%>/page.do?page=<bean:write name='myPage' property='totalPage'/>">末頁</a>
</logic:present>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -