您的位置:首页 > Web前端 > JavaScript

JSP、JSF的分页设计与实现

2010-12-05 13:47 357 查看
现在在宿舍闷得慌,把jsp的分页设计总结一下!

首先是分页实体类的设计。先看源代码:

package com.dao;

import java.util.List;

/**
* 分页处理控制信息类
*
* @author 陈新杰
*
*/
public class PageContrlInfo {

/**
* 当前页数
*/
private int curPage=1;

/**
* 最大页数
*/
private int maxPage;

/**
* 每页的数据行数
*/
private int rowsPerPage=2;

/**
* 总的数据行数
*/
private int totalRowCount;

/**
* 存放数据的集合
*/
private List dataList = null;

/**
* 获取当前页数
* @return
*/
public int getCurPage() {
return curPage;
}

/**
* 设置当前页数
* @param curPage  当前页数
*/
public void setCurPage(int curPage) {
this.curPage = curPage;
}

/**
* 获取总页数
* @return
*/
public int getMaxPage() {
if (totalRowCount % rowsPerPage == 0)
return maxPage = totalRowCount / rowsPerPage;
else
return maxPage = totalRowCount / rowsPerPage + 1;

}

/**
* 设置总页数
* @param maxPage
*/
public void setMaxPage(int maxPage) {
this.maxPage = maxPage;
}

/**
* 获取每页的行数
* @return
*/
public int getRowsPerPage() {
return rowsPerPage;
}

/**
* 设置每页的行数
* @param rowsPerPage
*/
public void setRowsPerPage(int rowsPerPage) {
this.rowsPerPage = rowsPerPage;
}

/**
* 获取总的数据行数
* @return
*/
public int getTotalRowCount() {
return totalRowCount;
}

/**
* 设置总的数据行数
* @param totalRowCount
*/
public void setTotalRowCount(int totalRowCount) {
this.totalRowCount = totalRowCount;
}

/**
* 获取数据集合
* @return
*/
public List getDataList() {
return dataList;
}

/**
* 设置数据集合
* @param dataList
*/
public void setDataList(List dataList) {
this.dataList = dataList;
}

/**
* 获取下一页
* @return
*/
public int getNextPage() {
if (curPage == maxPage) {
curPage = 1;
}
else {
curPage += 1;
}
return curPage;

}

/**
* 获取上一页
* @return
*/
public int getPrePage() {
if (curPage == 1)
curPage = maxPage;
else
curPage -= 1;
return curPage;
}

}


当前页数、总页数、每页多少记录这些都是分页实体类中必须的。

在我的类中比较成功的设计是在其中增加了一个集合,用于保存查询到的数据,

也即查询一页的数据。

接下来是数据库的查询。

下面是一段具体的代码:

public void getStudents(PageContrlInfo contrlInfo) {
// TODO Auto-generated method stub
contrlInfo.setDataList(null);
List studentList = new ArrayList();
String sql = "select * from student";
// 打开数据库连接
openConnection();
try {

statement = connection.prepareStatement(sql,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
resultSet = statement.executeQuery();
resultSet.last();
int rowCount = resultSet.getRow(); // 获得ResultSet的总行数
contrlInfo.setTotalRowCount(rowCount);
// 将resultset转换为list
if (resultSet.absolute(contrlInfo.getRowsPerPage()
* (contrlInfo.getCurPage() - 1) + 1)) {
resultSet.previous();
studentList = ResultSetUtil.changeResultSet2List(resultSet,
Student.class, contrlInfo.getRowsPerPage());
}
contrlInfo.setDataList(studentList);
// 打印学生信息
printStudentData(studentList);

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 关闭数据库连接
closeConnection();
}

}


利用jdbc,将数据滚到所要查询的位置,查找具体的数据,放到上面提及的集合中。

将整个PageContrlInfo作为属性在页面中传递。这样可保持数据的最小量化。

在jsp页面上调用相应的servlet,传递相关的属性完成上下页操作。

以下是jsp的页面代码:

<center>

<c:url value='ShowStudentsSrv?result=prePage' scope="request" var="lastPage"/>
<c:url value='ShowStudentsSrv?result=nextPage' scope="request" var="nextPage"/>

<%
request.setAttribute("student","${student}");
%>

<a href="${lastPage}" mce_href="${lastPage}"><%=messageResource.getString("lastPage")%></a>|<%=messageResource.getString("theInfo")%> ${contrlInfo.curPage} <%=messageResource.getString("pageInfo")%>|<%=messageResource.getString("totalInfo")%> ${contrlInfo.maxPage} <%=messageResource.getString("pageInfo")%>|
<a href="${nextPage}" mce_href="${nextPage}"><%=messageResource.getString("nextPage")%></a>
</center>


接下来是servlet的代码:

PageContrlInfo contrlInfo = (PageContrlInfo) request.getSession()
.getAttribute("contrlInfo");
String result = request.getParameter("result");

if (result.equals("nextPage"))
contrlInfo.getNextPage();
if (result.equals("prePage"))
contrlInfo.getPrePage();
StudentDAO studentDAO = new StudentDAOImpl();
studentDAO.getStudents(contrlInfo, id, name, age, gender, birthDate);


这样,所有的操作都在servlet和dao里操作,界面仅仅是显示,没有一点逻辑的处理。

很好的实现了分离。

JSF的分页其实也很简单。原理是一样的,只是增加了一个模型层:

package com.control;

import java.util.List;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import com.dao.PageContrlInfo;
import com.dao.StudentDAO;
import com.dao.StudentDAOImpl;

public class StudentManager {

private DataModel model;

private int curPage;

private int maxPage;

PageContrlInfo contrlInfo = new PageContrlInfo();

public DataModel getStudents() {
if (model == null) {
model = new ListDataModel();
model.setWrappedData(getStudentList());
}else {
model=null;
model = new ListDataModel();
model.setWrappedData(getStudentList());
}
return model;
}

private List getStudentList() {

StudentDAO studentDAO = new StudentDAOImpl();
studentDAO.getStudents(contrlInfo);
return contrlInfo.getDataList();
}

public String lastPage(){
contrlInfo.getPrePage();
getStudents();
return "showStudents";
}

public String nextPage(){
contrlInfo.getNextPage();
getStudents();
return "showStudents";
}

public int getCurPage(){
return contrlInfo.getCurPage();
}

public int getMaxPage(){
return contrlInfo.getMaxPage();
}

public void setCurPage(int curPage) {
this.curPage = curPage;
}

public void setMaxPage(int maxPage) {
this.maxPage = maxPage;
}

}


将PageContrlInfo进行进一步的封装,然后在配置文件中进行配置:

<managed-bean>
<managed-bean-name>studentManager</managed-bean-name>
<managed-bean-class>com.control.StudentManager</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>


即可很简单的实现分页。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: