目次
2:最初に開発する必要があるのは、XmlDataSourceクラスとPageModelクラスの2つのツールクラスです。
1. XmlDataSourceクラス:xmlファイル全体をメモリに読み込みます
3. PageModelクラス:ページングに使用されるクラス:
3:基礎となるツールクラスの準備ができたら:書き込みデータアクセスオブジェクトクラス:PaintingDaoクラス:
I.概要:
この部分は主にMVCアーキテクチャのモデルレイヤーのDao部分です。次に、このブログの特定のコンテンツはページング機能のDao部分です。
主に含まれています:
(1)XmlDataSourceクラス:xmlファイル全体をメモリに読み込むツールクラス。
(2)ペインティングクラス:エンティティエンティティクラス、油絵データを運ぶjavaBean。
(3)PageModelクラス:ツールクラス、データページングクラス。実際、このPageModelも標準のjavaBeaである必要があります。これにより、フロントデスクでJSPに挿入されたel式によって認識および取得できます。
(4)PaintingDaoクラス:完全なデータアクセスサービスを提供するデータアクセスオブジェクトクラス、サマリークラス。
2:最初に開発する必要があるのは、XmlDataSourceクラスとPageModelクラスの2つのツールクラスです。
1. XmlDataSourceクラス:xmlファイル全体をメモリに読み込みます
このプロジェクトはデータベースを使用せず、データはXMLで保存されるため、xmlファイルの読み取りと書き込みをサポートするにはDom4jが必要です。
Dom4jの内容を忘れた場合は、Dom4jを使用してXMLドキュメントを読み取り、Dom4jを使用してXMLドキュメントを書き込み(追加)し、XPathパス式を使用してXMLブログをクエリすることを参照できます。
効率を向上させるために、xmlファイルを読み書きする必要があります。Dom4jjarパッケージの導入:
このクラスの目的は、xmlファイルの内容を読み取り、xmlの内容をメモリに読み込むことです。その背後にあるのは、JavaBeanクラスオブジェクトを使用してデータを1つずつxmlに格納し、リストを使用することです。 xmlのすべてのデータを保存します。
utilsパッケージの下にXmlDataSourceクラスを作成します。
package com.imooc.mgallery.utils;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import com.imooc.mgallery.entity.Painting;
/**
* 数据源类,将xml文件解析为Java对象
*
* @author dell
*
*/
public class XmlDataSource {
// 为了保证在同一时间,内存中只有一份xml的Document对象,即为了保证加载的xml对象全局唯一
// 通过static静态关键字保证数据的全局唯一性;(自然也可以通过单例模式)
private static List<Painting> data = new ArrayList<Painting>(); // 在XmlDataSource类加载的时候,就会创建data对象,这个对象隶属于XmlDataSource类,可以保证是全局唯一;
private static String dataFile; // xml文件的地址;
static {
// 程序运行编译后,src目录下得java文件会被编译为class文件,这些class文件会被放在classes目录下,而同样处于src目录下的painting.xml文件也会放在classes目录下;
// XmlDataSource.class.getResoure()得到classes目录的根路径,然后在classes目录的根路径下找到painting.xml,然后getPath()获得painting.xml文件的完整的物理磁盘的地址;
dataFile = XmlDataSource.class.getResource("/painting.xml").getPath();
//System.out.println(dataFile);
// 如painting.xml文件的地址是:c:\new style\painting.xml;可以发现,new和style之间有一个空格,这个空格是个特殊字符;
// datFile得到painting.xml文件地址的时候,会进行base64转换,实际dataFile的值会是:c:\new%20style\painting.xml,即空格被转化成了%20;
// 但是如果在后续中,利用JavaIO对painting.xml文件按照“c:\new%20style\painting.xml”读取时,会提示路径找不到,因为%20不会被JavaIO解析;需要手动的将%20转换为空格;
// URLDecoder的作用就是:将base64转回普通的字符串;
URLDecoder decoder = new URLDecoder();
try {
dataFile = decoder.decode(dataFile, "UTF-8"); // 这个需要捕获“不支持的编码格式”异常
//System.out.println(dataFile);
SAXReader reader = new SAXReader();
Document document = reader.read(dataFile); // 需要捕获“DocumentException”异常
List<Node> nodes = document.selectNodes("/root/painting");
for(Node node:nodes) {
Element element = (Element)node;
// 提取数据,如何将数据转换成Java对象?通过什么载体来保存油画的数据?所以,需要开发对应的JavaBean承载油画数据;
String id = element.attributeValue("id");
String pname = element.elementText("pname");
//
Painting painting = new Painting();
painting.setId(Integer.parseInt(id));
painting.setPname(pname);
// 剩余几个采用紧凑的写法
painting.setCategory(Integer.parseInt(element.elementText("category")));
painting.setPrice(Integer.parseInt(element.elementText("price")));
painting.setPreview(element.elementText("preview"));
painting.setDescription(element.elementText("description"));
// 将对象存储到data集合中;
data.add(painting); // 这样以后,当XmlDataSource这个类被加载以后,data集合中就保存了完整的油画信息;
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 为了保证外部可以访问data集合,需要给data增加一个出口;;;
* 这儿添加一个方法,getRawData():即获取最原始的信息;
* @return
*/
public static List<Painting> getRawData(){
return data;
}
// public static void main(String[] args) { // 这个main方法主要目的,是测试一下
// //new XmlDataSource(); // 创建这个对象之前,需要加载XmlDataSource这个类,一旦加载这个类,那么和这个类的static块就会初始dataFile对象;
// List<Painting> list = XmlDataSource.getRawData();
// System.out.println(list);
// }
}
XmlDataSourceクラスは、以下に注意を払う必要があります。
(1) private static List <Painting> data = new ArrayList <Painting>();を使用してxmlファイルのコンテンツを格納します; private、static;次に、public static List <Painting> getRawData()、publicstaticメソッドを提供しますデータへのアクセスを提供するため。静的に設定すると、メモリ内にxmlコンテンツのコピーが1つだけになるようにすることもできます。
(2) XmlDataSource.class.getResource( "/ painting.xml")。getPath();:このメソッドは、コンパイルされたクラスディレクトリのアドレスを取得し、特定のファイルのアドレスを取得します。この使用法に注意してください。
(3) URLDecoderを使用して、base64でエンコードされた文字列を通常の文字列に変換します。
(4) xmlの読み取りは固定プロセスであり、言うことは何もありません。このビジネスの内容は単純なので、ここでのxPathは非常に単純です。
(5) JavaBeanクラスオブジェクトを使用して、データを1つずつxmlに格納します。このアプローチは従来の戦略であり、一般的であり、言うことはありません。
……………………………………………………
注釈:
……………………………………………………
2. JavaBean:ペインティングクラス:データの伝送
エンティティディレクトリにJavaBean:Paintingクラスを作成します。このクラスは単なる通常のjavaBeanであり、言うことはありません。(1)パラメータのない構造を忘れないでください。(2)属性の意味が最適です。コメントします;
package com.imooc.mgallery.entity;
/**
* 保存油画数据的JavaBean
* @author dell
*
*/
public class Painting {
private Integer id; // 油画编号
private String pname; // 名称
private Integer category; // 分类 1-现实主义,2-抽象主义;
private Integer price; // 通常在油画中,油画的价格都是整数,所以这儿价格采用Integer而不是Float;
private String preview; // 油画图片地址
private String description; // 描述
public Painting() {}
public Painting(Integer id, String pname, Integer category, Integer price, String preview, String description) {
super();
this.id = id;
this.pname = pname;
this.category = category;
this.price = price;
this.preview = preview;
this.description = description;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Integer getCategory() {
return category;
}
public void setCategory(Integer category) {
this.category = category;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public String getPreview() {
return preview;
}
public void setPreview(String preview) {
this.preview = preview;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
3. PageModelクラス:ページングに使用されるクラス:
PageModelツールクラスの主な機能は次のとおりです。ページングサービスの基本クラス。このクラスのパラメータ化された構造は非常に強力です。!!着信パラメータは次のとおりです。すべてのデータのリスト、現在のページ番号、ページあたりのレコード数;;;;取得できるもの:現在のページに表示する必要のあるレコードのコンテンツだけでなく、ページング(前のページがあるかどうか、次のページがあるかどうか、現在のページ番号など) ;この情報は、ページが表示されるときに重要です。
ある程度、PageModelクラスはページング用のさまざまな情報を格納するjavaBeanと見なすことができます。実際、このPageModelは標準のjavaBeaであるため、フロントのjspに挿入されたel式によって認識および取得できます。デスク;(コントローラー部分は後でサービス部分を呼び出すため、要求に追加されるパラメーターはPageModelタイプのオブジェクトであるため、PageModelはJavaBeanである必要があります)
utilsパッケージの下に、PageModelクラスを作成します
package com.imooc.mgallery.utils;
import java.util.ArrayList;
import java.util.List;
/**
* 分页类
* @author dell
*
*/
public class PageModel {
private int page; // 页号:当前是第几页;
private int totalPages; //总页数:一共有多少页,这个需要
private int rows; // 每页记录数:每页有几条数据;
private int totalRows; // 总记录数:原始的数据易容有多少条;totalRows/rows:就可以得到总页数了;;;
private int pageStartRow; // 当前页从第n行开始:当前页是从原始数据的第几行开始的;
private int pageEndRow; // 当前页到第n行结束:当前页的最后一条数据是原始数据的第几行;
private boolean hasNextPage; // 是否有下一页;
private boolean hasPreviousPage; //是否有上一页;
private List pageData; // 当前页的数据
public PageModel() {}
/**
* @param data:原始完整的数据;
* @param page:要查询第几页数据;
* @param rows:每一页有几条;
*/
public PageModel(List data,int page,int rows) {
this.page = page;
this.rows = rows;
totalRows = data.size();
// 总页数,向上取整;Math.ceil():作用是向上取整;Math.ceil()返回的数据类型是double,所以下面转成了int;
// 注:Math.floor():向下取整,返回的数据类型也是double类型;
// Java中如8/3 = 2;而不是2.66666;;;;(rows * 1f)的作用是把除数转成浮点数,这样(totalRows/(rows * 1f))得到的就是浮点数了;
totalPages = new Double(Math.ceil(totalRows/(rows * 1f))).intValue();
pageStartRow = (page-1)*rows; // 0
pageEndRow = page*rows; // 6
// totalRows:20 | totalPage:4 | rows:6
// pageEndRow = 4*6=24>20 执行subList会抛出下标越界异常;所以做个判断处理
if(pageEndRow > totalRows) {
pageEndRow = totalRows;
}
pageData = data.subList(pageStartRow, pageEndRow); // subList()截取,可以取到pageStartRow,取不到pageEndRow,即是左闭右开的;
if(page > 1) { // 如果当前页号大于1,存在上一页;
hasPreviousPage = true;
}else {
hasPreviousPage = false;
}
if(page < totalPages) { // 如果当前页号小于总页数,存在下一页;
hasNextPage = true;
}else {
hasNextPage = false;
}
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getTotalPages() {
return totalPages;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public int getTotalRows() {
return totalRows;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public int getPageStartRow() {
return pageStartRow;
}
public void setPageStartRow(int pageStartRow) {
this.pageStartRow = pageStartRow;
}
public int getPageEndRow() {
return pageEndRow;
}
public void setPageEndRow(int pageEndRow) {
this.pageEndRow = pageEndRow;
}
public boolean isHasNextPage() {
return hasNextPage;
}
public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
}
public boolean isHasPreviousPage() {
return hasPreviousPage;
}
public void setHasPreviousPage(boolean hasPreviousPage) {
this.hasPreviousPage = hasPreviousPage;
}
public List getPageData() {
return pageData;
}
public void setPageData(List pageData) {
this.pageData = pageData;
}
// public static void main(String[] args) {
// List sample = new ArrayList();
// for(int i=1;i<=100;i++) {
// sample.add(i);
// }
// PageModel pageModel = new PageModel(sample,6,8);
// System.out.println("当前页数据:"+pageModel.getPageData());
// System.out.println("总页数"+pageModel.getTotalPages());
// System.out.println("起始行号:"+pageModel.getPageStartRow());
// System.out.println("结束行号"+pageModel.getPageEndRow());
//
// }
}
PageModelクラスは、以下に注意を払う必要があります。
(1)このクラスは、ページング専用のツールクラスです。
(2) List.subList(index x、index y); yを取得できず、y-1のみを取得します。
(3) pageStartRow =(page-1)* rows;およびpageEndRow = page * rows;開始行と終了行の数を計算するときは、最終データをリストから取得する必要があることに注意してください。 ListのインデックスとsubList()メソッドの特性(小さな例として)は理解しやすいでしょう。
3:基礎となるツールクラスの準備ができたら:書き込みデータアクセスオブジェクトクラス:PaintingDaoクラス:
XmlDataSourceクラスとPageModel2つのツールクラスの開発が完了したら、PaintingDaoクラスを開発する必要があります。xmlの完全な元のデータ情報を取得するためにXmlDataSourceクラスを呼び出す必要があります。次に、PageModelオブジェクトを作成してデータのページング。このようにして、PaintingDaoクラスが実装されます。データのページングが完了します。次に、PaintingDaoはデータページングのページングオブジェクトをPaintingServiceに渡します。これにより、基になるデータクエリ部分が完了します。
PaintingDaoクラスを作成します。
package com.imooc.mgallery.dao;
import java.util.List;
import com.imooc.mgallery.entity.Painting;
import com.imooc.mgallery.utils.PageModel;
import com.imooc.mgallery.utils.XmlDataSource;
/**
* Dao类;调用PageModel类和XmlDataSource这个两个工具类;
* 数据访问对象类,作用是获取最原始的xml数据,并且对其进行分页;
* @author dell
*
*/
public class PaintingDao {
/**
* 实现分页的方法
* @param page 查询第几页数据;
* @param rows 每一页显示几条
* @return
*/
public PageModel pagination(int page,int rows) {
List<Painting> xmlDataSourceList = XmlDataSource.getRawData(); // 先获取xml完整的数据;
PageModel pageModel = new PageModel(xmlDataSourceList,page,rows);
return pageModel;
}
}
PaintingDaoクラスは、次の点に注意を払う必要があります。
(1) PaintingDaoクラスは最初にXmlDataSourceクラスを呼び出して、完全なxmlデータを取得します。
(2)次に、PageModelのパラメーター化された構造を呼び出して、ページングオブジェクトを取得します。ページングオブジェクトを返すだけです。
(3) PaintingDaoクラスは、完全なデータアクセスオブジェクトを提供します。Daoは、ツールクラスの呼び出しに加えて、データ要件を満たすためにデータ処理コードを追加し、取得したデータをわずかに処理してから返す場合があります。それでもその文では、基礎となるツールクラスは特定のモジュール化された特定の機能のみを完了し、ビジネスロジックの記述には参加しません。Daoクラスは基礎となるツールクラスを呼び出し、結果を取得した後、いくつかのビジネスロジックコードを追加します(必要な場合)スレーブツールへクラスによって取得されたデータが処理され、完全なデータアクセスオブジェクトが上向きに提供されます!!!