SSM + JSTL 实现条件查询+数据分页
整理一下JSTL实现条件查询及数据分页,欢迎各位批评指正,第一次写博客,废话不多说了,直接上代码。
页面代码
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<title>管理员录入</title>
<link rel="stylesheet" type="text/css" href="../../static/admin/layui/css/layui.css" />
<link rel="stylesheet" type="text/css" href="../../static/admin/css/admin.css" />
<script type="text/javascript">
// 获取page的值,并把page的值赋给Id为page的隐藏文本框
function subpage(page) {
document.getElementById("page").value=page;
subform();
}
function subform() {
document.getElementById("subform").submit();
}
</script>
</head>
<body>
<div class="page-content-wrap">
<form class="layui-form" action="/bradmin/findForSearch" method="post" id="subform">
<!-- 创建一个隐藏的page属性,通过js进行赋值,然后提交到后台 -->
<input type="hidden" id="page" name="page" value="1">
<div class="layui-form-item">
<div class="layui-inline tool-btn">
<button class="layui-btn layui-btn-small layui-btn-normal go-btn hidden-xs" data-url="/br/admin-add.jsp"><i class="layui-icon"></i></button>
<button class="layui-btn layui-btn-small layui-btn-warm listOrderBtn hidden-xs" data-url="/admin/category/listorderall.html"><i class="iconfont"></i></button>
</div>
<div class="layui-inline">
<input type="text" name="username" placeholder="请输入标题" autocomplete="off" class="layui-input">
</div>
<button class="layui-btn layui-btn-normal" type="button" onclick="subform();">搜索</button>
</div>
</form>
<div class="layui-form" id="table-list">
<table class="layui-table" lay-even lay-skin="nob">
<thead>
<tr>
<th><input type="checkbox" name="" lay-skin="primary" lay-filter="allChoose"></th>
<th>序号</th>
<th>用户名</th>
<th>密码</th>
<th>类型</th>
<th>添加时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="admin" varStatus="index">
<c:if test="${index.index%2==0}">
<tr>
<td><input type="checkbox" name="" lay-skin="primary" data-id="1"></td>
<td>${index.index + 1}</td>
<td>${admin.username}</td>
<td>${admin.password}</td>
<td>${admin.admintype}</td>
<td><fmt:formatDate pattern="yyyy-MM-dd HH:mm:ss" value="${admin.addtime}"/></td>
<td>
<div class="layui-inline">
<button class="layui-btn layui-btn-mini layui-btn-normal go-btn" data-id="1" data-url="danye-detail.html"><i class="layui-icon"></i></button>
<button class="layui-btn layui-btn-mini layui-btn-danger del-btn" data-id="1" data-url="del.html"><i class="layui-icon"></i></button>
</div>
</td>
</tr>
</c:if>
<c:if test="${index.index%2!=0}">
<tr>
<td><input type="checkbox" name="" lay-skin="primary" data-id="1"></td>
<td>${index.index + 1}</td>
<td>${admin.username}</td>
<td>${admin.password}</td>
<td>${admin.admintype}</td>
<td><fmt:formatDate pattern="yyyy-MM-dd HH:mm:ss" value="${admin.addtime}"/></td>
<td>
<div class="layui-inline">
<button class="layui-btn layui-btn-mini layui-btn-normal go-btn" data-id="1" data-url="danye-detail.html"><i class="layui-icon"></i></button>
<button class="layui-btn layui-btn-mini layui-btn-danger del-btn" data-id="1" data-url="del.html"><i class="layui-icon"></i></button>
</div>
</td>
</tr>
</c:if>
</c:forEach>
</tbody>
</table>
<!-- 数据分页开始 -->
<div class="page-wrap">
<ul class="pagination">
<!-- 上一页开始 -->
<c:if test="${pageNum>1}">
<li class="disabled"><span><a href="javascript:void(0)" onclick="subpage(${pageNum-1})">«</a></span></li>
</c:if>
<c:if test="${pageNum==1}"><li class="disabled"><span>«</span></li></c:if>
<!-- 上一页结束 -->
<%--中间页开始--%>
<%--显示6页中间页[begin=起始页,end=最大页]--%>
<%--总页数没有6页--%>
<c:choose>
<c:when test="${maxPage <= 6}">
<c:set var="begin" value="1"/>
<c:set var="end" value="${maxPage}"/>
</c:when>
<%--页数超过了6页--%>
<c:otherwise>
<c:set var="begin" value="${pageNum - 1}"/>
<c:set var="end" value="${pageNum + 3}"/>
<%--如果begin减1后为0,设置起始页为1,最大页为6--%>
<c:if test="${begin -1 <= 0}">
<c:set var="begin" value="1"/>
<c:set var="end" value="6"/>
</c:if>
<%--如果end超过最大页,设置起始页=最大页-5--%>
<c:if test="${end > maxPage}">
<c:set var="begin" value="${maxPage - 5}"/>
<c:set var="end" value="${maxPage}"/>
</c:if>
</c:otherwise>
</c:choose>
<%--遍历--%>
<c:forEach var="i" begin="${begin}" end="${end}">
<%--当前页,选中--%>
<c:choose>
<c:when test="${i == pageNum}">
<li><a href="javascript:void(0)">${i}</a></li>
</c:when>
<%--不是当前页--%>
<c:otherwise>
<li><a href="javascript:void(0)" onclick="subpage(${i})">${i}</a></li>
</c:otherwise>
</c:choose>
</c:forEach>
<!-- 中间页码结束 -->
<!-- 下一页开始 -->
<c:if test="${pageNum < maxPage}">
<li><a href="javascript:void(0)" onclick="subpage(${pageNum+1})">»</a></li>
</c:if>
<c:if test="${pageNum==maxPage}">
<li><span>»</span></li>
</c:if>
<!-- 下一页结束 -->
</ul>
</div>
<!-- 数据分也结束 -->
</div>
</div>
<script src="../../static/admin/layui/layui.js" type="text/javascript" charset="utf-8"></script>
<script src="../../static/admin/js/common.js" type="text/javascript" charset="utf-8"></script>
</body>
</html>
控制层controller代码
package com.sunchengxu.controller.br;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.sunchengxu.bean.Admin;
import com.sunchengxu.service.Iservice.IAdminService;
import com.sunchengxu.util.MD5Util;
@Controller
@RequestMapping("/bradmin")
public class AdminController {
/**
*
* @param param
* @return
* pageNum 当前页
* maxPage 满足条件的总记录数和分页的总页数
* rows 每页显示的数据条数
*
*/
@RequestMapping("/findForSearch")
public String findForSearch(@RequestParam Map<String, String> param, ModelMap map) {
// 获取当前页
String pageNum = param.get("page");
// 定义每页显示的数据条数,也可以在前台使用下拉框的形式提供显示的条数
String rows = "10";
// 将数据存储进Map集合
param.put("rows", rows);
/*
* 判断是否是首次访问,如果是首次访问则需要给当前页赋值。
* Map集合中的page属性的赋值在业务层进行
* */
if (pageNum == null) {
pageNum = "1";
}
// 条件查询返回符合条件的所有数据
List<Admin> list = adminService.findForSearch(param);
// 返回满足条件的总的数据数
Integer maxPage = adminService.findForCount(param);
// 对总记录数进行处理,根据每页显示的数据数进行计算,算出满足条件的数据的总页数
if (maxPage % 10 == 0) {
// 总记录数除以每页显示条数计算出总页数
maxPage = maxPage/10;
} else {
maxPage = maxPage/10 + 1;
}
map.put("pageNum", pageNum);
map.put("maxPage", maxPage);
map.put("list", list);
return "br/admin-list";
}
}
业务层service代码
package com.sunchengxu.service;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import com.sunchengxu.bean.Admin;
import com.sunchengxu.dao.AdminMapper;
import com.sunchengxu.dao.base.BaseMapper;
import com.sunchengxu.service.Iservice.IAdminService;
import com.sunchengxu.service.base.BaseService;
@Service
public class AdminServiceImpl {
@Autowired
private AdminMapper adminMpper;
public List<Admin> findForSearch(Map<String, String> param) {
String strpage = param.get("page");
String strrows = param.get("rows");
Integer rows = Integer.parseInt(strrows);
if (strpage == null || strpage.equals("")) {
strpage = "1";
}
Integer page = Integer.parseInt(strpage);
page = (page-1) * rows;
return adminMpper.findForSearch(param, page, rows);
}
}
数据层 dao层接口
package com.sunchengxu.dao;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.sunchengxu.bean.Admin;
import com.sunchengxu.dao.base.BaseMapper;
public interface AdminMapper {
List<Admin> findForSearch(@Param("map") Map<String, String> param,
@Param("page")Integer page,
@Param("rows")Integer rows);
int findForCount(@Param("map") Map<String, String> param);
}
到层配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sunchengxu.dao.AdminMapper">
<resultMap id="BaseResultMap" type="com.sunchengxu.bean.Admin">
<!-- WARNING - @mbggenerated This element is automatically generated by
MyBatis Generator, do not modify. -->
<id column="id" property="id" jdbcType="INTEGER" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="admintype" property="admintype" jdbcType="VARCHAR" />
<result column="addtime" property="addtime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List">
<!-- WARNING - @mbggenerated This element is automatically generated by
MyBatis Generator, do not modify. -->
id, username, password, admintype, addtime
</sql>
<select id="findForSearch" resultMap="BaseResultMap">
<!-- WARNING - @mbggenerated This element is automatically generated by
MyBatis Generator, do not modify. -->
select
<include refid="Base_Column_List" />
from lib_admin
where 1=1
<if test="map.username != null and map.username != ''">
and username like concat('%',#{map.username},'%')
</if>
<if test="map.startdate != null and map.startdate != ''">
<![CDATA[ and addtime >= #{map.startdate}]]>
</if>
<if test="map.enddate != null and map.enddate != ''">
<![CDATA[ and addtime <= concat(#{map.enddate},' 23:59:59')]]>
</if>
order by addtime DESC
limit #{page}, #{rows}
</select>
<select id="findForCount" resultType="java.lang.Integer">
<!-- WARNING - @mbggenerated This element is automatically generated by
MyBatis Generator, do not modify. -->
select
count(*)
from lib_admin
where 1=1
<if test="map.username != null and map.username != ''">
and username like concat('%',#{map.username},'%')
</if>
<if test="map.startdate != null and map.startdate != ''">
<![CDATA[ and addtime >= #{map.startdate}]]>
</if>
<if test="map.enddate != null and map.enddate != ''">
<![CDATA[ and addtime <= concat(#{map.enddate},' 23:59:59')]]>
</if>
</select>
</mapper>
实现效果图