この記事の内容は、MVC フレームワークがデータベース データのページング クエリを実装する方法を紹介することです。一定の参考値があるので、困っている友人は参考にしていただければ幸いです。
この記事では、MVC モードを使用してページング クエリを実装します。これは、単純な MVC エントリの例です。ブログには包括的で詳細な説明が多数あります。いくつかの段落を要約します。まず、理解するための簡単な図があります。 MVC フレームワークの実行原理:
MVC パターン (3 層アーキテクチャ パターン)
(モデル- View-Controller) は、ソフトウェア エンジニアリングの一種です。ソフトウェア システムを 3 つの基本部分 (モデル、ビュー、コントローラー) に分割するソフトウェア アーキテクチャ モデルです。
MVC パターンは、1974 年に Trygve Reenskaug によって最初に提案されました。これは、1980 年代に Xerox PARC によってプログラミング言語 Smalltalk 用に発明されたソフトウェア設計パターンです。 MVC パターンの目的は、動的プログラミング設計を実装し、その後のプログラムの変更と拡張を簡素化し、プログラムの特定の部分を再利用できるようにすることです。さらに、このモードは複雑さを単純化することでプログラム構造をより直感的にします。ソフトウェアシステムは基本的な部分を分離し、またそれぞれの基本的な部分に適切な機能を与えます。専門家は、それぞれの専門知識によってグループ化できます。
(コントローラー) - リクエストの転送と処理を担当します。
(表示) - インターフェイス デザイナーは、グラフィカル インターフェイスを設計します。
(モデル) - プログラマーはプログラムが持つべき機能を書き(アルゴリズムの実装など)、データベースの専門家はデータ管理とデータベースの設計を行います(特定の機能を実現できます)。
MVC の仕組み
MVC は、アプリケーションの入力、処理、出力の分離を強制する設計パターンです。 MVC を使用するアプリケーションは、モデル、ビュー、コントローラーの 3 つのコア コンポーネントに分割されます。彼らはそれぞれ独自のタスクを処理します。
View
View は、ユーザーが表示して操作するインターフェイスです。旧式の Web アプリケーションの場合、ビューは HTML 要素で構成されるインターフェイスです。新しいスタイルの Web アプリケーションでは、HTML は依然としてビュー内で重要な役割を果たしていますが、Macromedia Flash や一部のマークアップ言語など、いくつかの新しいテクノロジが際限なく登場しています。 XHTML、XML/XSL、WML などの Web サービス。アプリケーションのインターフェイスをどのように処理するかは、ますます困難になっています。 MVC の大きな利点の 1 つは、アプリケーションのさまざまなビューを処理できることです。データがオンラインで保存されているか、従業員のリストで保存されているかにかかわらず、ビューでは実際の処理は発生せず、ビューとしてはデータを出力し、ユーザーがデータを操作できるようにする手段としてのみ機能します。
モデル
モデルは企業データとビジネス ルールを表します。 MVC の 3 つのコンポーネントの中で、モデルには最も多くの処理タスクがあります。たとえば、EJB や ColdFusion コンポーネントなどのコンポーネント オブジェクトを使用してデータベースを処理する場合があります。モデルによって返されるデータはニュートラルです。これは、モデルがデータ形式とは何の関係もないことを意味するため、モデルは複数のビューにデータを提供できます。モデルに適用されるコードは 1 回記述するだけで済み、複数のビューで再利用できるため、コードの重複が削減されます。
コントローラー
コントローラーはユーザー入力を受け入れ、モデルとビューを呼び出してユーザーのニーズを満たします。そのため、Web ページ内のハイパーリンクがクリックされて HTML フォームが送信された場合、コントローラー自体は何も出力したり、処理を実行したりしません。リクエストを受信し、リクエストを処理するためにどのモデル コンポーネントを呼び出すかを決定し、モデル処理によって返されたデータを表示するためにどのビューを使用するかを決定するだけです。 MVC の処理プロセスを要約します。まず、コントローラーはユーザーのリクエストを受け取り、処理のためにどのモデルを呼び出すかを決定します。次に、モデルはビジネス ロジックを使用してユーザーのリクエストを処理し、データを返します。最後に、コントローラーはモデルの戻り値をフォーマットします。データはプレゼンテーション層を通じてユーザーに表示されます。
導入が完了したので、ページング クエリの手順に進みましょう:
まだ古いルールに従い、コードに直接進みます:
最初の部分 (ガイド パッケージ) 、設定ファイル、JSP フロントエンド部分):
[jar パッケージのダウンロード アドレス]http://archive.apache.org/dist
Configurationファイル:
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 } |
2 番目の属性クラス部分 (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; } }
3 番目のコントローラー パーツ (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>
4 番目のツール クラスユーティリティ パーツ:
データベースへの接続:
/** * */ 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>
5 番目のモデル層の永続層部分:
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>
Excuse クラス部分:
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 中国語 Web サイトの他の関連記事を参照してください。