SSM —— Jstl自制分页标签

下面会介绍两种用法,第一种是联合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("&nbsp&nbsp&nbsp"+"总页数:"+pageCount+"&nbsp&nbsp&nbsp总条数:"+page.getTotal());
			} else {
writer.print("<li class=\"disabled\"><a href=\"#\">" + "下一页</a></li>");
writer.print("<li class=\"disabled\"><a href=\"#\">" + "尾页</a></li>");
writer.print("&nbsp&nbsp&nbsp"+"总页数:"+pageCount+"&nbsp&nbsp&nbsp总条数:"+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 + "&amp;" + 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>

实现效果

猜你喜欢

转载自blog.csdn.net/Milan__Kundera/article/details/82821667