1、代碼結(jié)構(gòu)中Dao,Service,Controller,Util,Model是什么意思,為什么劃分?
web:主要是客戶端網(wǎng)頁,是表層的東西,可接收和返回?cái)?shù)據(jù)給用戶
domain:主控制層,是用戶與數(shù)據(jù)庫交互的核心中轉(zhuǎn)站,控制用戶數(shù)據(jù)收集,控制請(qǐng)求轉(zhuǎn)向
service:業(yè)務(wù)邏輯層,處理數(shù)據(jù)邏輯,驗(yàn)證數(shù)據(jù),
dao:持久層,讀寫數(shù)據(jù)庫。
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ù)庫,那么biz在連接dao,然后返回要的數(shù)據(jù),最后action在返回響應(yīng)的頁面(比如jsp),因?yàn)槭敲嫦驅(qū)ο?所以實(shí)體domain在中間傳遞數(shù)據(jù)。以上為工作流程.
各層意義:action為控制層,MVC中充當(dāng)C角色,用來分配哪個(gè)業(yè)務(wù)來處理用戶請(qǐng)求。
biz業(yè)務(wù)層,存放好多處理業(yè)務(wù)的代碼,現(xiàn)實(shí)中面向接口編程,一般這里定義都是業(yè)務(wù)接口,通常會(huì)有一個(gè)biz.impl這個(gè)包用來寫實(shí)現(xiàn)類. 當(dāng)然針對(duì)架構(gòu)意義實(shí)現(xiàn)類不用說。
dao持久層,DB操作都寫在這里
ui 用戶交互層,通常為頁面,例如.jsp,aspx等頁面
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也是無意義. 不懂追問即可!
Action類 是[獲得Form表單數(shù)據(jù),并處理邏輯的類]
DAO(Data Access Object) 是一個(gè)接口實(shí)現(xiàn)[通過SessionFactory獲得操作數(shù)據(jù)庫的會(huì)話,并實(shí)現(xiàn)一些基本的刪除 添加 修改數(shù)據(jù),在servlet中更實(shí)際化業(yè)務(wù)操作]
簡(jiǎn)單點(diǎn)說,dao層基本都是幾個(gè)固定的增刪改查方法,比方說你在用hibernate的時(shí)候,數(shù)據(jù)庫發(fā)生變化時(shí),就要重新生成相應(yīng)的dao,所以發(fā)你的代碼重新寫在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ù)是用 { } 來表示的,
例如: { "id" : "123", "courseID" : "huangt-test", "title" : "提交作業(yè)", "content" : null }
而JSONArray,顧名思義是由JSONObject構(gòu)成的數(shù)組,用 [ { } , { } , ...... , { } ] 來表示
例如: [ { "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ù)組來對(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:判斷是否為True。
(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) 打開Firefox瀏覽器,訪問sogou首頁。
(2) 查找首頁上的輸入框元素。
(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ǎng)站的地址
@Test
public void testSearch() {
//打開sogou首頁
driver.get(baseUrl+"/");
WebElement inputBox=driver.findElement(By.id("query"));
/*使用Assert類的assertTrue方法斷言搜索輸入框是否在頁面顯示
* isDisplayed方法根據(jù)頁面元素的顯示狀態(tài)返回判斷值,在頁面顯示則返回true,不顯示則返回false
*/
Assert.assertTrue(inputBox.isDisplayed());
inputBox.sendKeys("自動(dòng)化測(cè)試");
//點(diǎn)擊搜索按鈕
driver.findElement(By.id("stb")).click();
}
@BeforeMethod
public void beforeMethod() {
//若無法打開Firefox瀏覽器,可設(shè)定Firefox瀏覽器的安裝路徑
System.setProperty("webdriver.firefox.bin", "D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
//打開Firefox瀏覽器
driver=new FirefoxDriver();
}
@AfterMethod
public void afterMethod() {
//關(guān)閉打開的瀏覽器
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
===============================================