JSP扩展自定义分页标签


JSP 扩展自定义分页标签_Jacky,Ouyang 1 JSP 扩展 制作自定义分页标签  分页标签: 当查询数据的记录很多的时候,我们通过控制每页显示的记录数来对页面显示友好性进 行控制。  显示效果: 当第一次进入到该页面的时候,显示为首页记录,比如每页显示 5 条记录。 单击下一页图片时,可以翻转到下一页 5 条记录。 也操作的过程中,也可以直接跳转到最后一页和第一页。  编码思路:  需要实现分页,首先我们需要知道在数据库中如何实现分页 SQL 语句的拼写: select top 5 emp_id,fname,minit,lname,job_id,job_lvl,pub_id,hire_date from employee where emp_id not in (select top 5 emp_id from employee order by emp_id desc) order by emp_id desc select * from (select rownum rn,isbn,title,editionnumber ,copyright,publisherid,imagefile,price from titles ) where rn > 1*5 and rn <=2*5 (Oracle) 在该 SQL 语句中,关键的代码是红色代码部分,其中 top5 是指每页可以查询的记录条 JSP 扩展自定义分页标签_Jacky,Ouyang 2 数,而主查询中的 not in 是指排除子查询中的记录条数。如果每次进行查询时,都可以有 规律的对子查询中的记录进行排除查询,那么我们就可以很快得到下一页,上一页,首页和 尾页的 5 条记录了。 注意:order by 非常重要,不管是在子查询还是在主查询中,都必须对记录进行排序, 或则,当页数发生改变时,不能准确定位到下一页的 5 条记录。  代码实现思路 利用自定义标签实现分页标签的全部思路。 分页标签要定义的几个部分: PageTag.java:TagSupport 的实现子类。 在该类的 doStartTag()方法中,我们要实现对页面分页标签的所有涉及参数初始值的设 置。这些初始值包括: //该变量存当前页码的值 String pageIndexSessionName = ""; //该变量存表的记录总数的值 String rowCountSessionName = ""; //该变量存有每页显示多少记录的值 String pageNumberSessionName = ""; //每页记录数 int pagePerNumber = 0; //表的总记录数 int pageAllNumber = 1; //当前页码 int pageCurrentIndex = 0; //首页索引 int pageFirstIndex = 0; //上一页索引 int pageUpIndex = 0; //下一页索引 int pageDownIndex = 0; //末页索引 int pageLastIndex = 0; //表的总页数 int pageShowNumber = 0; doAfterBody()方法中用输出流的方式为客户端输出标签样式,其中标签的主要实现的 HTML 代码如下:
首页   上一页   下一页   末页43 项   页 次:1/ 9
效果如下: 其中,只要我们每次提交的表单是指向同一个查询语句,我们就在页面动态的将计算好 的页面编号传递给表单提交对象。  标签已经完成,结合前面说明的数据库查询语句,我们就可以进行分页标签的使用 了。  实现环节:(全部代码)  第一步: (1)建立一个标签文件:PageTag.java,实现主要的分页数据计算,和页面分页样式的 显示功能。所有页面可以直接引用该分页标签。该类实现 TagSupport 的继承。 public class PageTag extends TagSupport (2)在类中方法之前定义需要计算的所有页面数据成员变量: //该变量存当前页码的值 String pageIndexSessionName = ""; //该变量存表的记录总数的值 String rowCountSessionName = ""; JSP 扩展自定义分页标签_Jacky,Ouyang 4 //该变量存有每页显示多少记录的值 String pageNumberSessionName = ""; //每页记录数 int pagePerNumber = 0; //表的总记录数 int pageAllNumber = 1; //当前页码 int pageCurrentIndex = 0; //首页索引 int pageFirstIndex = 0; //上一页索引 int pageUpIndex = 0; //下一页索引 int pageDownIndex = 0; //末页索引 int pageLastIndex = 0; //表的总页数 int pageShowNumber = 0; (3)在 doStartTag()方法中定义所有页面参数的初始化过程。 //读取初始参数值 public int doStartTag() throws JspException { HttpSession session = pageContext.getSession(); //当前页码的值 String currentPage = (String) session.getAttribute( "pageIndexSessionName"); if (currentPage == null || currentPage.compareTo("") == 0) { currentPage = "0"; } //转换当前页码的值给成员变量 pageCurrentIndex(当前页面) pageCurrentIndex = Integer.parseInt(currentPage); //表的记录总数 String rowCount = (String) session.getAttribute("rowCountSessionName"); if (rowCount == null || rowCount.compareTo("") == 0) { rowCount = "0"; } //转换表的总记录数的值给成员变量 pageAllNumber pageAllNumber = Integer.parseInt(rowCount); //每页页面记录数量 String perRecordNumber = (String) session.getAttribute( "pageNumberSessionName"); if (perRecordNumber == null || perRecordNumber.compareTo("") == 0) { perRecordNumber = "0"; JSP 扩展自定义分页标签_Jacky,Ouyang 5 } pagePerNumber = Integer.parseInt(perRecordNumber); //显示的页数 if (pagePerNumber == 0) { pageShowNumber = 0; } else { pageShowNumber = pageAllNumber / pagePerNumber; if (pageAllNumber % pagePerNumber != 0) { pageShowNumber++; } } if (pageShowNumber == 0) { pageShowNumber = 1; } if (pageShowNumber == 0) { pageShowNumber = 1; } //得到首页索引 pageFirstIndex = 0; //得到上一页索引 pageUpIndex = pageCurrentIndex - 1; if (pageUpIndex < 0) { pageUpIndex = 0; } //得到下一页索引 pageDownIndex = pageCurrentIndex + 1; if (pageDownIndex > pageShowNumber - 1) { pageDownIndex = pageShowNumber - 1; } if (pageDownIndex < 0) { pageDownIndex = 0; } //得到末页索引 pageLastIndex = pageShowNumber - 1; if (pageLastIndex < 0) { pageLastIndex = 0; } //返回 EVAL_BODY_INCLUDE 执行 doAfterBody()方法 return EVAL_BODY_INCLUDE; } (4)在 doAfterBody()中声明好输出的标签组件。 public int doAfterBody() throws JspException { HttpServletRequest request = (HttpServletRequest) pageContext. getRequest(); JSP 扩展自定义分页标签_Jacky,Ouyang 6 String context = request.getContextPath(); try { StringBuffer buffer = new StringBuffer(); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append("
"); buffer.append("首页  "); buffer.append("上一页 "); buffer.append(" 下一页"); buffer.append("  末页"); buffer.append(" 共 "); buffer.append(pageAllNumber); buffer.append(" 项   页次:"); buffer.append(pageCurrentIndex + 1); buffer.append("/ "); buffer.append(pageShowNumber); // buffer.append("页 跳到"); //buffer.append("页"); // buffer.append(" "); buffer.append("
"); buffer.append(""); JspWriter out = pageContext.getOut(); out.print(buffer.toString()); } catch (IOException ex) { ex.printStackTrace(); } return SKIP_BODY; }  第二步: 写完标签类后,需要为该标签类申明好配置文件。 PageTag.tld: 1.0 1.2 pagetag pagetag pagetag.PageTag jsp JSP 扩展自定义分页标签_Jacky,Ouyang 8  第三步: 分页标签写完以后,就可以对查询的代码进行分页处理了。我们分别创建一段标准的查 询代码,并让其查询结果显示在一 JSP 页面上,这个部分一共由 1 个控制器: QueryServlet.java,1 一个数据持久对象 JavaBean:Employee.java 和 1 个数据连接工厂类: DBCon.java,一对业务逻辑实现接口 QueryEmployee.java 和 QueryEmployeeImp.java (1) 数据库连接类 DBCon.java package util; import java.sql.*; public class DBCon { private Connection conn = null; private Statement stmt = null; private ResultSet rs = null; private static DBCon dbBasic; //工厂方法 public static DBCon getInstance() { if (dbBasic == null) { dbBasic = new DBCon(); } return dbBasic; } //连接数据库 private Connection getConnection() throws SQLException, ClassNotFoundException { Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); this.conn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://localhost:1433;DataBaseName=pubs", "sa", "sa"); return conn; } //查询方法 public ResultSet querySQL(String strSql) throws SQLException, ClassNotFoundException { if (conn == null) { this.getConnection(); } this.stmt = conn.createStatement(); //rs = stmt.executeQuery(strSql); return stmt.executeQuery(strSql); } public int updateResult(String strSql) throws SQLException, ClassNotFoundException { if (conn == null) { JSP 扩展自定义分页标签_Jacky,Ouyang 9 this.getConnection(); } this.stmt = conn.createStatement(); return stmt.executeUpdate(strSql); } //关闭数据库 public void closeConn() throws SQLException { if (rs != null) { rs.close(); rs = null; } if (stmt != null) { stmt.close(); stmt = null; } if (conn != null) { conn.close(); conn = null; } } } (2) 数据库持久化对象:JavaBean package model; public class Employee { private String empId; private String fName; private String minit; private String lName; private String jobId; private String jobLvl; private String pubId; private String hireDate; public Employee() { } public void setEmpId(String empId) { this.empId = empId; } public void setFName(String fName) { this.fName = fName; } public void setMinit(String minit) { this.minit = minit; } public void setLName(String lName) { JSP 扩展自定义分页标签_Jacky,Ouyang 10 this.lName = lName; } public void setJobId(String jobId) { this.jobId = jobId; } public void setJobLvl(String jobLvl) { this.jobLvl = jobLvl; } public void setPubId(String pubId) { this.pubId = pubId; } public void setHireDate(String hireDate) { this.hireDate = hireDate; } public String getEmpId() { return empId; } public String getFName() { return fName; } public String getMinit() { return minit; } public String getLName() { return lName; } public String getJobId() { return jobId; } public String getJobLvl() { return jobLvl; } public String getPubId() { return pubId; } public String getHireDate() { return hireDate; } } (3) 声明业务逻辑接口和接口实现类: QueryEmployee 接口 public interface QueryEmployee { //声明查找 Employee 的接口方法。 public ArrayList queryEmployeeList(int num); JSP 扩展自定义分页标签_Jacky,Ouyang 11 //声明查找 Employee 所有记录数的接口方法。 public String queryEmployeeAll(); } QueryEmployeeImp.java public class QueryEmployeeImp implements QueryEmployee{ DBCon dBCon = DBCon.getInstance(); /** * * @return ArrayList */ public ArrayList queryEmployeeList(int num){ //分页查询语句 /*select top 5 emp_id,fname,minit,lname,job_id,job_lvl,pub_id,hire_date from employee where emp_id not in (select top 5 emp_id from employee order by emp_id desc) order by emp_id desc */ String countSql ="select count(*) from employee"; String querySql="select top 5 emp_id,fname,minit,lname,job_id,job_lvl,pub_id,hire_date"+ " from employee where emp_id not in"+ " (select top "+num+" emp_id from employee order by emp_id desc) "+ " order by emp_id desc"; ArrayList employeeList = new ArrayList(); try { ResultSet rs = dBCon.querySQL(querySql); while (rs.next()) { Employee employee = new Employee(); employee.setEmpId(rs.getString("emp_id")); employee.setFName(rs.getString("fname")); employee.setMinit(rs.getString("minit")); employee.setLName(rs.getString("lname")); employee.setJobId(rs.getString("job_id")); employee.setJobLvl(rs.getString("job_lvl")); employee.setPubId(rs.getString("pub_id")); employee.setHireDate(rs.getString("hire_date")); employeeList.add(employee); } } catch (Exception ex) { ex.printStackTrace(); } return employeeList; } JSP 扩展自定义分页标签_Jacky,Ouyang 12 public String queryEmployeeAll(){ ArrayList alist = new ArrayList(); String count =""; try { ResultSet rs1 = dBCon.querySQL("select count(*) from employee"); while(rs1.next()){ count = rs1.getString(1); } } catch (Exception ex1) { ex1.printStackTrace(); } return count; } } (4) 数据查询中间控制器: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); //实力化业务逻辑接口实现类 QueryEmployee queryEmployee= new QueryEmployeeImp(); //得到会话中是否有当前页数的值 String pageIndexSessionName=""; int num =0; //如果没有当前页数的值,则认定为第一次提交页面,为首页 if(request.getParameter("pageIndexSessionName")!=null){ pageIndexSessionName = (String)request.getParameter("pageIndexSessionName"); num = 5*Integer.parseInt(pageIndexSessionName); } //按照分页参数到接口实现方法中进行查询 ArrayList employeeList = queryEmployee.queryEmployeeList(num); request.setAttribute("employeeList", employeeList); //查询总记录数 String count = ""; count = queryEmployee.queryEmployeeAll(); //传递分页参数:rowCountSessionName 表的总数,pageNumberSessionName 每页的显 示条数 session.setAttribute("rowCountSessionName",count); JSP 扩展自定义分页标签_Jacky,Ouyang 13 session.setAttribute("pageNumberSessionName","5"); session.setAttribute("pageIndexSessionName",pageIndexSessionName); request.getRequestDispatcher("main.jsp").forward(request,response); }
还剩12页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 2 人已下载

下载pdf

pdf贡献者

冯小庆

贡献于2012-03-14

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf