1、代碼結(jié)構(gòu)中Dao拴鸵,Service玷坠,Controller,Util劲藐,Model是什么意思八堡,為什么劃分?
web:主要是客戶端網(wǎng)頁(yè),是表層的東西聘芜,可接收和返回?cái)?shù)據(jù)給用戶
domain:主控制層兄渺,是用戶與數(shù)據(jù)庫(kù)交互的核心中轉(zhuǎn)站,控制用戶數(shù)據(jù)收集汰现,控制請(qǐng)求轉(zhuǎn)向
service:業(yè)務(wù)邏輯層挂谍,處理數(shù)據(jù)邏輯,驗(yàn)證數(shù)據(jù)瞎饲,
dao:持久層口叙,讀寫(xiě)數(shù)據(jù)庫(kù)。
web發(fā)出請(qǐng)求---domain接收控制數(shù)據(jù)轉(zhuǎn)向(可以返回也可以進(jìn)入service)---service驗(yàn)證數(shù)據(jù)正確性或者是否符合業(yè)務(wù)要求---dao存入嗅战,讀出妄田,依次返回。
首先這些名字不是必須的驮捍,只是為了統(tǒng)一形庭,一般都這么叫。
工作流程:一個(gè)請(qǐng)求發(fā)送到action(作用:MVC中的C),action控制它發(fā)送到哪個(gè)biz處理,如果用到數(shù)據(jù)庫(kù)厌漂,那么biz在連接dao萨醒,然后返回要的數(shù)據(jù),最后action在返回響應(yīng)的頁(yè)面(比如jsp),因?yàn)槭敲嫦驅(qū)ο?所以實(shí)體domain在中間傳遞數(shù)據(jù)苇倡。以上為工作流程.
各層意義:action為控制層富纸,MVC中充當(dāng)C角色,用來(lái)分配哪個(gè)業(yè)務(wù)來(lái)處理用戶請(qǐng)求。
biz業(yè)務(wù)層旨椒,存放好多處理業(yè)務(wù)的代碼晓褪,現(xiàn)實(shí)中面向接口編程,一般這里定義都是業(yè)務(wù)接口综慎,通常會(huì)有一個(gè)biz.impl這個(gè)包用來(lái)寫(xiě)實(shí)現(xiàn)類. 當(dāng)然針對(duì)架構(gòu)意義實(shí)現(xiàn)類不用說(shuō)涣仿。
dao持久層,DB操作都寫(xiě)在這里
ui 用戶交互層,通常為頁(yè)面,例如.jsp,aspx等頁(yè)面
util功能包,針對(duì)本項(xiàng)目工具類
common通用工具包,一般一個(gè)公司會(huì)有固定的jar好港,好幾個(gè)項(xiàng)目通用的愉镰,例如遠(yuǎn)程調(diào)用等
domian存放實(shí)體,如果用ibatis框架,一般mapping創(chuàng)建在它下面,當(dāng)然只針對(duì)架構(gòu)mapping也是無(wú)意義. 不懂追問(wèn)即可!
Action類 是[獲得Form表單數(shù)據(jù)钧汹,并處理邏輯的類]
DAO(Data Access Object) 是一個(gè)接口實(shí)現(xiàn)[通過(guò)SessionFactory獲得操作數(shù)據(jù)庫(kù)的會(huì)話丈探,并實(shí)現(xiàn)一些基本的刪除 添加 修改數(shù)據(jù),在servlet中更實(shí)際化業(yè)務(wù)操作]
簡(jiǎn)單點(diǎn)說(shuō)拔莱,dao層基本都是幾個(gè)固定的增刪改查方法碗降,比方說(shuō)你在用hibernate的時(shí)候,數(shù)據(jù)庫(kù)發(fā)生變化時(shí)塘秦,就要重新生成相應(yīng)的dao讼渊,所以發(fā)你的代碼重新寫(xiě)在service里面,dao變化都不會(huì)影響你的程序了尊剔。
還有爪幻,一些做外包的,dao赋兵、POJO都是別人生成好的笔咽,不允許程序員改動(dòng)的,所以要處理你自己的業(yè)務(wù)方法霹期,就重新建立service層叶组,這里的東西是跟你具體的業(yè)務(wù)有關(guān)的。
2历造、JSONObject和JSONArray區(qū)別及基本用法
一甩十、JSONObject和JSONArray的數(shù)據(jù)表示形式
JSONObject的數(shù)據(jù)是用 { } 來(lái)表示的,
例如: { "id" : "123", "courseID" : "huangt-test", "title" : "提交作業(yè)", "content" : null }
而JSONArray吭产,顧名思義是由JSONObject構(gòu)成的數(shù)組侣监,用 [ { } , { } , ...... , { } ] 來(lái)表示
例如: [ { "id" : "123", "courseID" : "huangt-test", "title" : "提交作業(yè)" } , { "content" : null, "beginTime" : 1398873600000 "endTime" } ] ;
表示了包含2個(gè)JSONObject的JSONArray臣淤。
可以看到一個(gè)很明顯的區(qū)別橄霉,一個(gè)最外面用的是 { } ,一個(gè)最外面用的是 [ ] 邑蒋;
二姓蜂、如何從字符串String獲得JSONObject對(duì)象和JSONArray對(duì)象
JSONObject jsonObject = new JSONObject ( String str);
JSONArray jsonArray = new JSONArray(String str ) ;
三、如何從JSONArray中獲得JSONObject對(duì)象
大家可以把JSONArray當(dāng)成一般的數(shù)組來(lái)對(duì)待医吊,只是獲取的數(shù)據(jù)內(nèi)數(shù)據(jù)的方法不一樣
JSONObject jsonObject = jsonArray.getJSONObject(i) ;
四钱慢、獲取JSON內(nèi)的數(shù)據(jù)
int mid= jsonObject.getInt ( "id" ) ; // 這里的mid得到的數(shù)據(jù)就是123.
String mcourse=jsonObject.getString( " courseID") ; // 這里的mcourse得到的數(shù)據(jù)就是huangt-test.
五、json數(shù)組在java中得到某列的值
public static void jsonToBean(String data) {
try {
JSONArray array = new JSONArray(data);//將json字符串轉(zhuǎn)成json數(shù)組
for (int i = 0; i < array.length(); i++) {//循環(huán)json數(shù)組
JSONObject ob = (JSONObject) array.get(i);//得到j(luò)son對(duì)象
String name= ob.getString("name");//name這里是列名稱卿堂,獲取json對(duì)象中列名為name的值
System.out.print(name);//輸出name
} catch (JSONException e) {
}
}
3束莫、TestNG斷言
1懒棉、原理:對(duì)測(cè)試程序變量的中間狀態(tài)進(jìn)行斷言(Assert)判斷,從而輔助判斷測(cè)試用例的執(zhí)行是成功還是失敗览绿。
2策严、TestNG中常用的斷言方法有:
(1) assertTrue:判斷是否為T(mén)rue。
(2) assertFalse:判斷是否為false挟裂。
(3) assertSame:判斷引用地址是否相同享钞。
(4) assertNotSame:判斷引用地址是否不相同揍诽。
(5) assertNull:判斷是否為null诀蓉。
(6) assertNotNull:判斷是否不為null。
(7) assertEquals:判斷是否相等暑脆,Object類型的對(duì)象需要實(shí)現(xiàn)haseCode及equals方法渠啤。
(8) assertNotEquals:判斷是否不相等。
(9) assertEqualsNoOrder:判斷忽略順序是否相等添吗。
3沥曹、下面使用WebDriver測(cè)試實(shí)例體現(xiàn)斷言的使用方法。測(cè)試用例:
(1) 打開(kāi)Firefox瀏覽器碟联,訪問(wèn)sogou首頁(yè)妓美。
(2) 查找首頁(yè)上的輸入框元素。
(3) 斷言輸入框是否存在鲤孵。
(4) 輸入搜索關(guān)鍵字壶栋,點(diǎn)擊搜索按鈕。
例子:
package cn.testng;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class AssertTest {
public WebDriver driver;
String baseUrl="http://www.sogou.com";//設(shè)定訪問(wèn)網(wǎng)站的地址
@Test
public void testSearch() {
//打開(kāi)sogou首頁(yè)
driver.get(baseUrl+"/");
WebElement inputBox=driver.findElement(By.id("query"));
/*使用Assert類的assertTrue方法斷言搜索輸入框是否在頁(yè)面顯示
* isDisplayed方法根據(jù)頁(yè)面元素的顯示狀態(tài)返回判斷值普监,在頁(yè)面顯示則返回true,不顯示則返回false
*/
Assert.assertTrue(inputBox.isDisplayed());
inputBox.sendKeys("自動(dòng)化測(cè)試");
//點(diǎn)擊搜索按鈕
driver.findElement(By.id("stb")).click();
}
@BeforeMethod
public void beforeMethod() {
//若無(wú)法打開(kāi)Firefox瀏覽器贵试,可設(shè)定Firefox瀏覽器的安裝路徑
System.setProperty("webdriver.firefox.bin", "D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
//打開(kāi)Firefox瀏覽器
driver=new FirefoxDriver();
}
@AfterMethod
public void afterMethod() {
//關(guān)閉打開(kāi)的瀏覽器
driver.quit();
}
}
測(cè)試結(jié)果:
[TestNG] Running:
C:\Windows\Temp\testng-eclipse--542429537\testng-customsuite.xml
PASSED: testSearch
===============================================
Default test
Tests run: 1, Failures: 0, Skips: 0
===============================================