Java Web开发jsp显示高级分页效果详解
来源:互联网 发布:超级淘宝系统360118 编辑:程序博客网 时间:2024/06/08 02:43
许多网站都文章或其他类内容的分页效果,初学者对于分页的开发有时只会用代码,而没有深入了解代码编写前的业务逻辑结构,掌握好这个,我想,任何的效果的分页都能自己解决……
1、确立jsp分页的内部逻辑结构:
现在就采用标准MVC模式下的分页做简单介绍。首先数据库里我们查询了一大堆的数据,列出来一个for循环(或者直接使用标签迭代输出<logic:interate),可能数据是一行一行,在一个表格标签中显示(或许是div的嵌套),不管怎么样,拿出来的的数据要规定显示多少行,超过了要分页,我们点击下一页,或者一个页码,将请求传递给servlet(action……)进行业务处理,将处理后得到的那几行数据(也就是点击的要显示的那一页数据)在服务器中转发到那个视图显示:
request.getRequestDispatcher("xxx.jsp").forward(request, response);
servlet接受http地址的参数,通过request接受,要传递的参数主要有查询的表名,要得到的该页的页数(查询的内容更细时应该传递更多的其它参数),这些参数用于构建sql语句查询数据库中该页的内容,如下是这个处理查询一页的java类:这里为了方便操作,在bean中也放入两业务逻辑处理方法,实际应用时应该将他们打包在一个专门的java类中:
package com.xxx.bean;import java.sql.*;import java.util.Vector;import com.xxx.util.DB;/* * 肖力 * 2012-7-7 * 主要用于前台显示列表的分页 * */public class Lists {private static Connection con=null;//声明Connection引用private static Statement stat=null;//声明Statement引用private static ResultSet rs=null;//声明ResultSet引用private static int span=6; //span每页显示多少行记录private int curPage = 1; //当前页private String msgsql; //private int totalPage; private int total;public int getTotal() {return total;}public void setTotal(int total) {this.total = total;}public int getCurPage(){//得到用户当前页return this.curPage;}public void setCurPage(int curPage){//记录用户当前页this.curPage = curPage;}public void setSql(String sql){this.msgsql = sql;}public String getSql(){return this.msgsql;}public int getTotalPage(){return this.totalPage;}public void setTotalPage(int totalPage){this.totalPage = totalPage;}public static int getSpan() {return span;}public static void setSpan(int i) {span = i;}//获取要分页处理的总页数public static int getTotalPages(String sql){int totalPage=1;try{con=DB.getCon();stat=con.createStatement();rs=stat.executeQuery(sql); rs.next();int rows=rs.getInt(1);//System.out.println(rows);totalPage= rows/span; if(rows%span!=0) { totalPage++; }}catch(Exception e){e.printStackTrace();}finally{try{DB.closeCon();con.close();}catch(Exception e){e.printStackTrace();}}return totalPage;}//查询指定SQL中结果的指定页的结果集public static Vector<String[]> getPageContent(int page,String sql){Vector<String[]> vcon = new Vector<String[]>();try{con=DB.getCon();stat=con.createStatement();//执行语句得到结果集 rs = stat.executeQuery(sql); //获取结果集的元数据 ResultSetMetaData rsmt = rs.getMetaData(); //得到结果集中的总列数 int count = rsmt.getColumnCount(); int start = (page-1)*span; if(start!=0) { rs.absolute(start); }int temp=0; while(rs.next()&&temp<span) { temp++; String[] str = new String[count]; for(int i=0;i<str.length;i++) { str[i] = rs.getString(i+1); } vcon.add(str); }}catch(Exception e){e.printStackTrace();}finally{try{DB.closeCon();rs.close(); stat.close(); con.close();}catch(Exception e){e.printStackTrace();}}return vcon;}}
以上的bean中保存了这个查询的总页数,当前页码,每页显示的数目等等属性,另外的两个操作方法是静态方法,实例化该对象时可以对象直接调用,其中的数据库代理类DB这里就不写了。
2、servlet处理客服端的查询页面请求并且回应
大概步骤:接受参数;实例化List对象;构造sql语句并查询;转发结果集到前台显示;
以下是示例代码:
String table=request.getParameter("table");String ftable=request.getParameter("ftable");int curPage =Integer.parseInt(request.getParameter("curPage")); //得到该栏目的数目String sql="";//得到该类的总页数String sqlpage = "";sql="select * from "+table+" where Attribute='"+ftable+"' order by ID desc";sqlpage = "select count(*) from "+table+" where Attribute='"+ftable+"'";//获取总页数和总条数int totalpage =Lists.getTotalPages(sqlpage);int total=ProDB.getCounts(sqlpage);if(curPage==0||curPage>totalpage){curPage=1;//当上下页页数不符合规定时将当前页码数置为1}//将得到的页数和当前页码存到Bean中Lists list=new Lists();//实例化分页类list.setCurPage(curPage);list.setTotalPage(totalpage);list.setTotal(total);//得到该页的内容Vector<String[]> vlist=Lists.getPageContent(curPage,sql);if(vlist.size()==0){//没有搜索到该类问题的文章String msg= "还没有该类的列表项目!!!";request.setAttribute("msg",msg);}request.setAttribute("vlist",vlist);request.setAttribute("list",list);request.setAttribute("ftable", ftable);request.setAttribute("table",table);request.getRequestDispatcher("list.jsp").forward(request, response);
这里将查询的结果集转发到了list.jsp页面显示:以下展示list页面分页图标特殊效果。
3、关于前台分页点击效果展示
大部分网站上的分页点击效果都是只有上一页、下一页、尾页、末页、或者加入一个提交文本框编写页码展示,那就是如下的示例代码了:
<a href="ShowServlet?action=listly&curPage=1&jsp=liuyan_list" class="aaa" title="首页">首页</a> <a href="ShowServlet?action=listly&curPage=<%=curPage-1%>&jsp=liuyan_list" class="aaa" title="上一页">上一页</a> <a href="ShowServlet?action=listly&curPage=<%=curPage+1%>&jsp=liuyan_list" class="aaa" title="下一页">下一页</a> <a href="ShowServlet?action=listly&curPage=<%=totalpage%>&jsp=liuyan_list" class="aaa" title="末页">末页</a>
至于显示页码,并且页码随着页数变化而变化,就要处理一段较为复杂的业务逻辑结构,下面就此用许多scripted代码在jsp页面显示吧:
<% if (totalpage <= 4) { for (int i = 1; i <= totalpage; i++) { if (i == curPage) { %><b><u><%=i%></u>. </b><%} else {%><a href="ShowServlet?action=listly&curPage=<%=i%>&jsp=liuyan_list" title="第<%=i %>页"><%=i%></a>. <%}}%> (第<%=curPage%>/<%=totalpage%>页)<%} else {for (int i = curPage; i < curPage + 4; i++) {if (curPage == 1) {if (i == curPage) {%><b><u>1</u>. </b><%} else {%> <a href="ShowServlet?action=listly&curPage=<%=i%>&jsp=liuyan_list" title="第<%=i %>页"><%=i%></a>. <%}} else if (curPage > 1 && curPage < (totalpage - 1)) {if (i - 1 == curPage) {%> <b><u><%=i - 1%></u>. </b><%} else {%> <a href="ShowServlet?action=listly&curPage=<%=i - 1%>&jsp=liuyan_list" title="第<%=i-1 %>页"><%=i - 1%></a>. <%}} else if (curPage > 1 && curPage == totalpage - 1) {if (i - 2 == curPage) {%> <b><u><%=i - 2%></u>. </b><%} else {%> <a href="ShowServlet?action=listly&curPage=<%=i - 2%>&jsp=liuyan_list" title="第<%=i-2 %>页"><%=i - 2%></a>. <%}} else if (curPage == totalpage) {if (i - 3 == curPage) {%> <b><u><%=i - 3%></u>. </b><%} else {%> <a href="ShowServlet?action=listly&curPage=<%=i - 3%>&jsp=liuyan_list" title="第<%=i-3 %>页"><%=i - 3%></a>. <%}}}%> (第<%=curPage%>/<%=totalpage%>页)<% } %> 共 <%=total %> 条记录 </td> </tr>
只显示四个图标,可以更改代码实现更多。以上代码在jsp页面中,违背了MVC标准模式开发,有必要将它们封装,这里不详细讲述了。
效果图如下:
谢谢参观。
- Java Web开发jsp显示高级分页效果详解
- JSP 显示分页效果
- Java Web开发之详解JSP
- Java Web开发之详解JSP
- Java Web开发之详解JSP .
- Java Web开发之详解JSP
- Java jsp 分页显示数据
- java web 分页查询、显示
- jsp分页显示Java代码实现
- java-web分页操作(javaBean+Servlet+jsp)
- Java Web 之详解JSP
- java web JSP语法详解
- JSP假分页效果
- java web实现分页显示数据
- JAVA WEB开发之JSP
- 使用IntelliJ IDEA开发Java Web项目时,修改了JSP后刷新无效果问题
- Java Web开发详解
- 分页显示效果!
- 二层交换、三层交换和路由的原理及区别
- 为什么对目录不能使用硬链接
- 进程的初步认识
- Extjs所有组件
- 64位
- Java Web开发jsp显示高级分页效果详解
- 学习SAP HANA SQL 语句--像学Oracle一样学习SAP HANA
- Jam
- IEEE PDF xpress 验证字体嵌入问题[终极解决]
- redhat linux上的samba服务器配置(成功了的,找了好久好久,终于解决了,)
- window7中删除Ubuntu
- [python优化]readlines内存溢出
- U-boot移植 (v2012.04.1 S3C2440平台) (五) DM9000驱动支持,yaffs文件系统下载支持
- EXTJS组件化(一)