SpringMVC學(xué)習(xí)筆記

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)擊搜索按鈕。


image.png

例子:

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
===============================================

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容