本篇文章帶給大家的內容是介紹MVC框架如何實作資料庫資料的分頁查詢。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。
此篇用MVC模式實現了分頁查詢,簡單的MVC入門例子,博客有很多全面且詳細的解釋,我摘要其中的幾段,首先有一張簡圖可以了解MVC框架的執行原理:
MVC模式(三層架構模式)
(Model-View-Controller)是軟體工程中的一種軟體架構模式,把軟體系統分成三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。
MVC模式最早由Trygve Reenskaug在1974年提出,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀80年代為程式語言Smalltalk發明的一種軟體設計模式。 MVC模式的目的是實現一種動態的程式設計,使後續對程式的修改和擴展簡化,並且使程式某一部分的重複利用成為可能。除此之外,此模式透過對複雜度的簡化,使程式結構更加直觀。軟體系統透過對自身基本部份分離的同時也賦予了各個基本部分應有的功能。專業人員可以透過自身的專長分組:
(控制器Controller)- 負責轉送請求,對請求進行處理。
(視圖View) - 介面設計人員進行圖形介面設計。
(模型Model) - 程式設計師編寫程式應有的功能(實現演算法等等)、資料庫專家進行資料管理和資料庫設計(可以實現具體的功能)。
MVC工作原理
MVC是一個設計模式,它強制性的使應用程式的輸入、處理和輸出分開。使用MVC應用程式被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務。
視圖
視圖是使用者看到並與之互動的介面。對老式的網路應用程式來說,視圖就是由HTML元素組成的介面,在新式的網路應用程式中,HTML依舊在視圖中扮演著重要的角色,但有些新的技術已層出不窮,它們包括Macromedia Flash和像XHTML,XML/XSL,WML等一些標識語言和Web services. 如何處理應用程式的介面變得越來越有挑戰性。 MVC一個大的好處是它能為你的應用程式處理很多不同的視圖。在視圖中其實沒有真正的處理發生,不管這些資料是線上儲存的還是一個僱員列表,作為視圖來講,它只是作為一種輸出資料並允許使用者操縱的方式。
模型
模型表示企業資料與業務規則。在MVC的三個部件中,模型擁有最多的處理任務。例如它可能用像EJBs和ColdFusion Components這樣的構件物件來處理資料庫。被模型回傳的資料是中立的,就是說模型與資料格式無關,這樣一個模型能為多個視圖提供資料。由於應用於模型的程式碼只需寫一次就可以被多個視圖重複使用,所以減少了程式碼的重複性。
控制器
控制器接受使用者的輸入並呼叫模型和視圖去完成使用者的需求。所以當點擊Web頁面中的超連結和發送HTML表單時,控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定呼叫哪個模型構件去處理請求,然後確定用哪個視圖來顯示模型處理傳回的資料。現在我們總結MVC的處理過程,首先控制器接收用戶的請求,並決定應該調用哪個模型來進行處理,然後模型用業務邏輯來處理用戶的請求並返回數據,最後控制器用相應的視圖格式化模型返回的數據,並透過表示層呈現給使用者。
介紹完了,接下來就分頁查詢的步驟:
還是老規矩直接上程式碼:
第一部分(導包,設定文件,JSP前端部分):
[jar套件下載位址]http://archive.apache.org/dist
#設定檔:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/factory jdbc.username=root jdbc.password=ps123456
JSP部分:
nbsp;html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <meta> <title>Insert title here</title> <style> table tr td{ border:1px solid black; } </style>
雇员编号 | 雇员姓名 | 雇员薪水 | 雇员职位 |
${tt.empno} | ${tt.ename} | ${tt.sal} | ${tt.job } |
第二屬性類別部分(Emp):
package cn.pk.entity; public class Emp { private String empno; private String ename; private String deptno; private int sal; private String job; public String getEmpno() { return empno; } public void setEmpno(String empno) { this.empno = empno; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getDeptno() { return deptno; } public void setDeptno(String deptno) { this.deptno = deptno; } public int getSal() { return sal; } public void setSal(int sal) { this.sal = sal; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } }
第三controller部分(EmpServlet):
package cn.pk.controller; import java.io.IOException; import java.sql.SQLException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.lang.StringUtils; import cn.pk.entity.Emp; import cn.pk.servlet.EmpService; import cn.pk.servlet.impl.EmpServiceImpl; import cn.pk.util.MyDbUtils; import cn.pk.util.PageBean; /** * Servlet implementation class EmpSerlvet */ @WebServlet(urlPatterns="/listEmp") public class EmpSerlvet extends HttpServlet { private EmpService service=new EmpServiceImpl(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String ename = request.getParameter("ename"); String curPage=request.getParameter("curPage"); String pageNum= request.getParameter("pageNum"); try { PageBean<emp> pb=service.queryEmp(ename, curPage, pageNum); request.setAttribute("pb", pb); request.getRequestDispatcher("/emp.jsp").forward(request, response); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }</emp>
第四工具類別Util部分:
連接資料庫:
/** * */ package cn.pk.util; import java.io.IOException; import java.util.Properties; import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; /** * @author 摸摸大白兔 *时间 2017年10月19日 下午3:55:46 * */ public class MyDbUtils { public static BasicDataSource bds=new BasicDataSource(); static { Properties p=new Properties(); try { p.load(MyDbUtils.class.getResourceAsStream("/jdbc.properties")); bds.setDriverClassName(p.getProperty("jdbc.driver")); bds.setUrl(p.getProperty("jdbc.url")); bds.setUsername(p.getProperty("jdbc.username")); bds.setPassword(p.getProperty("jdbc.password")); } catch (IOException e) { e.printStackTrace(); } } }
分頁幫助類別:
package cn.pk.util; import java.util.List; /** * 分页的帮助类 * @author 摸摸大白兔 *时间 2017年10月20日 下午2:14:26 * */ public class PageBean<t> { public void calc() { } /** * 构造方法 * @param curPage当前页 * @param pageNum每页显示的条数 * @param total总条数 */ public PageBean(int curPage,int pageNum,int total) { //计算上一页 this.prePage = curPage==1?1:curPage-1; //计算总页数 this.totalPage=total%pageNum==0?total/pageNum:total/pageNum+1; //下一页 this.nextPage=curPage==totalPage?totalPage:curPage+1; //当前页数的下标 this.startIndex=(curPage-1)*pageNum; this.total=total; this.curPage=curPage; this.pageNum=pageNum; } /** * 当前查询的默认当前页=1; * (页面传递参数) */ private int curPage; /** * 每一页的数据条数默认10条 * 页面传递的参数 */ private int pageNum=10; /** * 上一页 *根据当前页判断 *curPage=1 prePage=1; *curPage>1 prePage=curPage-1; */ private int prePage; /** * 下一页 * curPage=totalpage nextPage=totalpage; * curPage<totalpage private> data; /** * 开始的索引 * startIndex = (curPage-1)*pageNum */ private int startIndex; public int getCurPage() { return curPage; } public int getStartIndex() { return startIndex; } public void setStartIndex(int startIndex) { this.startIndex = startIndex; } public void setCurPage(int curPage) { this.curPage = curPage; } public int getPageNum() { return pageNum; } public void setPageNum(int pageNum) { this.pageNum = pageNum; } public int getPrePage() { return prePage; } public void setPrePage(int prePage) { this.prePage = prePage; } public int getNextPage() { return nextPage; } public void setNextPage(int nextPage) { this.nextPage = nextPage; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public List<t> getData() { return data; } public void setData(List<t> data) { this.data = data; } }</t></t></totalpage></t>
第五模型層的持久層部分:
package cn.pk.dao.impl; import java.sql.SQLException; import java.util.List; import java.util.Map; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.MapHandler; import org.apache.commons.lang.StringUtils; import cn.pk.dao.EmpDao; import cn.pk.entity.Emp; import cn.pk.util.MyDbUtils; /** * 模型层的持久层(数据库的sql语句) * @author 摸摸大白兔 *时间 2017年10月20日 下午1:24:12 * */ public class EmpDaoImp implements EmpDao{ public int countEmp(String ename) throws SQLException { QueryRunner qr=new QueryRunner(MyDbUtils.bds); String sql="select count(*) as myCount from newemp"; if(StringUtils.isNotEmpty(ename)) { sql+=" where ename like '%"+ename+"%'"; } Map map=(Map)qr.query(sql,new MapHandler()); return Integer.parseInt(map.get("myCount").toString()); } @Override public List<emp> queryEmp(String ename,int startIndex,int pageNum) throws SQLException { QueryRunner qr=new QueryRunner(MyDbUtils.bds); String sql="select * from newemp"; if(StringUtils.isNotEmpty(ename)) { sql+=" where ename like '%"+ename+"%'"; } sql+=" limit "+startIndex+","+pageNum; List<emp> empList = (List<emp>)qr.query(sql,new BeanListHandler(Emp.class)); return empList; } }</emp></emp></emp>
藉口類別部分:
package cn.pk.dao; import java.sql.SQLException; import java.util.List; import cn.pk.entity.Emp; public interface EmpDao { public int countEmp(String ename) throws SQLException ; List<emp> queryEmp(String name,int startIndex,int pageNum) throws SQLException; }</emp>
第六servlet部分:
package cn.pk.servlet.impl; import java.sql.SQLException; import java.util.List; import org.apache.commons.lang.StringUtils; import cn.pk.dao.EmpDao; import cn.pk.dao.impl.EmpDaoImp; import cn.pk.entity.Emp; import cn.pk.servlet.EmpService; import cn.pk.util.PageBean; public class EmpServiceImpl implements EmpService{ private EmpDao dao=new EmpDaoImp(); @Override public PageBean<emp> queryEmp(String ename,String curPage,String pageNum) throws Exception { //如果第一次没有访问当前页 if(StringUtils.isEmpty(curPage)) { curPage="1"; } if(StringUtils.isEmpty(pageNum)) { pageNum="10"; } //转换为int类型 int curPageIn =Integer.parseInt(curPage); int pageNumIn= Integer.parseInt(pageNum); int total=dao.countEmp(ename); PageBean<emp> pb=new PageBean(curPageIn,pageNumIn,total); List<emp> queryEmp = dao.queryEmp(ename,pb.getStartIndex(), pb.getPageNum()); pb.setData(queryEmp); return pb; } }</emp></emp></emp>
servlet接口类部分:
package cn.pk.servlet; import java.sql.SQLException; import java.util.List; import cn.pk.entity.Emp; import cn.pk.util.PageBean; public interface EmpService { public PageBean<emp> queryEmp(String ename, String curPage,String pageNum) throws Exception; }</emp>
最后的执行效果如图:
好了。一个简易完整版的数据库表查询就完成了;
以上是MVC框架如何實現資料庫資料的分頁查詢的詳細內容。更多資訊請關注PHP中文網其他相關文章!