フロントエンドシステム2:需要分析とデータモデリング:データツールクラス、ページングツールクラスの作成、Daoデータオブジェクトアクセスクラス、(ページングモジュールのモデルのDao部分)

目次

I.概要:

2:最初に開発する必要があるのは、XmlDataSourceクラスとPageModelクラスの2つのツールクラスです。

1. XmlDataSourceクラス:xmlファイル全体をメモリに読み込みます

2. JavaBean:ペインティングクラス:データの伝送

3. PageModelクラス:ページングに使用されるクラス:

3:基礎となるツールクラスの準備ができたら:書き込みデータアクセスオブジェクトクラス:PaintingDaoクラス:

その結果、モデルのDao部分が開発されました。


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クラスは基礎となるツールクラスを呼び出し、結果を取得した後、いくつかのビジネスロジックコードを追加します(必要な場合)スレーブツールへクラスによって取得されたデータが処理され、完全なデータアクセスオブジェクトが上向きに提供されます!


その結果、モデルのDao部分が開発されました。

おすすめ

転載: blog.csdn.net/csucsgoat/article/details/114812333