通用分页
接上一次的博客
servlet
package com.zhangsiwen.test.action;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zhangsiwen.test.dao.StudentDao;
import com.zhangsiwen.test.entity.Student;
import com.zhangsiwen.test.util.PageBean;
public class StudentServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取参数
Student stu = new Student();
StudentDao studao = new StudentDao();
stu.setSname(req.getParameter("sname"));
//初始化分页
PageBean pageBean = new PageBean();
pageBean.setRequest(req);
req.setAttribute("pageBean", pageBean);
//后台分页查询
List<Student> student= studao.find(stu,pageBean);
req.setAttribute("student", student);
//跳转界面
req.getRequestDispatcher("/studentList.jsp").forward(req, resp);
}
}
配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>J2EE_09</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!--配置处理字符编码的监听 -->
<filter>
<filter-name>EncodingFiter</filter-name>
<filter-class>com.zhangsiwen.test.util.EncodingFiter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFiter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置studentServlet -->
<servlet>
<servlet-name>studentServlet</servlet-name>
<servlet-class>com.zhangsiwen.test.action.StudentServlet</servlet-class>
</servlet>
<!--映射Servlet -->
<servlet-mapping>
<servlet-name>studentServlet</servlet-name>
<url-pattern>/studentAction.action</url-pattern>
</servlet-mapping>
</web-app>
写一个.tld文件
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 标签库描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>Simple Tags</short-name>
<uri>/zhangsiwen</uri>
<!-- empty标签 -->
<tag>
<name>page</name>
<tag-class>com.zhangsiwen.test.tag.PageTag</tag-class>
<body-content>jsp</body-content>
<attribute>
<name>pageBean</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
page的标签助手类
package com.zhangsiwen.test.tag;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import com.zhangsiwen.test.util.PageBean;
public class PageTag extends BodyTagSupport{
private static final long serialVersionUID = 1L;
private PageBean pageBean;
public PageBean getPageBean() {
return pageBean;
}
public void setPageBean(PageBean pageBean) {
this.pageBean = pageBean;
}
@Override
public int doStartTag() throws JspException {
try {
JspWriter out= this.pageContext.getOut();
out.println(toHtml());
return SKIP_BODY;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String toHtml() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
StringBuffer sb=new StringBuffer();
//防止pagebean空指针异常
if(null==pageBean||!pageBean.isPagination()) {
return sb.toString();
}
//分页按钮
sb.append("<div style=\"text-align: center;font-size: 18px\">\r\n" +
" 当前第"+pageBean.getPage()+"页 共"+pageBean.getMaxPage()+"页 共"+pageBean.getTotal()+"条 \r\n" +
" <a href='javascript:doForward(1)'>首页</a> \r\n" +
" <a href='javascript:doForward("+pageBean.getPreviousPage()+")'>上一页</a> \r\n" +
" <a href='javascript:doForward("+pageBean.getNextPage()+")'>下一页</a> \r\n" +
" <a href='javascript:doForward("+pageBean.getMaxPage()+")'>尾页</a>\r\n" +
" <input id='numTxt' type='text' style='width:50px'>\r\n" +
" <a href='javascript:doSkip()'>GO</a>\r\n" +
" </div>");
//分页隐藏域表单 专门用来传递数据的
sb.append("<form id='pageForm' action='"+this.pageBean.getUrl()+"' method='post'>");
sb.append("<input type='hidden' name='page'>");
//从map集合中获取参数
Map<String,String[]> parameterMap= pageBean.getParameterMap();
//遍历集合
for(Map.Entry<String,String[]> entry:parameterMap.entrySet()) {
String name=entry.getKey();
String[] value=entry.getValue();
if("page".equals(name)) {//将上一次的页面抛掉
continue;//退出循环进入下一个循环
}
//遍历数组
for (int i = 0; i < value.length; i++) {
sb.append("<input='hidden' name='"+name+"' value='"+value[i]+"'>");
}
}
sb.append("</form>");
//动态拼接js
sb.append("<script type='text/javascript'>");
sb.append("function doForward(page){");
sb.append(" var f=document.getElementById('pageForm');");
sb.append(" f.page.value=page;");
sb.append(" f.submit();");
sb.append("}");
sb.append("");
sb.append("function doSkip(){");
sb.append(" var num=document.getElementById('numTxt').value;");
sb.append(" if(!num||isNaN(num)||!/^[0-9]+$/.test(num)||parseInt(num)<=0||parseInt(num)>'"+pageBean.getMaxPage()+"'){");
sb.append(" alert('请输入1-"+pageBean.getMaxPage()+"之间的整数');");
sb.append("}");
sb.append(" doForward(num);");
sb.append("}");
sb.append("</script>");
return sb.toString();
}
}
在jsp页面中调用自定义标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="z" uri="/zhangsiwen" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function doForward(page){
var f=document.getElementById('pageForm');
f.page.value=page;
f.submit();
}
function doSkip(){
var num=document.getElementById('numTxt').value;
if(!num||isNaN(num)||!/^[0-9]+$/.test(num)||parseInt(num)<=0||parseInt(num)>6){
alert("请输入1-6之间的整数");
}
doForward(num);
}
</script>
</head>
<body>
<h1>学生查询 <%= System.currentTimeMillis() %> </h1>
<form action="studentAction.action" method="post">
姓名:<input type="text" name="sname">
<input type="submit" value="查询">
</form>
<table border="1px" width="100%">
<tr>
<td>学号</td>
<td>姓名</td>
<td>年龄</td>
<td>备注</td>
<td>操作</td>
</tr>
<c:forEach items="${student}" var="s" >
<tr>
<td>${s.sid }</td>
<td>${s.sname }</td>
<td>${s.age }</td>
<td>${s.remark }</td>
<td>操作</td>
</tr>
</c:forEach>
</table>
<z:page pageBean="${pageBean }"></z:page>
</body>
</html>
运行结果:
总结:
我们在写了一遍通用分页之后,在之后需要使用到的时候就可以拿来使用。