实现分页模糊查询的方式也有许多种,我在这里就简单介绍一种理解起来较为简单的方式。
首先,我们需要一个工具类来存储页码的相关属性,该工具类主要有以下属性:当前页(currentPage)、每页大小(pageSize)、总页数(pageTotal)、数据总数(recordTotal)、每页的内容(content)。
注意:
1、每页的内容(content)需要添加泛型,以便其可以接收任何类型的数据。
2、总页数(pageTotal)通过数据总数与每页大小计算得出。
pageTotal = ((recordTotal%pageSize)==0)?(recordTotal/pageSize):((recordTotal/pageSize)+1) ;
JSP页面传递参数
在JSP页面中通过form表单向后台方法传递参数。
以用户管理的代码 为例:
<form action="/admin" method="post" style="background-color: white">
<input name="method" value="limitSelect" hidden>
用户名:<input type="text" name="userName" id="userName" value="${userName}">
性别:<input type="radio" name="userGender"
<c:if test="${userGender=='男'}">checked</c:if> value="男">男
<input type="radio" name="userGender"
<c:if test="${userGender=='女'}">checked</c:if> value="女">女
权限:<select id="rid" name="rid">
<option name="rid" value="0">--请选择--</option>
</select>
<button>查询</button>
</form>
注:
性别通过radio单选框输入数据
权限通过下拉框输入数据
点击“查询”按钮之后,选中的数据被提交到对应的“admin”方法中。
在后台使用request.getParameter(" 对应的name ")方法来获取前台页面传来的数据。
将选中的数据全部获取到之后,定义一个方法来进行分页模糊查询,
public List getStudentList(Page page, String stuNo, String stuName, String stuGender){}
该方法需要传递的参数有获取到的数据与Page工具类的实例化对象page。(获取到的数据为在dao层中进行模糊查询的参数、page为处理分页时的开始数据条数与每页显示的数据大小)。
在方法中,需要使用动态sql的方式来进行查询,此时就需要注意参数状态的判断。
JDBC中sql拼接的部分代码
String sql = "select *,c.name cname from tb_student st left join tb_class c on st.cid=c.id where 1=1";
//判断stuName是否需要进行拼接
if (stuName != null && stuName != "") {
sql += " and st.student_name like '%" + stuName + "%'";
}
//判断stuGender 是否需要拼接
if (stuGender != null && stuGender != "") {
sql += " and st.gender=" + stuGender;
}
//判断stuCid 是否需要拼接
if (stuCid != null && stuCid != "") {
sql += " and st.cid=" + stuCid;
}
sql += " limit ?,?"; //对分页的处理
pre.setInt(1, (page.getCurrentPage() - 1) * page.getPageSize()); //开始数据
pre.setInt(2, page.getPageSize()); //每页大小
当参数为 null 或是 “” 时,不参与sql的拼接。
模糊查询拼接sql时一定要注意引号。
将查询到的结果返回,修改为page中content的值。
查询模糊分页的总记录数。同样是将上面获取到的数据作为参数,使用动态sql的方式进行查询,不同的是,查询总记录数不再需要limit分页。
本方法与上方sql拼接的代码相似,就不再继续重复了。
将page中的recordTotal属性赋值为获取到的总计记录数。
将page与从前台获取到的数据重新返回到JSP页面,以便于数据回显。
模糊查询数据回显
此部分内容是为了在用户点击查询之后,将用户查询的条件保留到新的查询页面。
$("#stuName").val("${stuName}");
$("[name='stuGender']").each(function (index,gender) {
if ($(this).val() == "${stuGender}") {
$(this).attr("checked", true)
}
});
$("#stuCid").val("${stuCid}");
页码处理
此部分内容实现了点击上一页、下一页、首页、尾页按钮之后,更改查询到的数据。在这里我将所有的操作都归置到了一起。
点击按钮需要进行的操作
<li class="previous"><button onclick="getStudentList(1)" class="btn btn-sm btn-outline-primary" <c:if test="${page.currentPage <= 1}">disabled</c:if> >首页</button></li>
<li class="previous"><button onclick="getStudentList(${page.currentPage - 1})" class="btn btn-sm btn-outline-primary" <c:if test="${page.currentPage <= 1}">disabled</c:if> >上一页</button></li>
<li class="">当前第${page.currentPage}页</li>
<li class="next"><button onclick="getStudentList(${page.currentPage + 1})" class="btn btn-sm btn-outline-primary" <c:if test="${page.currentPage >= page.pageTotal}">disabled</c:if>>下一页</button></li>
<li class="next"><button onclick="getStudentList(${page.pageTotal})" class="btn btn-sm btn-outline-primary" <c:if test="${page.currentPage >= page.pageTotal}">disabled</c:if> >尾页</button></li>
<li class="">共${page.pageTotal}页/共${page.recordTotal}条数据</li>
点击按钮操作后,与之相对应的参数处理
// 首页 上一页 下一页 尾页
function getStudentList(currentPage) {
if ("${stuNo}" != "" || "${stuName}" != "" || "${stuGender}" != "" || "${stuCid}" != "") { // 模糊查询
$("[name=\"currentPage\"]").val(currentPage);
$("#selectForm").submit();
}else {
window.location.href = "${pageContext.request.contextPath}/admin/adminStudentUrl?currentPage=" + currentPage;
}
}