Heim  >  Artikel  >  Backend-Entwicklung  >  Wie das MVC-Framework die Paging-Abfrage von Datenbankdaten implementiert

Wie das MVC-Framework die Paging-Abfrage von Datenbankdaten implementiert

青灯夜游
青灯夜游nach vorne
2018-10-20 17:38:343802Durchsuche

Der Inhalt dieses Artikels besteht darin, vorzustellen, wie das MVC-Framework die Paging-Abfrage von Datenbankdaten implementiert. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.

Dieser Artikel verwendet den MVC-Modus zum Implementieren von Paging-Abfragen. Der Blog enthält viele umfassende und detaillierte Erklärungen. Zunächst gibt es ein einfaches Diagramm um das Ausführungsprinzip des MVC-Frameworks zu verstehen:


Wie das MVC-Framework die Paging-Abfrage von Datenbankdaten implementiert

MVC-Muster (dreistufiges Architekturmuster)

( Model-View-Controller) ist eine Art Software-Engineering. Ein Software-Architekturmodell, das das Softwaresystem in drei grundlegende Teile unterteilt: Modell, Ansicht und Controller.

Das MVC-Muster wurde erstmals 1974 von Trygve Reenskaug vorgeschlagen. Es handelt sich um ein Software-Designmuster, das Xerox PARC in den 1980er Jahren für die Programmiersprache Smalltalk erfunden hat. Der Zweck des MVC-Musters besteht darin, ein dynamisches Programmierdesign zu implementieren, nachträgliche Änderungen und Erweiterungen des Programms zu vereinfachen und die Wiederverwendung bestimmter Programmteile zu ermöglichen. Darüber hinaus macht dieser Modus die Programmstruktur intuitiver, indem er die Komplexität vereinfacht. Das Softwaresystem trennt seine Grundteile und gibt jedem Grundteil auch die ihm zustehenden Funktionen. Fachleute können nach ihrem eigenen Fachwissen gruppiert werden:

(Controller) – Verantwortlich für die Weiterleitung von Anfragen und deren Bearbeitung.

(Ansicht) – Interface-Designer entwerfen grafische Interfaces.

(Modell) – Programmierer schreiben die Funktionen, die das Programm haben sollte (Implementierung von Algorithmen usw.), und Datenbankexperten führen die Datenverwaltung und das Datenbankdesign durch (können bestimmte Funktionen realisieren).

Funktionsweise von MVC

MVC ist ein Entwurfsmuster, das die Trennung von Eingabe, Verarbeitung und Ausgabe der Anwendung erzwingt. Anwendungen, die MVC verwenden, sind in drei Kernkomponenten unterteilt: Modell, Ansicht und Controller. Sie erledigen jeweils ihre eigenen Aufgaben.

Ansicht
Eine Ansicht ist die Schnittstelle, die Benutzer sehen und mit der sie interagieren. Bei altmodischen Webanwendungen ist die Ansicht eine Schnittstelle, die aus HTML-Elementen besteht. In Webanwendungen neuen Stils spielt HTML immer noch eine wichtige Rolle in der Ansicht, aber es sind immer wieder neue Technologien entstanden, darunter Macromedia Flash und einige Auszeichnungssprachen ​​und Webdienste wie XHTML, XML/XSL, WML usw. Der Umgang mit der Schnittstelle der Anwendung wird immer anspruchsvoller. Einer der großen Vorteile von MVC besteht darin, dass es viele verschiedene Ansichten für Ihre Anwendung verarbeiten kann. In der Ansicht findet keine echte Verarbeitung statt, unabhängig davon, ob die Daten online oder in einer Mitarbeiterliste gespeichert sind. Sie dient lediglich dazu, die Daten auszugeben und dem Benutzer die Möglichkeit zu geben, sie zu bearbeiten.

Modell
Das Modell repräsentiert Unternehmensdaten und Geschäftsregeln. Unter den drei Komponenten von MVC hat das Modell die meisten Verarbeitungsaufgaben. Es könnte beispielsweise Komponentenobjekte wie EJBs und ColdFusion-Komponenten zur Verwaltung von Datenbanken verwenden. Die vom Modell zurückgegebenen Daten sind neutral, was bedeutet, dass das Modell nichts mit dem Datenformat zu tun hat, sodass ein Modell Daten für mehrere Ansichten bereitstellen kann. Die Codeduplizierung wird reduziert, da der auf das Modell angewendete Code nur einmal geschrieben werden muss und von mehreren Ansichten wiederverwendet werden kann.

Controller
Der Controller akzeptiert Benutzereingaben und ruft Modelle und Ansichten auf, um die Anforderungen des Benutzers zu erfüllen. Wenn also auf einer Webseite auf einen Hyperlink geklickt und ein HTML-Formular gesendet wird, gibt der Controller selbst nichts aus und führt keine Verarbeitung durch. Es empfängt lediglich die Anforderung und entscheidet, welche Modellkomponente aufgerufen werden soll, um die Anforderung zu verarbeiten. Anschließend wird festgelegt, welche Ansicht zum Anzeigen der von der Modellverarbeitung zurückgegebenen Daten verwendet werden soll. Nun fassen wir den MVC-Verarbeitungsprozess zusammen. Zuerst empfängt der Controller die Anfrage des Benutzers und entscheidet, welches Modell zur Verarbeitung aufgerufen werden soll. Anschließend verarbeitet das Modell die Anfrage des Benutzers und gibt die Daten zurück mit der entsprechenden Ansicht Die Daten werden dem Benutzer über die Präsentationsschicht präsentiert.

Nachdem die Einführung abgeschlossen ist, fahren wir mit den Schritten der Paging-Abfrage fort:
Bleiben Sie bei den alten Regeln und gehen Sie direkt zum Code:
Der erste Teil (Leitfadenpaket, Konfigurationsdatei, JSP-Frontend-Teil):
Wie das MVC-Framework die Paging-Abfrage von Datenbankdaten implementiert
[JAR-Paket-Download-Adresse] http://archive.apache.org/dist

Konfigurationsdatei :

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/factory

jdbc.username=root

jdbc.password=ps123456

JSP-Teil:

    
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 }
上一页  ${i} 当前页:${requestScope.pb.curPage} 总页数是:${requestScope.pb.totalPage} 总条数是:${requestScope.pb.total}  下一页

Zweiter Attributklassenteil (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;
	}
	
}

Dritter Controller-Teil (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>

Der vierte Tool-Klasse-Util-Teil:
Mit Datenbank verbinden:

/**
 * 
 */
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();
		}
		
	}
}

Seitenhilfe Klasse:

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>

Der Persistenzschichtteil der fünften Modellschicht:

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>

Der Entschuldigungsklassenteil:

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>

最后的执行效果如图:
Wie das MVC-Framework die Paging-Abfrage von Datenbankdaten implementiert

好了。一个简易完整版的数据库表查询就完成了;

Das obige ist der detaillierte Inhalt vonWie das MVC-Framework die Paging-Abfrage von Datenbankdaten implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen