1.分页操作
分页的方法有多种,此处采用的方法是:先规定表格中每一页所显示的条数pageSize,然后获取用户所选中的页数currentPage,然后通过这两个参数和mysql中的limit去获取相应的数据。
(1)为了便于操作,此处编写了一个page类
import java.util.List;
public class Page {
private int currentPage;// 当前页
private int totalPage;// 总页数
private int count;// 一页多少条数据
private List<Book> books;// 当前页的图书数据
private int totalCount;// 数据总条数
//此处省略了Getters和Settesrs以及构造方法
}
(2)JSP页面主要代码
bookShow.jsp
<c:if test="${page.currentPage>1 }">
<a href="GetBook.do?getBookParam=getAllBook&page=${page.currentPage-1}">上一页</a>
</c:if>
<a href="GetBook.do?getBookParam=getAllBook&page=${1}">首页</a>
<c:forEach begin="1" end="${page.totalPage }" step="1" var="i">
<c:if test="${page.currentPage==i }">
<a href="GetBook.do?getBookParam=getAllBook&page=${i}"><font
color="#ff0000">${i}</font></a>
</c:if>
<c:if test="${page.currentPage!=i }">
<a href="GetBook.do?getBookParam=getAllBook&page=${i}">${i}</a>
</c:if>
</c:forEach>
<a href="GetBook.do?getBookParam=getAllBook&page=${page.totalPage}">末页</a>
<c:if test="${page.currentPage< page.totalPage }">
<a href="GetBook.do?getBookParam=getAllBook&page=${page.currentPage+1}">下一页</a>
</c:if>
(3)Servlet主要代码
GetBook.do
String getBookParam = request.getParameter("getBookParam");
System.out.println("获取到的getBookParam:" + getBookParam);
//获取固定页的图书信息
if ("getAllBook".equals(getBookParam)) {
int currentPage = 1;
int pageSize = 5;
String value = request.getParameter("page");
if(value!=null&&!"".equals(value)){
currentPage = Integer.parseInt(value);
}
page = bookService.getPagingBooks(currentPage, pageSize);
request.setAttribute("page", page);
request.getRequestDispatcher("bookShow.jsp?page="+currentPage).forward(request, response);
}
(4)实体类对应接口中的相关代码
BookDaoImp.java 中的getPagingBooks()
@Override
public List<Book> getPagingBooks(int currentPage, int pageSize) {
conn = DataBaseHelper.getConn();
ResultSetHandler<List<Book>> rsh = new BeanListHandler<Book>(Book.class);
String sql = "SELECT * FROM book LIMIT ?,?;";
try {
return run.query(conn, sql, rsh, (currentPage - 1) * pageSize, pageSize);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
DbUtils.close(conn);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
2、批量操作
(1)JSP页面中
在表格中增加一列,该列中的每一行都是一个多选框,每个多选框的值为对应行的ID,如:
<td><input type="checkbox" id="subcheck" name="subcheck"
value="${book.bookId}" /></td>
删除按钮:用于触发批量删除事件
JS代码:先获取所有选中的多选框,然后将它们对应的值(即ID)添加到一个JS数组中,然后将数据通过AJAX的方式传到后台进行批量删除。
<script type="text/javascript">
//批量删除
function batchDelete(){
var checkedNum = $("input[name='subcheck']:checked").length;
if(checkedNum==0){
alert("请至少选择一项!");
return false;
}
if(confirm("确定删除所选项目?")){
var checkedList = new Array();
$("input[name='subcheck']:checked").each(function(){
checkedList.push($(this).val());
});
var url = "BookController.do";
var data={"operate":"batchDelete","delitems":checkedList.toString()};
//alert("delitems:"+checkedList.toString());
//可返回三个回调函数,success(),complete(),error()
//在jQuery3.0后,要用jqXHR.done(),jqXHR.fail(),jqXHR.always()来代替
//success(),执行成功运行的回调函数
var jqxhr = $.post(url,data,success);
jqxhr.fail(function(xhr,error,throwerror){
art.dialog.tips('删除失败!');
});
}
}
</script>
(2)在具体的数据库操作中通过绑定的方式进行批量删除
// 批量删除
@Override
public boolean batchDelete(String[] bookIdStr) {
conn = DataBaseHelper.getConn();
String sql = "DELETE FROM book WHERE bookId=?";
try {
PreparedStatement pstat = conn.prepareStatement(sql);
for (int i = 0; i < bookIdStr.length; i++) {
int bookId = Integer.parseInt(bookIdStr[i]);
pstat.setInt(1, bookId);
pstat.addBatch();
}
return pstat.executeBatch() != null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
DbUtils.close(conn);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return false;
}