JSP頁面實現分頁功能__JSP

來源:互聯網
上載者:User

網上看了很多分頁功能的實現,有的覺得太亂,有的真心看不懂,可能是自己知識還不夠。

自己根據學的知識,封裝分頁方法,在介面內實現,供大家參考,肯定有不完善的地方,大家多多指教。

相信看過我前面幾個文章的同志都應該知道,我一般都是把方法封裝到一個Manager父類,然後其他管理類繼承,然後調用父類的方法。

由於我是把它放在一個小的練習項目裡,所以拿出給大家看的話又可能不會太完整,大家見諒。

 

一、Manager管理抽象類別:封裝了子類查詢,增刪改方法,獲得分頁數的方法(裡面的擷取connection串連方式是我之前發的串連池,大家可以去看看,我就不重複發了)

Manager類代碼如下:

 

package com.jdbc.service;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import com.jdbc.tool.DBHelper;import com.sun.corba.se.spi.orbutil.fsm.State; abstract class Manager {public abstract boolean insertInfo(Object entity);public abstract boolean deleteInfo(Object id);public abstract boolean updateInfo(Object entity);public abstract Object getAllInfoById(Object id);public abstract List getAllInfo();/** * 根據傳入的每頁行數返回分頁數 * @param tname 要分頁的表名 * @param rowcount 每頁行數 * @return 分頁數 */int getPageSize(String tname,int rowcount){Connection con=DBHelper.getConnection();if(con==null){return -1;}Statement st=null;ResultSet rs=null;try {st=con.createStatement();rs=st.executeQuery("select count(*) from "+tname);int size=-1;if(rs.next()){size=rs.getInt(1);if(size%rowcount==0){return (size/rowcount);}return (size/rowcount)+1;}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{DBHelper.closeJDBC(rs, st, con);}return -1;}/** * 用於父類 封裝 子類根據對象屬性查詢的方法 * @param tname  表名 * @param clname  要查詢的列名 * @param clvalue 傳入的列名的值 * @param cl 用於   指定 實體類  類檔案 * @return  查詢結果集封裝的資料(實體類對象集合) */ List getInfoByproperty(String tname,String[] clname,String[] clvalue,Class cl){String sql="select * from "+tname+" where 0=0 ";for (int i = 0; i < clname.length; i++) {sql+=" and "+clname[i]+"=?";}return this.getAllInfo(sql, clvalue, cl);}/** * 用於父類 封裝 增刪改 的方法,供子類調用。 * @param sql  增刪改語句 * @param args  條件值 * @param cl  用於   指定 集合中封裝的 實體類  類檔案 * @return  成功返回true 失敗返回false */boolean updateDB(String sql,String[] args){//擷取串連並判斷Connection con=DBHelper.getConnection();if(con==null){return false;}//擷取操作指令裝置,並執行sql(可賦值)PreparedStatement ps=null;try {ps=con.prepareStatement(sql);if(args!=null&&args.length>0){for (int i = 0; i < args.length; i++) {ps.setString(i+1, args[i]);}}return ps.executeUpdate()>0 ? true:false;} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{DBHelper.closeJDBC(null, ps, con);}return false;}/** * 用於父類 封裝 查詢 的方法,供子類調用。 * @param sql  查詢語句(select .......) * @param args  查詢條件值(可以為null——基本查詢) * @param cl  用於   指定 集合中封裝的 實體類  類檔案 * @return  查詢結果集封裝的資料(實體類對象集合) */List getAllInfo(String sql,String[] args,Class cl){//擷取串連並判斷Connection con=DBHelper.getConnection();//Connection con=DB_helper.getInstance().getConnection();if(con==null){return null;}//擷取操作指令裝置,並執行sql(可賦值)PreparedStatement ps=null;ResultSet rs=null;try {ps=con.prepareStatement(sql);if(args!=null){for (int i = 0; i < args.length; i++) {ps.setString(i+1, args[i]);}}rs=ps.executeQuery();//擷取 rs 的來源資料,從中得到動作表的 列數int colcount=rs.getMetaData().getColumnCount();//準備構造方法所用參數的數組,長度為 表 列數Object[] canshu=new Object[colcount];//封裝傳回值的容器List list=new ArrayList();//遍曆 所有指定 實體類的構造方法,用 參數數組去擷取 實體類 對象(如成功,則列值被封裝成 對象 屬性值)Object ob=null;//封裝傳回值的容器while(rs.next()){//將一行 表的資料 封裝到 參數數組中for (int i = 0; i < canshu.length; i++) {canshu[i]=rs.getObject(i+1);//可用於查看 Oracle資料庫對應的 java 資料類型//System.out.println(canshu[i].getClass());}//ob=getObject(cl, canshu);//如成功,則將封裝有屬性值的對象,放入 list 集合if(ob==null){return null;}//如成功,則將封裝有屬性值的對象,放入 list 集合list.add(ob);}return new ArrayList(list);} catch (Exception e) {}finally{DBHelper.closeJDBC(rs, ps, con);//DBHelper.closeJDBC(rs, ps, null);}return null;}List getAllInfoByProprety(String sql,String[] args,Class cl){return null;}/**  * 用於自動封裝 行資料成為 指定類對象的方法  * @param cl 傳進返回的實體類型  * @param canshu 進行參數匹配的數組  * @return 實體類型  */private Object getObject(Class cl,Object[] canshu){Constructor[] cons=cl.getConstructors();Object ob=null;for (int i = 0; i < cons.length; i++) {try {ob=cons[i].newInstance(canshu);return ob;} catch (Exception e) {continue;}}return null;}}


這裡我就拿教師管理類進行舉例說明,大家主要看我加註釋的分頁方法就行。

二、教師管理類繼承Manager管理類,重寫父類的抽象方法,定義自己的分頁方法,獲得總頁數方法,代碼如下:

 

package com.jdbc.service;import java.util.List;import com.jdbc.entity.ClassInfoEntity;import com.jdbc.entity.TeacherEntity;public class TeacherService extends Manager{//根據傳入每行的數目得到分頁數public int getPageSize(int rowcount){return this.getPageSize("sa.teacher", rowcount);}//根據分頁查看教師資訊public List<TeacherEntity> getAllInfoByPageSize(int pagesize,int rowcount){String sql="select * from (select * from sa.teacher where tid not in(select * from (select tid from sa.teacher where rownum<=(?-1)*? order by tid)) order by tid)where rownum<=?";String[] args=new String[]{pagesize+"",rowcount+"",rowcount+""};return this.getAllInfo(sql, args, TeacherEntity.class);}@Overridepublic boolean deleteInfo(Object id) {String sql="delete from sa.teacher where tid=?";String[] args=new String[]{id+""};return this.updateDB(sql, args);}@Overridepublic List getAllInfo() {String sql="select * from sa.teacher";return this.getAllInfo(sql, null, TeacherEntity.class);}@Overridepublic TeacherEntity getAllInfoById(Object id) {String sql="select * from sa.teacher where tid=?";String[] args=new String[]{id+""};List<TeacherEntity> list=this.getAllInfo(sql, args, TeacherEntity.class);return (list!=null&&list.size()>0) ? list.get(0):null;}@Overridepublic boolean insertInfo(Object entity) {TeacherEntity t=(TeacherEntity) entity;String sql="insert into sa.teacher values(?,?,?)";String[] args=new String[]{t.getTid()+"",t.getTname(),t.getTage()+""};return this.updateDB(sql, args);}@Overridepublic boolean updateInfo(Object entity) {TeacherEntity t=(TeacherEntity) entity;String sql="update sa.teacher set tname=?,tage=? where tid=?";String[] args=new String[]{t.getTname(),t.getTage()+"",t.getTid()+""};return this.updateDB(sql, args);}}


這裡重點說一下sql語句:

select * from (select * from sa.teacher where tid not in(select * from (select tid from sa.teacher where rownum<=(?-1)*? order by tid)) order by tid)where rownum<=?

可能還有的看不太明白這個語句就是負責實現頁數的劃分,子查詢比較多,大家仔細看看就明白了。

 

 

三、我最後通過寫的schoolManager實現業務的操作,具體是調用教師管理類,學生管理類,班級管理類的的方法。這裡只給大家列出教師的業務操作方法:

大家主要看我加註釋的分頁方法就行。

 

package com.jdbc.manager;import java.math.BigDecimal;import java.util.List;import com.jdbc.entity.TeacherEntity;import com.jdbc.service.TeacherService;public class SchoolManager {private static TeacherService teacherManager=new TeacherService();/** * 添加新教師資訊 * @param entity 新增老師的實體 * @return 成功返回true,失敗返回false */public static boolean addNewTeacherInfo(Object entity){return teacherManager.insertInfo(entity);}public static boolean delTeacherInfoById(Object id){return teacherManager.deleteInfo(id);}public static boolean updTeacherInfo(Object entity){return teacherManager.updateInfo(entity);}public static TeacherEntity getTeacherInfoById(Object id){return teacherManager.getAllInfoById(id);}public static List<TeacherEntity> getAllTeacherInfo(){return teacherManager.getAllInfo();}//通過傳入的頁數和每行顯示的數目來進行資訊的顯示public static List<TeacherEntity> getAllTeacherInfoByPageSize(int pagesize,int rowcount){return teacherManager.getAllInfoByPageSize(pagesize, rowcount);}//根據每行顯示的數量獲得分頁數public static int getTeacherPagesize(int rowcount){return teacherManager.getPageSize(rowcount);}}


 

 

四、在介面中調用schoolManager業務管理類進行操作,介面的代碼如下:

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@page import="com.jdbc.entity.StudentEntity"%><%@page import="com.jdbc.manager.SchoolManager"%><%@page import="com.jdbc.entity.UserInfoEntity"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>My JSP 'studentManager.jsp' starting page</title>    <meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--  <link rel="stylesheet" type="text/css" href="../WEB-CSS/styles.css">--><script type="text/javascript" src="WEB-JS/tx.js"></script>  </head>    <body>     <%     int rowcount=6;     int pagesize=1;     int sizemax=SchoolManager.getStudentPagesize(rowcount);     String ps=request.getParameter("ps");     if(ps!=null){     pagesize=Integer.parseInt(ps);     if(pagesize<1){     pagesize=1;     }     if(pagesize>sizemax){     pagesize=sizemax;     }     }    UserInfoEntity user=(UserInfoEntity)session.getAttribute("user");String caozuo="style='display: block'";if(user.getUsertype().getUtid().intValue()==2){caozuo="style='display: none'";}List<StudentEntity> list=SchoolManager.getAllStudentInfoByPageSize(pagesize,rowcount); %>    <table align="center" cellspacing="0px" style="font-size:16px; width:80%; text-align: center;border: 1px;border-style: double;border-color: #998866;">     <tr style="background-color: #998866;height: 30px;">       <td>學號</td>       <td>姓名</td>       <td>性別</td>       <td>入學日期</td>       <td>所在班級</td>       <td <%=caozuo%>>資料操作</td>     </tr>     <tr >     <td colspan="6"></td>     </tr>     <%for(int i=0;i<list.size();i++) {     StudentEntity st=list.get(i); %>     <tr style="height: 30px;background-color: #ffffff" onmouseover="texiao(this,'#eeddff')" onmouseout="texiao(this,'#ffffff')">     <td><%=st.getStid() %></td>     <td><%=st.getStname() %></td>     <td><%if(st.getStsex().intValue()==1) {%>     <%="男" %>     <%}else {%>     <%="女" %>     <%} %>     </td>     <td><%=st.getStdate() %></td>     <td><%=st.getClassinfo().getCltitle() %></td>     <td <%=caozuo%>><a href="javascript:xiugai('<%=st.getStid() %>')">update</a>      <a href="javascript:shanchu('<%=st.getStid() %>')">delete</a>           <a href="InforManager/addStudent.jsp">insert</a>     </td>          </tr>     <%} %>         </table>    <br/>    <div style="text-align: center;color: #789789">    <a href="InforShow/studentManager.jsp?ps=1">首頁</a>               <a href="InforShow/studentManager.jsp?ps=<%=pagesize-1 %>">上一頁</a>               <a href="InforShow/studentManager.jsp?ps=<%=pagesize+1 %>">下一頁</a>               <a href="InforShow/studentManager.jsp?ps=<%=sizemax %>">尾頁</a>              </div>    <br/>  </body>  <script type="text/javascript">  function shanchu(id){if(window.confirm("你確定要刪除學號為 "+id+" 的資訊。"))window.location.href="../stuservlet?caozuo=del&stid="+id;}  function xiugai(id){window.location.href="../InforManager/updStudent.jsp?id="+id;  }  </script>  </html>


 

其實分頁沒這麼複雜,可能主要是我抽象出方法,分層的緣故讓大家看的有些繞,但我相信仔細認真看看你會明白的。

歡迎大家多給我提意見,協助我,一起進步,謝謝。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.