业务逻辑
- 实现原理:用户每次点击检索或者分页按钮查询时,提交表单,并将当前页码传入到servlet。
- 点击检索图书时,传入当前页码为1
- 点击分页按钮页码时:传入对应页码值
- 每次提交表单,根据当前传入的页码数,查询指定位置的图书信息
- 例如:设置每页显示的数量为pageRowNumber点击第2页,查询的索引则为((pageRowNumber*2)-(pageRowNumber-1))到(pageRowNumber*2)。查询结束转发至当前页面,并将查询结果保存到request范围对象中,动态获取
- 方法准备
- 需要获取到数据库总的图书信息数量
- 需要设置每页显示的图书信息
- 根据当前页面计算出查询的起始和结束索引
- 定义方法获取总数selectRowCount()
/**
* 获得BOOK_MESSAGE表中的图书信息的总行数
*
* @param conn
* 数据库连接对象
* @return 返回Integer类型,返回总行数
* @throws SQLException
*/
public abstract Integer selectRowCount(Connection conn) throws SQLException;
- 定义根据索引查询指定的图书信息
/**
* 查询BOOK_MESSAGE表中指定位置的图书信息
*
* @param conn
* 数据库连接对象
* @param entity
* 封装查询信息的实体类
* @param startRow
* 查询起始
* @param endRow
* 查询结束
* @return 返回java.util.List类型,每一条数据是一个封装数据的实体类
* @throws SQLException
*/
public abstract List<BookMessageEntity> selectBookMessage(Connection conn, Integer startRow, Integer endRow) throws SQLException;
- 实现接口中的方法
@Override
public List<BookMessageEntity> selectBookMessage(Connection conn,Integer startRow ,Integer endRow) throws SQLException {
String sql = "SELECT R,BOOK_ID,BOOK_NAME,BOOK_AUTHOR,BOOK_PRICE,BOOK_ISBN FROM ("
+ "SELECT ROW_NUMBER() OVER(ORDER BY BOOK_ID) AS R,BOOK_ID,BOOK_NAME,BOOK_AUTHOR,"
+ "BOOK_PRICE,BOOK_ISBN FROM BOOK_MESSAGE) WHERE R BETWEEN ? AND ? ";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, startRow);
ps.setInt(2, endRow);
ResultSet rs = ps.executeQuery();
List<BookMessageEntity> list = new ArrayList<BookMessageEntity>();
BookMessageEntity entity = null;
while(rs.next()){
entity = new BookMessageEntity();
entity.setRowNumber(rs.getInt("R"));
entity.setBookId(rs.getInt("BOOK_ID"));
entity.setBookName(rs.getString("BOOK_NAME"));
entity.setBookAuthor(rs.getString("BOOK_AUTHOR"));
entity.setBookPrice(rs.getDouble("BOOK_PRICE"));
entity.setBookISBN(rs.getString("BOOK_ISBN"));
list.add(entity);
}
return list;
}
@Override
public Integer selectRowCount(Connection conn) throws SQLException {
String sql = "SELECT COUNT(*) FROM BOOK_MESSAGE";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if(rs.next()){
return rs.getInt(1);
}
return 0;
}
- 定义模型层
/**
* 获得指定位置的图书信息
*
* @param startRow
* 查询的起始
* @param endRow
* 查询的结束
* @return 返回java.util.List类型,每一项封装一行图书信息
* @throws ClassNotFoundException
* @throws SQLException
*/
public List<BookMessageEntity> selectBookMessage(Integer startRow, Integer endRow)
throws ClassNotFoundException, SQLException {
Connection conn = DbUtils.getConnection();
try {
BookMessageDAO dao = new BookMessageDAOImpl();
List<BookMessageEntity> list = dao.selectBookMessage(conn, startRow, endRow);
if (list != null) {
return list;
}
} finally {
conn.close();
}
return null;
}
/**
* 获得图书表中图书的总数
*
* @return 返回Integer类型,图书的总数
* @throws ClassNotFoundException
* @throws SQLException
*/
public Integer selectRowCount() throws ClassNotFoundException, SQLException {
Connection conn = DbUtils.getConnection();
try {
BookMessageDAO dao = new BookMessageDAOImpl();
Integer rowCount = dao.selectRowCount(conn);
return rowCount;
} finally {
}
}
- 定义控制层
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//当前页数
Integer pageNumber = null;
if ("".equals(req.getParameter("pageNumber"))) {
pageNumber = 1;
} else {
pageNumber = Integer.valueOf(req.getParameter("pageNumber"));
}
//每页显示的数量
ServletContext application = req.getServletContext();
Integer pageRowCount = Integer.valueOf(application.getInitParameter("pageRowCount"));
//每页结束的索引
Integer endRow = pageNumber * pageRowCount;
//每页开始的索引
Integer startRow = endRow - (pageRowCount-1);
//保存分页的页码按钮
int[] array = null;
//保存总的页数
Double pageCount = null;
BookMessageService service = new BookMessageService();
try {
//图书信息的总数
Integer rowCount = service.selectRowCount();
pageCount = Math.ceil(rowCount/Double.valueOf(pageRowCount));
array = new int[pageCount.intValue()] ;
for(int i = 0 ; i< pageCount.intValue();i++){
array[i] = i+1;
}
List<BookMessageEntity> list = service.selectBookMessage(startRow, endRow);
req.setAttribute("pageButtonArray", array); //保存分页按钮的信息
req.setAttribute("bookMessageList", list); //保存获得图书的信息
req.setAttribute("pageNumber", pageNumber); //保存当前页码数
req.setAttribute("pageCount", pageCount.intValue()); //保存当前页码总数
req.getRequestDispatcher("select.jsp").forward(req, resp);
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
- 视图层
- 采用EI表达式将控制层传入视图层的数动态显示
- 获取查询到的所有图书信息
- 获取根据总的图书信息数得到的分页页码数
- 为每一个分页按钮设置点击事件通过title属性保存对应的页码值,当点击a标签时,为form表单设置action属性值为selectServlet?pageNumber=当前的页码值,然后提交表单
<!-- 判断通过request范围对象传入的bookMessageList的长度是否为0,不为零进入循环 -->
<c:if test="${fn:length(requestScope.bookMessageList) > 0 }">
<!-- 每一项bookMessageList即为一个封装一行图书信息的实体类 -->
<c:forEach items = "${requestScope.bookMessageList }" var = "bookList">
<tr>
<td>${bookList.rowNumber }</td>
<td>${bookList.bookName }</td>
<td>${bookList.bookAuthor }</td>
<td>
<!-- 将价格格式化为货币 -->
<fmt:formatNumber value="${bookList.bookPrice }" type="currency" var="money"/>
${money}
</td>
<td>${bookList.bookISBN }</td>
<td>编辑</td>
<td>删除</td>
</tr>
</c:forEach>
</c:if>
<!-- 判断如果当前页为1,则去除a标签的点击事件,并设置title为1 -->
<c:if test="${requestScope.pageNumber == 1 }">
<li><a href = "#" title = "1">上一页</a></li>
</c:if>
<!-- 判断如果当前页不为1,则给a标签的添加点击事件,并设置title为当前页减去1 -->
<c:if test="${requestScope.pageNumber != 1 }">
<li><a href = "#" class = "pageHref" title = "${pageNumber - 1 }">上一页</a></li>
</c:if>
<!-- 判断保存分页按钮的数组长度是否为0,不为0进入循环 -->
<c:if test="${fn:length(requestScope.pageButtonArray) > 0 }">
<!-- 遍历数组,数组保存的即为页码数 -->
<c:forEach items = "${requestScope.pageButtonArray }" var = "buttonArray">
<li><a class = "pageHref" title = "${buttonArray}">${buttonArray}</a></li>
</c:forEach>
</c:if>
<!-- 判断当前页是否为最后一页,若是,去掉a标签的点击事件,并设置title为最后页码数 -->
<c:if test="${requestScope.pageNumber == requestScope.pageCount }">
<li><a href = "#" title = "${ requestScope.pageCount}">下一页</a></li>
</c:if>
<!-- 判断当前页是否为最后一页,若不是,给a标签的添加点击事件,并设置title为当前页码数减去1 -->
<c:if test="${requestScope.pageNumber != requestScope.pageCount }">
<li><a href = "#" class = "pageHref" title = "${pageNumber + 1 }">下一页</a></li>
</c:if>
$(function(){
$(".pageHref").click(function(){
var pageNumber = $(this).prop("title");
$("form").prop("action","selectServlet?pageNumber="+pageNumber);
$("form").submit();
return false;
});
});
- END