下面会介绍两种用法,第一种是联合PageHelper和逆向工程的写法,第二种是自己写映射文件
首先需要两个实体工具类
page省略get和set
public class Page<T> {
private int total; // 总条数
private int page; // 当前页
private int size; // 每页数
private List<T> rows; // 结果集
}
NavigationTag
package com.etc.utils;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
/**
* 显示格式:首页 上一页 1 2 3 4 5下一页 尾页 总页数: 总条数:
*/
public class NavigationTag extends TagSupport {
static final long serialVersionUID = 2372405317744358833L;
/**
* request 中用于保存Page<E> 对象的变量名,默认为“page”
*/
private String bean = "page";
/**
* 分页跳转的url地址,此属性必须
*/
private String url = null;
/**
* 显示页码数量
*/
private int number = 5;
@Override
public int doStartTag() throws JspException {
JspWriter writer = pageContext.getOut();
HttpServletRequest request =
(HttpServletRequest) pageContext.getRequest();
Page page = (Page) request.getAttribute(bean);
if (page == null)
return SKIP_BODY;
url = resolveUrl(url, pageContext);
try {
// 计算总页数
int pageCount = page.getTotal() / page.getSize();
if (page.getTotal() % page.getSize() > 0) {
pageCount++;
}
writer.print("<nav><ul class=\"pagination\">");
//首页链接路径
String homeUrl = append(url, "page", 1);
//末页链接路径
String backUrl = append(url, "page", pageCount);
// 显示“上一页”按钮
if (page.getPage() > 1) {
String preUrl = append(url, "page", page.getPage() - 1);
preUrl = append(preUrl, "rows", page.getSize());
writer.print("<li><a href=\"" + homeUrl + "\">" + "首页</a></li>");
writer.print("<li><a href=\"" + preUrl + "\">" + "上一页</a></li>");
} else {
writer.print("<li class=\"disabled\"><a href=\"#\">" + "首页 </a></li>");
writer.print("<li class=\"disabled\"><a href=\"#\">" + "上一页 </a></li>");
}
// 显示当前页码的前2页码和后两页码
// 若1 则 1 2 3 4 5, 若2 则 1 2 3 4 5, 若3 则1 2 3 4 5,
// 若4 则 2 3 4 5 6 ,若10 则 8 9 10 11 12
int indexPage =1;
if(page.getPage() - 2 <=0){
indexPage=1;
}else if(pageCount-page.getPage() <=2){
indexPage=pageCount-4;
}else{
indexPage= page.getPage() - 2;
}
for (int i= 1;i <= number && indexPage <= pageCount;indexPage++,i++){
if (indexPage == page.getPage()) {
writer.print("<li class=\"active\"><a href=\"#\">" + indexPage
+"<spanclass=\"sr-only\"></span></a></li>");
continue;
}
String pageUrl = append(url, "page", indexPage);
pageUrl = append(pageUrl, "rows", page.getSize());
writer.print("<li><a href=\"" + pageUrl + "\">" + indexPage + "</a></li>");
}
// 显示“下一页”按钮
if (page.getPage() < pageCount) {
String nextUrl = append(url, "page", page.getPage() + 1);
nextUrl = append(nextUrl, "rows", page.getSize());
writer.print("<li><a href=\"" + nextUrl + "\">" + "下一页</a></li>");
writer.print("<li><a href=\"" + backUrl + "\">" + "尾页</a></li>");
writer.print("   "+"总页数:"+pageCount+"   总条数:"+page.getTotal());
} else {
writer.print("<li class=\"disabled\"><a href=\"#\">" + "下一页</a></li>");
writer.print("<li class=\"disabled\"><a href=\"#\">" + "尾页</a></li>");
writer.print("   "+"总页数:"+pageCount+"   总条数:"+page.getTotal());
}
writer.print("</nav>");
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_BODY;
}
private String append(String url, String key, int value) {
return append(url, key, String.valueOf(value));
}
/**
* 为url 参加参数对儿
*/
private String append(String url, String key, String value) {
if (url == null || url.trim().length() == 0) {
return "";
}
if (url.indexOf("?") == -1) {
url = url + "?" + key + "=" + value;
} else {
if (url.endsWith("?")) {
url = url + key + "=" + value;
} else {
url = url + "&" + key + "=" + value;
}
}
return url;
}
/**
* 为url 添加翻页请求参数
*/
private String resolveUrl(String url,
javax.servlet.jsp.PageContext pageContext) throws JspException {
Map params = pageContext.getRequest().getParameterMap();
for (Object key : params.keySet()) {
if ("page".equals(key) || "rows".equals(key)){
continue;
}
Object value = params.get(key);
if (value == null){
continue;
}
if (value.getClass().isArray()) {
url = append(url, key.toString(), ((String[]) value)[0]);
} else if (value instanceof String) {
url = append(url, key.toString(), value.toString());
}
}
return url;
}
public String getBean() {
return bean;
}
public void setBean(String bean) {
this.bean = bean;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public void setNumber(int number) {
this.number = number;
}
}
commons.tld文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<!-- 指定标签库的版本号 -->
<tlib-version>2.0</tlib-version>
<!-- 指定JSP的版本号 -->
<jsp-version>1.2</jsp-version>
<!-- 指定标签库的名称 -->
<short-name>common</short-name>
<!-- 指定标签库的URI -->
<uri>http://mypageutil.com/common/</uri>
<!-- 指定标签库的显示名称 -->
<display-name>Common Tag</display-name>
<!-- 指定标签库的描述 -->
<description>Common Tag library</description>
<!-- 注册一个自定义标签 -->
<tag>
<!-- 指定注册的自定义标签名称 -->
<name>page</name>
<!-- 指定自定义标签的标签处理器类 -->
<tag-class>com.etc.utils.NavigationTag</tag-class>
<!-- 指定标签体类型 -->
<body-content>JSP</body-content>
<!-- 描述 -->
<description>create navigation for paging</description>
<!-- 指定标签中的属性 -->
<attribute>
<!-- 指定属性名称 -->
<name>url</name>
<!-- 该属性为true时表示其指定是属性为必须属性 -->
<required>true</required>
<!-- 该属性用于指定能不能使用表达式来动态指定数据,为true时表示可以 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>bean</name>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>number</name>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
第一种用法
controller
@RequestMapping("/queryAllTeacher")
public String queryAllTeacher(@RequestParam(defaultValue = "1")Integer page,
@RequestParam(defaultValue = "5")Integer rows,
HttpServletRequest request,Model model){
String keywords = request.getParameter("keywords");
Page<Teacher> teacherList = service.queryAllTeacher(page,rows,keywords);
model.addAttribute("page",teacherList);
return "admin/teacher";
}
service
public Page<Teacher> queryAllTeacher(Integer page, Integer rows,String keywords){
if(keywords == null){
keywords = "";
}
String condition = "%" + keywords + "%";
PageHelper.startPage(page,rows,true);
TeacherExample example = new TeacherExample();
example.createCriteria().andTeachernameLike(condition);
example.or().andDegreeLike(condition);
List<Teacher> teacherList = teacherMapper.selectByExample(example);
String counts = Long.toString(teacherMapper.countByExample(example));
Integer count = Integer.parseInt(counts);
Page<Teacher> teacherPage = new Page<>();
teacherPage.setPage(page);
teacherPage.setRows(teacherList);
teacherPage.setSize(rows);
teacherPage.setTotal(count);
return teacherPage;
}
实体类中添加set和get
private Integer start; // 起始行
private Integer rows; // 所取行数
jsp页面
<%@ taglib prefix="itheima" uri="http://mypageutil.com/common/" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<form action="${pageContext.request.contextPath}/admin/queryAllTeacher">
<input type="text" name="keywords">
<button type="submit"></button>
</form>
<form>
<table>
<thead>
<tr>
<th>教师编号</th>
<th>教师姓名</th>
<th>性别</th>
<th>联系电话</th>
<th>专业</th>
</tr>
</thead>
<c:forEach var="c" items="${page.rows}">
<tbody>
<tr>
<td><input type="checkbox" id="${c.id}"></td>
<td>${c.teachernum}</td>
<td>
<a href="#">${c.teachername}</a>
</td>
<td>${c.gender}</td>
<td class="am-hide-sm-only">${c.phone}</td>
<td class="am-hide-sm-only">${c.degree}</td>
</tr>
</tbody>
</c:forEach>
</table>
</form>
<div id="mypage">
<itheima:page url="${pageContext.request.contextPath}/admin/queryAllTeacher" />
</div>
第二种用法
自己写映射mapper.xml
<!--SQL片段 -->
<sql id="selectStudentListWhere">
<where>
<if test="username != null" >
username like "%"#{username}"%"
</if>
<if test="password != null" >
OR password like "%"#{password}"%"
</if>
<if test="major != null" >
OR major like "%"#{major}"%"
</if>
</where>
</sql>
<!-- 查询学生列表 -->
<select id="selectStudentList" parameterType="com.etc.entity.Student"
resultType="com.etc.entity.Student">
select id, username, password,major from t_student
<include refid="selectStudentListWhere"/>
<!-- 执行分页查询 -->
<if test="start !=null and rows != null">
limit #{start},#{rows}
</if>
</select>
<!-- 查询学生总数 -->
<select id="selectStudentListCount" parameterType="com.etc.entity.Student"
resultType="Integer">
select count(*) from t_student
<include refid="selectStudentListWhere"/>
</select>
Dao
// 学生列表
public List<Student> selectStudentList(Student student);
// 学生数
public Integer selectStudentListCount(Student student);
service实现类
public Page<Student> queryAllByJstl(Integer page, Integer rows, String username, String password) {
// 创建学生对象
Student student = new Student();
// 判断学生名称
if(StringUtils.isNotBlank(username)){
student.setUsername(username);
}
// 判断密码
if(StringUtils.isNotBlank(password)){
student.setPassword(password);
}
// 当前页
student.setStart((page-1) * rows) ;
// 每页数
student.setRows(rows);
// 查询学生列表
List<Student> students =
mapper.selectStudentList(student);
// 查询学生列表总记录数
Integer count = mapper.selectStudentListCount(student);
// 创建Page返回对象
Page<Student> result = new Page<>();
result.setPage(page);
result.setRows(students);
result.setSize(rows);
result.setTotal(count);
return result;
}
controler
@RequestMapping("/queryAllByJstl")
public String list(@RequestParam(defaultValue="1")Integer page,
@RequestParam(defaultValue="5")Integer rows,
String username,String password, Model model) {
// 条件查询所有学生
Page<Student> studentPage = service.queryAllByJstl(page, rows, username,password);
model.addAttribute("page", studentPage);
return "queryAllByJstl";
}
Student省略get和set
private Integer id;
private String username;
private String password;
private String major;
private Integer start; // 起始行
private Integer rows; // 所取行数
jsp页面引用
<%@ taglib prefix="itheima" uri="http://mypageutil.com/common/" %>
<style>
#mypage li{
float: left;
margin-left:6px;
list-style: none;
}
</style>
<form method="post">
<table>
<tr>
<th>姓名</th>
<th>密码</th>
<th>专业</th>
</tr>
<c:forEach var="c" items="${page.rows}">
<tr>
<td>${c.username}</td>
<td>${c.password}</td>
<td>${c.major}</td>
</tr>
</c:forEach>
</table>
</form>
<div id="mypage">
<itheima:page url="${pageContext.request.contextPath}/queryAllByJstl" />
</div>
实现效果