命名規范
- 包:所有單詞的字母小寫,如 org.nemo.demo
- 常量:所有單詞的字母大寫,如 FLAG
- 類:所有單詞的首字母大寫,如 TestJava
- 屬性:第一個單詞的首字母小寫,之后每個單詞的首字母大寫,如 studentName
- 方法:第一個單詞的首字母小寫,之后每個單詞的首字母大寫,如 getInfo()
Java包的命名規則
- util:對應英文utility(實用工具),一般存放工具類,就像java.lang.util包一樣存放着各種各樣的工具類方便你編程,這里你可以放自己寫好的工具類為自己的程序提供方便。
- business:一般存放業務類,處理程序業務的功能類就放在這里。
- control:一般存放控制類,后台控制的一些類就放在這里,例如J2EE里的Servlet。
dao:對應英文Data Access Object,數據訪問對象,一般存放與數據庫(文本、Excel等)打交道的類,只關心數據庫的增刪改查。
用於操作的封裝。
vo:對應英文Value Object,值對象,一般存放實體(Model)。
vo表示value object,主要實現數據的封裝,常與數據庫中一個表或視圖相對應。
該類的實現基本上是一個固定的模板,因此很多建模工具(如rose等)能夠根據數據庫中的表和視圖自動生成該文件,此過程稱為“反向工程”。driver:一般存放驅動類,一般顯示菜單,調用dao等包中的方法來驅動程序。一般擁有在其中使用方法的主方法。
Object 划分
- PO(persistent object)持久對象
PO 就是對應數據庫中某個表中的一條記錄,多個記錄可以用 PO 的集合。PO 中應該不包含任何對數據庫的操作。 - DO (Domain Object)領域對象
就是從現實世界中抽象出來的有形或無形的業務實體。 - TO(Transfer Object)數據傳輸對象
不同的應用程序之間傳輸的對象 - DTO (Data Transfer Object)數據傳輸對象
這個概念來源於 J2EE 的設計模式,原來的目的是為了 EJB 的分布式應用提供粗粒度的數據實體,以減少分布式調用的次數,從而提高分布式調用的性能和降低網絡負載,但在這里,泛指用於展示層與服務層之間的數據傳輸對象。 - VO(Value Object)值對象
通常用於業務層之間的數據傳遞,和 PO 一樣也是僅僅包含數據而已。但應是抽象出的業務對象,可以和表對應,也可以不和表對應,這根據業務的需要。用 new 關鍵宇創建,由 GC 回收的。
View Object:視圖對象;
接受頁面傳遞來的數據,封裝對象
將業務處理完成的對象,封裝成頁面要用的數據 - BO(Business Object)業務對象
從業務模型的角度看,見 UML 元件領域模型中的領域對象。封裝業務邏輯的 Java 對象,通過調用 DAO 方法,結合 PO、VO 進行業務操作。Business Object:業務對象主要作用是把業務邏輯封裝為一個對象。這個對象可以包括一個或多個其它的對象。比如一個簡歷,有教育經歷、工作經歷、社會關系等等。我們可以把教育經歷對應一個 PO,工作經歷對應一個 PO,社會關系對應一個 PO。建立一個對應簡歷的 BO 對象處理簡歷,每個 BO 包含這些 PO。這樣處理業務邏輯時,我們就可以針對 BO 去處理。 - POJO(Plain Ordinary Java Object)簡單無規則 Java 對象
傳統意義的 Java 對象。就是說在一些 Object/Relation Mapping 工具中,能夠做到維護數據庫表記錄的 Persisent Object 完全是一個符合JavaBean 規范的純 Java 對象,沒有增加別的屬性和方法。我的理解就是最基本的 JavaBean,只有屬性字段及 setter 和 getter 方法!
POJO 是 DO/DTO/BO/VO 的統稱。 - DAO(Data Access Object)數據訪問對象
是一個 sun 的一個標准 J2EE 設計模式,這個模式中有個接口就是 DAO,它負持久層的操作。為業務層提供接口。此對象用於訪問數據庫。通常和 PO 結合使用,DAO 中包含了各種數據庫的操作方法。通過它的方法,結合 PO 對數據庫進行相關的操作。夾在業務邏輯與數據庫資源中間。配合 VO,提供數據庫的 CRUD 操作。
SSM框架
- pojo:對應英文Plain Ordinary Java Object,簡單的Java對象,實際就是普通JavaBeans,是為了避免和EJB混淆所創造的簡稱。其中寫普通類屬性。
- dao:(持久層)xml中寫數據庫操作
- service:(業務層)其中寫各種接口還有實現,方法有關操作的可以調用dao中的方法,或 自己寫其他服務(如 分頁)
- controller:(表現層)其中設置請求映射地址,ModelAndView 方法中,將存入的參數進行處理,可使用service方法,用ModelAndView傳入頁面,對頁面進行操作(增加數據、跳轉頁面等)
頁面發送請求給控制器,控制器調用業務層處理邏輯,業務層向持久層發送請求,持久層與數據庫交互,后將結果返回給業務層,業務層將處理邏輯發送給控制器,控制器再調用視圖展現數據。
部分代碼示例
vo包中
package vo;
public class Student
{
private String id;
private String name;
private String gender;
private float java;
private float english;
private float math;
private float totalScore;
private float average;
}
driver包中:
package driver;
public class Driver
{
//存放目前集合中的學生信息
public static List<Student> list=new ArrayList<Student>();
public static void main(String args[])
{
int choice=menuChoice();
while(choice!=7){
switch(choice)
{
case 1:importFromExcel();break;
case 2:importFromTxt();break;
case 3:inputFromKeyboard();break;
case 4:queryStudent();break;
case 5:exportToExecel();break;
case 6:exportToTxt();break;
default:System.out.println("無效的選擇");
}
choice=menuChoice();
}
System.out.println("程序成功退出");
System.exit(0);
}
public static int menuChoice()
{
System.out.println("====學生成績管理系統=====");
System.out.println("1. 從excel中加載數據");
System.out.println("2. 從文本文件加載數據");
System.out.println("3. 鍵盤輸入");
System.out.println("4. 成績查詢");
System.out.println("5. 輸出到excel文件");
System.out.println("6. 輸出到純文本文件");
System.out.println("7. 退出");
System.out.println("請輸入選項:");
Scanner scan=new Scanner(System.in);
int choice=scan.nextInt();
return choice;
}
public static void importFromExcel()
{
/*
* 調用dao中的方法
*/
StudentDAO dao=new StudentDAO();
String fileName="c:/data/student.xls";
List<Student> list1=dao.ReadFromExcel(fileName); //dao中的方法
list.addAll(list1); //將list1集合中的數據增加到list集合中
System.out.println("成功從excel中導入"+list1.size()+"個學生");
}
}
dao包中:
package dao;
public class StudentDAO
{
// 實現讀學生文件,將讀出的信息存放於student集合中
public List<Student> ReadFromExcel(String fileName)
{
List<Student> list = new ArrayList<Student>();
File file = new File(fileName);
try
{
InputStream in = new FileInputStream(file);
Workbook wb = Workbook.getWorkbook(in);
Sheet s = wb.getSheet(0);
for(int i = 1; i < s.getRows(); i++) //第一行不要
{
Cell[] row = s.getRow(i);
Student student = new Student(row[0].getContents(), row[1].getContents(), //填充數據
row[2].getContents(), Float.parseFloat(row[3].getContents()),
Float.parseFloat(row[4].getContents()), Float.parseFloat(row[5].getContents()));
//由於讀取的數據全部都是String 類型所以要轉換成Float類型
student.setTotalScore(student.getEnglish()+student.getJava()+student.getMath());
student.setAverage(student.getTotalScore()/3);
list.add(student);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
}