实现分页模糊查询的方式也有许多种,我在这里就简单介绍一种理解起来较为简单的方式。

首先,我们需要一个工具类来存储页码的相关属性,该工具类主要有以下属性:当前页(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;
        }
    }