1. 首页 > 知识

MVC框架如何实现数据库数据的分页查询

MVC框架如何实现数据库数据的分页查询

本篇文章给大家带来的内容是介绍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应用程序被分成三个核心部件:模型、视图、控制器。
它们各自处理自己的任务。视图
视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,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。Driverjdbc。url=jdbc:mysql://localhost:3306/factoryjdbc。username=rootjdbc。password=ps123456JSP部分:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java。
sun。com/jsp/jstl/core" prefix="c" %><DOCTYPE html PUBLIC "-//W3C//DTD HTML 4。01 Transitional//EN" "http://www。w3。org/TR/html4/loose。
dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><style type="text/css">table tr td{border:1px solid black;}</style></head><body><form action="${pageContext。
request。contextPath}/listEmp">雇员姓名:<input name="ename"/><input type='submit' value="查询"/></form><table style="width:80%"><tr><td>雇员编号</td><td>雇员姓名</td><td>雇员薪水</td><td>雇员职位</td></tr><c:forEach var="tt" items="${requestScope。
pb。data}"><tr><td>${tt。empno}</td><td>${tt。ename}</td><td>${tt。sal}</td><td>${tt。
job }</td></tr></c:forEach></table><a href="listEmp?curPage=${requestScope。pb。prePage}">上一页</a> <c:forEach var="i" begin="1" end="${requestScope。
pb。totalPage}" step="1"><a href="listEmp?curPage=${i}">${i}</a></c:forEach>当前页:${requestScope。pb。curPage} 总页数是:${requestScope。
pb。totalPage} 总条数是:${requestScope。pb。total} <a href="listEmp?curPage=${requestScope。pb。nextPage}">下一页</a></body></html>第二属性类部分(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 blocke。
printStackTrace();}}}第四工具类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 nextPage=curPage+1; */private int nextPage;/** * 总共多少页数(若总条数除以每页条数有余数则页数+1) * 总条数total/每一页条数pageNum * total%pageNum==0?total/pageNum:total/pageNum+1; */private int totalPage;/** * 总共多少条 * 数据库查询 */private int total;private List<T> 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;}}第五模型层的持久层部分: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());}@Overridepublic 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;}}借口类部分: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;}第六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();@Overridepublic 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;}}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;}最后的执行效果如图:好了。
一个简易完整版的数据库表查询就完成了;。

相关推荐

  • 车贷近期有逾期影响贷款吗?

    车贷近期有逾期影响贷款吗?

    银行,贷款,用户,近期,信用,我的车贷上个月逾期了半个月,现在还想申请一笔个人的小额贷款,请问银行会不会不贷款给我?严重吗?你的逾期不是很严重,是还可以申请贷款的。如果连续几个月没有还款,经过银行催收多次后仍然不还,这样算恶意的,这样银行肯定不会贷款给你。但是不是所有的逾期都会造成不能贷款的。银行在判断用户的信用度时不只看信用记录,还看用户对银行信贷业务的参与度。所以如果您只是偶尔信用卡逾期还款,对您办理商业贷款的影响是不大的。但是如果你...

  • 2018年邮储银行贷款利率是多少啊?

    2018年邮储银行贷款利率是多少啊?

    银行,是多少,浮动,数据,央行,我想在中国邮政储蓄银行申请贷款,想问一下贷款利率是多少?有人了解吗?邮储银行贷款利率一般随着央行基准利率有所浮动的,根据邮储银行官方数据得知目前贷款利率如下:1、邮储银行房贷利率最低可达基准利率的96折,也就是4.7%左右(商业贷款基准利率4.9%)。2、个人商务贷款利率是基准利率的1.2倍,也就是5.5%左右(个人商贷基准利率是4.35%)。3、小企业贷款年利率在18%左右。4、个人消费贷款利率是基准利率...

  • 信用卡白户怎样申请无抵押能贷款?

    信用卡白户怎样申请无抵押能贷款?

    贷款,银行,信用卡,民间借贷,信用,你好,我是宁德人,从来没有申请过信用卡,是一名白户。想申请个人贷款,如何能够申请呢?要什么条件?白户指从来没有申请过信用卡和贷款的用户,你的信用记录是空白的,银行不能判断你的还款能力以及信用度。但是不是所有的白户都申请不了贷款。贷款也分很多种,银行、民间借贷和网贷是目前最常见的,其中银行是最难的,民间借贷其次,网贷则是最简单的。现在很多网贷口子的申请门槛都很低,只要有一张身份证,提供实名制手机就能成功贷...

  • 贷款28.6万是房贷,还10年,请我每月还多少?一共还多少?如果

    贷款28.6万是房贷,还10年,请我每月还多少?一共还多少?如果

    贷款,违约金,利率,数据,支付,贷款其实是有一定的公式的,只要你按照公式进行计算,再带入你的具体数额,都可以计算出你每个月需要偿还的月供以及一共需要偿还的数额,不过如果提前还款是需要一定的违约金的。如果按照最新的利率也就是5.65%进行计算,那么带入你的具体数据,贷款总额286,000.00元,还款月数120月,那么可以计算出每月还款是3,125.15元,总支付利息是89,018.21元,本息合计是375,018.21元。如果你选择第二年...

  • 如果征信贷款查询次数过多对于申请人来说是否有什么影

    如果征信贷款查询次数过多对于申请人来说是否有什么影

    贷款,有什么,信用,过多,数据,征信贷款查询次数过多会不会有什么影响,关于征信贷款查询问题?征信是贷款审批中重要的一项内容,个人的信用记录都会记录在征信报告中,作为贷款审批的一项重要数据,影响客户的贷款审批首先,如果征信数据良好,没有不良信用记录(这里包括借款、担保、信用卡等逾期记录),作为贷款审批中的征信这一项肯定会为你赢得分值。其次,如果征信数据中有不良信用记录,那么银行就会看你相关的借款、担保或者信用卡逾期金额大小和逾期时间长短,具...

  • 支付宝贷款是什么人都可以吗?需要什么条件呢?

    支付宝贷款是什么人都可以吗?需要什么条件呢?

    支付宝,贷款,条件,财富,信用,可以查看自己支付宝钱包,看看有没有借呗或者芝麻信用里有没有好期贷,如果没有就无法贷款了。支付宝贷款是有一定的条件的,如下所示:1、支付宝可以使用借呗来进行小额贷款。芝麻信用分值不低于600,若用户符合条件,只需将自己的支付宝钱包升级至最新版本,在支付宝钱包的“财富”一栏中即可使用“借呗”功能。2、借呗是蚂蚁微贷旗下的消费信贷产品,芝麻分不低于600的用户就有机会使用个人消费贷款,按照分数的不同,用户可以申请...

  • 个体用户想要申请贷款都需要具备哪些条件,具体都有什么

    个体用户想要申请贷款都需要具备哪些条件,具体都有什么

    贷款,用户,个体,条件,贷款人,个体用户想要申请贷款都需要具备哪些条件,具体都需要什么,有哪些手续?个体用户申请个人贷款是生活中变常见的事情。个人贷款在贷款人在享受贷款的权利的同时,必须承担相应的义务。贷款的种类主要有:住房贷款,消费贷款(如买车),个人经营性贷款,信用卡贷款,个人有价单证质押贷款等。其中住房贷款还包括:商业性贷款,公积金贷款,个人住房组合贷款等。个人贷款需要四个条件:第一年龄,大多数个人贷款年龄要求为满25周岁,并且在境...

  • 我在工商银行按揭房贷18万,期限25年,请每个月需要还多少

    我在工商银行按揭房贷18万,期限25年,请每个月需要还多少

    本息,期限,房贷,计算,支付,你好,我在工商银行按揭房贷18万,打算25年还清,请问每个月需要还多少钱呢?求解答。我们都知道有两种还款方式,那就是等额本息和等额本金。根据您所提供的数据,我们计算结果如下:1、等额本息:贷款总额 180,000.00 元还款月数 300 月每月还款 1,148.76 元总支付利息 164,629.33 元本息合计 344,629.33 元2、等额本金:贷款总额 180,000.00 元还款月数 300 月首...

  • 商业贷款35万,期限20年,请每月应还款多少?

    商业贷款35万,期限20年,请每月应还款多少?

    期限,贷款,计算器,本金,基准,贷款本金:35万,期限:20年,按照人行5年期以上贷款贷款本金:35万,期限:20年,按照人行5年期以上贷款基准年利率:4.90%(不变的情况下)采用采用等额本息的还款法,那么月供:2290.55。根据你所提供的数据,我们从中可以得知:贷款本金:35万,期限:20年,按照人行5年期以上贷款基准年利率:4.90%(不变的情况下)采用采用等额本息的还款法,那么月供:2290.55。如果还有不懂的话,你可以登入好...

  • 信用卡未还额度已达2万元,及时还款后,会影响办理房贷吗?

    信用卡未还额度已达2万元,及时还款后,会影响办理房贷吗?

    额度,信用卡,银行,办理,用户,信用卡未还款金额2万影响购房贷款吗? 你好,这个事很重要,不要掉以轻心啊!具体要看信用卡逾期的天数和具体的额度,以及还款的记录,如果情况严重,就不能申请到房屋贷款了。首先,银行在判断用户的信用度时,不只看信用记录还看用户的金融贡献度,也就是对银行信贷业务的参与度。从这个角度上来说,偶尔产生一两次信用卡逾期还款的用户对以后的信贷影响不大。但是如果出现连续多次逾期或未还金额较大时将被银行认定是明显恶意的行为从而...

  • 生源地助学贷款的邮箱登陆不了怎么办

    生源地助学贷款的邮箱登陆不了怎么办

    登录,发现,用户名,选择,到达,大学生生源地助学贷款是许多大学生的选择,但是却也有许多人遇到在银行申请之后难以登录邮箱的状况。一般来说这个要先需要一段时间等待激活,在激活之后如果仍然无法登陆,就要尝试其他的方法。很多大学生因为各种各样的原因所以可能会缺乏一定的资金,这样很多人就会选择办理生源地助学贷款,但是却发现出现了一个问题那就是邮箱没有办法进行登录,显示用户名不存在或者是登录密码出错已经到达上限的情况。一般来说遇到这种问题要先等待几天...

  • 自己想要贷款买车入职滴滴一行,干过的人可以给点建议吗

    自己想要贷款买车入职滴滴一行,干过的人可以给点建议吗

    贷款,平台,干过,兼职,融资,你好,我自己打算贷款买车入职滴滴一行,干过的人可以给点建议吗?求建议。可以,不过要看你是兼职还是全职啦,最好是全职吧,还是相当不错的,多一份收入呢,而且赚的钱还可以帮助还款的,同时也增加了滴滴用户的资源。在这里呢,给你点建议,贷款买车呢,你可以上网选择一些车贷平台,例如我所知道的融租e投平台,不仅可以全额融资购车,而且还款期限可以选择的余地很多,还款压力变小了呢。...