设为首页 收藏本站
查看: 894|回复: 0

[经验分享] java+oracle翻页功能的实现.

[复制链接]

尚未签到

发表于 2016-8-5 15:35:47 | 显示全部楼层 |阅读模式
  这次做的项目有要求实现翻页功能.
  之前学javaee课的时候,老师曾给过翻页功能的例子,即将核心代码都写在jsp中.
  [留言板翻页功能]

<body>
<div id="main">
 <%
 Connection conn=DBConnection.getConnection();
 //创建可滚动的结果集。
 Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
 ResultSet rs=stmt.executeQuery("select * from g_guestinfo order by g_time desc");
 //移动游标至结果集的最后一行。
 rs.last();
 //得到当前行的行数,也就得到了数据库中留言的总数。
 int rowCount=rs.getRow();
 if(rowCount==0)
 {
  out.println("当前没有任何留言!");
  return;
 }
 String strCurPage=request.getParameter("page");
 //表示当前的页数。
 int curPage;
 if(strCurPage==null)
  curPage=1;
 else
  curPage=Integer.parseInt(strCurPage);
 //定义每页显示的留言数。
 int countPerPage=5;
 //计算显示所有留言需要的总页数。
 int pageCount=(rowCount+countPerPage-1)/countPerPage;
 //移动游标至结果集中指定的行。如果显示的是第一页,curPage=1,
 //游标移动到第1行。
 rs.absolute((curPage-1)*countPerPage+1);
 %>
 <%
 int i=0;
int j=rowCount-(curPage-1)*countPerPage;
 //以循环的方式取出每页要显示的数据,因为在前面针对要显示的页数,
 //调用了rs.absolute((curPage-1)*countPerPage+1);
 //所以是从游标所在的位置取出当前页要显示的数据。
while(i<countPerPage && !rs.isAfterLast())
 {%>
 <div class="g_info">
  <div class="g_head">
   <span class="spanleft">No.<%=j--%></span>
   <span class="spanleft"></span>
   <span class="g_name"><%=rs.getString("g_user")%></span>
   <span class="spanright"><a href="mailto:<%=rs.getString("g_mail") %>"><img src="img/mail.gif" border=0/></a></span>
   <span class="spanright"><a href=<%=rs.getString("g_home") %>><img src="img/home.gif" border=0/></a></span>
     </div>
  <div class="g_content">
   <p><%=rs.getString("g_content")%></p>
   </div>
  <%
  Timestamp ts=rs.getTimestamp("g_time");
  long lms=ts.getTime();
  Date date=new Date(lms);
  Time time=new Time(lms);
  %>
  <div class="g_floor">
   <span class="spanright"><a href=addel.jsp?g_id=<%=rs.getInt(1)%>>删除</a></span>
   <span class="spanright"><%out.println(date+" "+time);%></span>
  </div>
 </div>
 <%
 i++;
 rs.next();
 }
 rs.close();
 stmt.close();
 conn.close();
 %>
 <div class="g_page">
 <%
 if(curPage==1)
  {
  %>
   <span>第一页 </span>
   <span>上一页</span>
  <%
  }
 else
  {
  %>
   <span><a href="admin.jsp?page=<%=1%>">第一页</a></span>
  
   <span><a href="admin.jsp?page=<%=curPage-1%>">上一页</a></span>
  
  <%
  }
  //如果当前页是最后一页,则显示不带链接的文字,如果不是最后一页,
  //则给用户提供跳转到最后一页和下一页的链接。
  if(curPage==pageCount)
  {
  %>
   <span>下一页</span>  
   <span>最后页  </span>
  <%
  }
  else
  {
  %>
   <span><a href="admin.jsp?page=<%=curPage+1%>">下一页</a></span>
  
   <span><a href="admin.jsp?page=<%=pageCount%>">最后页</a></span>
  <%
  }
  %>
 </div>
</div>
</body>
  这样做的话,每次都要从数据库中取出所有数据,然后找到符合要求的那一页.而且这样做代码重用性不高.比如有三个模块,其中都要实现翻页功能,那么就要每一页都写这么多的代码.
  去网上搜了一些解决方案,貌似都是把操作写在类里然后调用.方法应该是这样的,但我还是看的很迷糊.
  后来进了一个人的新浪博客,汗,刚才找了半天没找着,大概的意思就是建立一个类并在其中定义一个函数.每次翻页时都访问这个类,返回相应页面的记录即可.(好像有点表述的不清楚了)...
  举例子说明:
  有三个模块:device,module,work,它们都各自有个**show.jsp的页面,其中用到翻页功能.以device为例我们可以这样做:
  deviceshow.jsp

<table id="mytable" cellspacing="0"> 
   <tr>
     <th>序号</th>
     <th>名称</th>
     <th>描述</th>
   </tr>
   <%    
     String s=request.getParameter("page");
     int gotoPage=1;
     if(s!=null)
      gotoPage=Integer.parseInt(request.getParameter("page"));
  ArrayList allUserList=PageBean.getInfo("Device",gotoPage);
  if(allUserList.size()!=0){
   for(int i=0;i<allUserList.size();i++){
    DevicetypeBean info=(DevicetypeBean)allUserList.get(i);
    %>
    <tr>
     <td><%=info.getNo() %></td>
     <td><%=info.getName() %></td>
     <%if(info.getComments()==null){%>
     <td>&nbsp;</td>
     <%}else {%>
     <td><%=info.getComments() %></td>
     <%} %>
    </tr>     
  <%
  }
 }
  %>
    <tr>
     <td colspan="5">
      <ul class="pagelist">
      <%
      for(int i=1;i<=PageBean.PageCount;i++){
       if(i==PageBean.curPage){%>
       <li class="pagecho"><%=i%></li>
        <%}else {%>
       <li><a href="PageQuery?page=<%=i%>&type=device&qname=<%=java.net.URLEncoder.encode(qname,"UTF-8")%>"><%=i%></a></li>
      <%} }
       if(PageBean.curPage!=PageBean.PageCount&&PageBean.PageCount!=0){
      %>
        <li class="nextpage"><a href="PageQuery?page=<%=PageBean.curPage+1%>&type=device&qname=<%=java.net.URLEncoder.encode(qname,"UTF-8")%>">下一页</a></li>
      <%} %>
      </ul>
      
     </td>
    </tr>
 </table>
  PageBean.java

  package beans;
  import java.util.ArrayList;
import java.sql.*;
import beans.DBConnection;
  
  public class PageBean {
 public static int curPage;
 public static int PageCount;
 public static int countPerPage=10;
 
 
 public static ArrayList getInfo(String type,int gotoPage){
  Connection conn=null;
  PreparedStatement ps=null;
  Statement st=null;
  ResultSet rs=null;
  ArrayList result=new ArrayList();
  String sql=null;
  int startrow=(gotoPage-1)*countPerPage+1;
  int endrow=startrow+countPerPage-1;
  curPage=gotoPage;
  
  String table=null;
  String torder=null;
  if(type.equals("Device")){
   table="(select * from ddpms_devicetype where name<>'原材料' and name<>'公司产品' and name<>'整机套件')";
   torder="order by no";
  }
  else if(type.equals("Module")){
   table="ddpms_productmodule";
   torder="order by no";
  }
  else if(type.equals("Work")){
   table="ddpms_workstage";
   torder="order by code";
  }
  
  try{
    conn=DBConnection.getConnection();
    if(qname==null||qname.equals("")||qname.equals("null")){
     PageCount=getRow(table);
     //sql = "SELECT * FROM "+table+" WHERE rownum <? minus SELECT * FROM "+table+" WHERE rownum <?";
     sql="select * from (select T.*,row_number() over ("+torder+") rn from "+table+" T) where rn between ? and ?";
     ps = conn.prepareStatement(sql); 
     ps.setInt(1, startrow);
     ps.setInt(2, endrow);
    }
    rs= ps.executeQuery();
       while(rs.next()){
        //依次取出每一条记录,组合成一个bean,放入ArrayList中
        DevicetypeBean dt=new DevicetypeBean();
        ModuleBean m=new ModuleBean();
        WorkBean w=new WorkBean();
        if(type.equals("Device")){
         dt.setNo(rs.getInt("no"));
         dt.setName(rs.getString("name"));
         dt.setParentid(rs.getInt("parentid"));
         dt.setComments(rs.getString("comments"));
         result.add(dt);
        }
        else if(type.equals("Module")){
         m.setNo(rs.getInt("no"));
         m.setName(rs.getString("name"));
         m.setComments(rs.getString("comments"));
         result.add(m);
        }
        else if(type.equals("Work")){
         w.setNo(rs.getInt("no"));
         w.setName(rs.getString("name"));
         w.setCode(rs.getString("code"));
         w.setComments(rs.getString("comments"));
         result.add(w);
        }
       
       }
  }catch(Exception e){
   e.printStackTrace();
  }
  finally{
   try{
    rs.close();
    ps.close();
    conn.close();
   }catch(Exception e){
    e.printStackTrace();
   }
  } 
  return result;
 }
 
 public static int getRow(String table){
  Connection conn=null;
  Statement st=null;
  ResultSet rs=null;
  int rowcount=0;
  try{
    conn=DBConnection.getConnection();
    String sql = "select * from "+table+"";
       st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);      
       rs= st.executeQuery(sql);
       rs.last();/*要先将游标移到最后才能得到getRow,否则为0*/
       rowcount=(rs.getRow()+countPerPage-1)/countPerPage;   
  }catch(Exception e){
   e.printStackTrace();
  }
  finally{
   try{
    rs.close();
    st.close();
    conn.close();
   }catch(Exception e){
    e.printStackTrace();
   }
  }
  return rowcount;
 }
 
 }

  代码大概是这样,因为掺杂了其他功能,删了一些东西,可能看起来有些乱.
  使用过程大概就是这样:
  每次翻页时都会访问pagebean中的getInfo函数,并传递页数以及模块名称,pagebean中找到符合条件的记录装入list,再由jsp页面使用.
  
  在做这部分的时候遇到了两个问题,弄了很长时间.
  1.Oracle下用rownum进行分页时排序的错乱

---排序错乱(第1~5条)
(SELECT * FROM (select * from ddpms_workstage order by ddpms_workstage.code) WHERE rownum <6) minus
 (SELECT * FROM (select * from ddpms_workstage order by ddpms_workstage.code) WHERE rownum <1)
--解决rownum错乱问题
select t2.* from (select t1.*, rownum rn from (select * from ddpms_workstage order by ddpms_workstage.code)t1 where rownum <= 5 )t2 where rn >0
---
select * from (select T.*,row_number() over (order by code) rn from ddpms_workstage T) where rn between 1 and 5;
  
  
  2.URL传中文乱码
  
URL一般是不能传送中文的,非要传只能先转下编码,到后台再解码.
 
网友回答: 建议楼主看一下api使用这两个类来处理!
URLEncoderURLDecoder
1.传递中文参数
  JSP中使用URLEncoder类,如果要在url上附带中文参数,如“笔记本电脑”,应先对中文进行url编码!
  <a href="/hello/servlet/add?id=0001&name= <%=URLEncoder.encode("笔记本电脑","UTF-8")%>&price=4000.00">*** </a>
2.接受参数参数
  servlet中接受中文参数
  String urlPar=request.getParameter("name");//(这里只是获得了url编码后的参数)
  String Par=URLDecoder.decode(urlPar,"UTF-8");//(这里获得了反编码后的参数,就是笔记本电脑这个值)
总结
  我想我已经说明白了,希望楼主理解,这里的编码为任意中文编码,但前后要一致,我一般JSP都用UTF-8进行编码!
网友回答: ~~~试了一下 上面接受时有些问题 该成这样就可以了!!!sorry!!!
2.接受参数参数
  servlet中接受中文参数
  String name=new String(request.getParameter("name").getBytes("ISO8859_1"),"UTF-8");
System.out.println(name);
 
----------------------------------------------------------------------------------------------------------------
这是在网上找到的解答,奇怪,用第二种方法不行,反倒是第一种可行.如下:
 
前台
<a href="PageQuery?
qname=<%=java.net.URLEncoder.encode(qname,"UTF-8")%>"><%=i%></a>
 
后台
String name=request.getParameter("qname");

String qname=java.net.URLDecoder.decode(name,"UTF-8");
  

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-253371-1-1.html 上篇帖子: ORACLE常用傻瓜问题1000问(之十) 下篇帖子: oracle表分区及操作脚本备忘
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表