在學(xué)的web基礎(chǔ)階段的過程中,始終要放著三塊內(nèi)容.第一塊是瀏覽器,第二是服務(wù)器,第三是數(shù)據(jù)庫(kù).
瀏覽器部分
在瀏覽器部分,已經(jīng)學(xué)習(xí)了html,css,JavaScript和bootstrap
其中html提供頁(yè)面的展示功能,給整個(gè)網(wǎng)站提供基礎(chǔ)的架構(gòu).在學(xué)習(xí)html中最重要的部分是form表單
Css給頁(yè)面提供渲染的功能,讓網(wǎng)頁(yè)能夠更加的美觀漂亮.
JavaScript提供了整個(gè)網(wǎng)站的靈魂,控制網(wǎng)站的特效展示.
之后在瀏覽器部分學(xué)習(xí)了bootstrap,bootstrap這個(gè)框架集成了前面提到的html,css,和JavaScript.bootstrap主要是用來(lái)做響應(yīng)式頁(yè)面的,能夠根據(jù)當(dāng)前訪問的瀏覽器屏幕大小,來(lái)響應(yīng)不同格式的頁(yè)面.
MySQL數(shù)據(jù)庫(kù)部分
MySQL之單表
學(xué)完了瀏覽器部分,就開始學(xué)習(xí)數(shù)據(jù)庫(kù)部分,在學(xué)習(xí)mysql 的第一天,都是對(duì)單個(gè)表進(jìn)行一些操作
主要是對(duì)數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)表以及表中的記錄進(jìn)行的增刪改查.
其中,對(duì)數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)表的操作 用的是sql語(yǔ)句中的DDL數(shù)據(jù)定義語(yǔ)言. DDL數(shù)據(jù)定義語(yǔ)句的主要關(guān)鍵詞是create , drop 和alter
刪除數(shù)據(jù)庫(kù)表中的記錄,涉及到了 delete和truncate的區(qū)別. Detele刪除表中所有的記錄的語(yǔ)句是 detele from 表的名稱, 在表的名稱后面不寫任何的條件代表刪除表中的所有的數(shù)據(jù),delete它是一條記錄一條記錄的刪除,如果用delete來(lái)刪除表中的所有數(shù)據(jù)之前開啟了事務(wù),那么在刪除了數(shù)據(jù)之后,可以通過roll back 來(lái)回滾,把數(shù)據(jù)還原回來(lái). Delete是屬于DML數(shù)據(jù)操縱語(yǔ)句
truncate刪除表的格式 truncate table 表名 它是直接把一張表給干掉,重新創(chuàng)建一個(gè)和之前表的結(jié)構(gòu)一樣的表. Truncate屬于DDL數(shù)據(jù)定義語(yǔ)句,事務(wù)不能作用在DDL語(yǔ)句上.
sql語(yǔ)句的書寫順序,SFWGHO
select from where group having order 的縮寫
提到sql語(yǔ)句的書寫語(yǔ)句,就要說說sql語(yǔ)句的解析順序 f...w...g...h...s...o
from 首先被解析是因?yàn)?首先要確定從哪些表中查詢數(shù)據(jù),先要把表找到
Where 第二個(gè)被解析是因?yàn)橐Y選數(shù)據(jù)庫(kù)表中哪些行的數(shù)據(jù)
Group by 是要對(duì)篩選的數(shù)據(jù)進(jìn)行分組
Having 是對(duì)分組后的數(shù)再次進(jìn)行篩選
select,要篩選數(shù)據(jù)庫(kù)表中哪些列的數(shù)據(jù)
最后是order by 把篩選的數(shù)據(jù)進(jìn)行排序
MySQL之多表
接著在學(xué)習(xí)mysql的第二天學(xué)了多表的設(shè)計(jì)原則和多表的查詢
多表的設(shè)計(jì)原則,
如果是一對(duì)多的關(guān)系,先建立一表,再建立多表,多表中的外鍵為一表的主鍵
如果是多對(duì)多的關(guān)系,那么就要建立一張中間表,這個(gè)中間表至少要有兩個(gè)字段,這兩個(gè)字段分別為兩個(gè)多表的主鍵.建立中間表的原因是,可以把多對(duì)多的表關(guān)系,變成兩個(gè)一對(duì)多
如果一對(duì)一的關(guān)系,可以認(rèn)為是一對(duì)多的特殊情況,可以把一對(duì)一的兩個(gè)表,合并為一張表
接著是多表的查詢
多表查詢的使用場(chǎng)景是,想要查詢的數(shù)據(jù)的結(jié)果,涉及到多張表中的時(shí)候
多表查詢的基礎(chǔ)是交叉查詢,也叫笛卡爾積,它是多張表的無(wú)條件聯(lián)合查詢, 是多表查詢的基礎(chǔ).
多表查詢分為內(nèi)連接查詢,外連接查詢和子查詢
其中,內(nèi)連接查詢 相當(dāng)于高中學(xué)的集合,取兩個(gè)集合的交集
內(nèi)連接查詢分為隱式的連接查詢和顯示的內(nèi)連接查詢
接著是外連接查詢,外連接查詢的使用場(chǎng)景是當(dāng)你無(wú)論如何都要顯示其中一個(gè)表的所有數(shù)據(jù)以及兩個(gè)表中滿足條件的數(shù)據(jù)的時(shí)候,就會(huì)用到外連接查詢.
例如一個(gè)應(yīng)用場(chǎng)景是,員工表和部門表,有個(gè)部門沒有員工,但是要統(tǒng)計(jì)所有部門員工的人數(shù).
最后是子查詢,子查詢的本質(zhì)就是sql語(yǔ)句的嵌套,一個(gè)表查詢的結(jié)果作為了另外一個(gè)查詢的條件.在實(shí)際的開發(fā)中,如果查詢的結(jié)果能夠用多表查詢實(shí)現(xiàn),就不推薦子查詢,因?yàn)樽硬樵兊男阅軟]有多表查詢的性能好.
數(shù)據(jù)庫(kù)之JDBC
學(xué)完了mysql之后,接著學(xué)習(xí)了jdbc,之所以要學(xué)習(xí)jdbc,是因?yàn)榍懊嫣岬降娜髩K內(nèi)容,瀏覽器,服務(wù)器和數(shù)據(jù)庫(kù). 前面講的是瀏覽器和數(shù)據(jù)庫(kù)部分 ,那么服務(wù)器就要作為中間的橋梁,來(lái)和瀏覽器和數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)的交互. 數(shù)據(jù)庫(kù)和服務(wù)器進(jìn)行連接的橋梁就是我們學(xué)的JDBC技術(shù).通過Java語(yǔ)言來(lái)操作數(shù)據(jù)庫(kù).在學(xué)JDBC的第一天,主要是用JDBC原生的方式來(lái)操作數(shù)據(jù)庫(kù),首先需要加載mysql的驅(qū)動(dòng),獲取與數(shù)據(jù)庫(kù)的連接,再獲取執(zhí)行SQL語(yǔ)句的對(duì)象,接著編寫sql語(yǔ)句,執(zhí)行sql之后.獲得了一個(gè)ResultSet結(jié)果集,需要遍歷結(jié)果集才能看到查詢的結(jié)果,最后是釋放資源.
步驟非常的繁瑣,因此在第二天學(xué)習(xí)了DBUtils這個(gè)工具類庫(kù).
使用這個(gè)工具類,實(shí)現(xiàn)了用兩行代碼就能完成對(duì)數(shù)據(jù)庫(kù)的增刪改查,DBUtils的本質(zhì)是對(duì)JDBC的封裝,我們后面要學(xué)的hibernate框架和mybatis框架,他們的本質(zhì)也是對(duì)JDBC的封裝,這兩個(gè)框架也是用來(lái)操作數(shù)據(jù)庫(kù),完成對(duì)數(shù)據(jù)的增刪改查.
要使用DBUtils就需要獲取數(shù)據(jù)源DataSource,因此學(xué)習(xí)了C3P0連接池.通過new 一個(gè)ComboPooledDataSource()對(duì)象來(lái)獲取數(shù)據(jù)源.
服務(wù)器端技術(shù)
之后就是學(xué)的服務(wù)器端的技術(shù).
服務(wù)器端的核心技術(shù)有servlet request response
前面提到服務(wù)器和數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)的交互用到的是JDBC技術(shù). 那么瀏覽器和服務(wù)器進(jìn)行數(shù)據(jù)的交互,就要用到request 和response對(duì)象.瀏覽器向服務(wù)器發(fā)送請(qǐng)求,請(qǐng)求的數(shù)據(jù)就都會(huì)封裝到request對(duì)象中.服務(wù)器向?yàn)g覽器響應(yīng),響應(yīng)的數(shù)據(jù)就封裝到了response對(duì)象中.
Request和response都是服務(wù)器端創(chuàng)建好的,傳遞給servlet程序.servlet是一種動(dòng)態(tài)的web技術(shù),動(dòng)態(tài)的web技術(shù)是指訪問同一個(gè)網(wǎng)站,在不同時(shí)間訪問這個(gè)網(wǎng)站,或者不同的用戶訪問這個(gè)網(wǎng)站,網(wǎng)頁(yè)所顯示的內(nèi)容是不一樣的.
Request和response涉及到了請(qǐng)求轉(zhuǎn)發(fā)和重定向這兩個(gè)知識(shí)點(diǎn)
首先請(qǐng)求轉(zhuǎn)發(fā)調(diào)用的是request.getRequestDispatcher("/login.jsp").forward(request, response);
后面的.forward容易忘記,如果沒有寫.forward,就無(wú)法跳轉(zhuǎn)頁(yè)面
重定向調(diào)用的是response.sendRedirect("/login_web/success.jsp");
請(qǐng)求轉(zhuǎn)發(fā)的里面的路徑是寫給服務(wù)器用的,因此路徑的第一個(gè)斜杠就代表的是當(dāng)前的項(xiàng)目,在路徑里面就不用寫項(xiàng)目的名稱了,如果在請(qǐng)求轉(zhuǎn)發(fā)的路徑里面寫了項(xiàng)目的名稱,就會(huì)導(dǎo)致在頁(yè)面跳轉(zhuǎn)的時(shí)候,瀏覽器的地址欄上,會(huì)出現(xiàn)兩次項(xiàng)目的路徑,會(huì)報(bào)404的錯(cuò)誤
重定向里面的路徑是寫給瀏覽器用的, 路徑的第一個(gè)斜杠就代表的是主機(jī)名,所以需要在路徑里面寫項(xiàng)目的名稱.
之后學(xué)習(xí)了jsp,它的本質(zhì)為servlet.但是在jsp上能夠?qū)慗ava代碼和html代碼,還有學(xué)習(xí)的EL表達(dá)式和JSTL讓Java代碼在jsp中寫得更加簡(jiǎn)潔,可讀性更強(qiáng).
學(xué)了jsp技術(shù)之后,學(xué)了會(huì)話技術(shù)Cookie和Session.
會(huì)話技術(shù),就是用戶打開瀏覽器,訪問不同的資源直到用戶關(guān)閉瀏覽器,這整個(gè)過程,被認(rèn)為是一次會(huì)話.會(huì)話技術(shù)的作用是保存用戶在訪問資源的時(shí)候產(chǎn)生的一些數(shù)據(jù).
比如說記錄用戶上次訪問時(shí)間,用的是Cookie,例如做的登錄案例,記住用戶名功能也是用Cookie
校驗(yàn)驗(yàn)證碼的功能是把隨機(jī)生成的驗(yàn)證碼存儲(chǔ)在Session 中.
登錄成功的頁(yè)面,獲取用戶的名稱,用的也是Session.
Cookie的注意事項(xiàng):
第一是Cookie不能跨瀏覽器
第二是Cookie不支持中文,在new Cookie的時(shí)候,在構(gòu)造方法里面的name 和value不能寫中文.
學(xué)了Cookie之后,學(xué)了session, session它是基于cookie的,服務(wù)器的response對(duì)象調(diào)用addCookie()方法,給瀏覽器回寫了session的id.
Session和Servlet一樣都是域?qū)ο?都有他們的生命周期.
生命周期指的是一個(gè)對(duì)象從創(chuàng)建到銷毀的過程..
Servlet的生命周期: 當(dāng)客戶端第一次訪問該Servlet的時(shí)候才會(huì)創(chuàng)建一個(gè)Servlet的對(duì)象,那么Servlet中的init方法就會(huì)執(zhí)行(init只會(huì)執(zhí)行一次).任何一次從客戶端發(fā)送的請(qǐng)求,那么服務(wù)器創(chuàng)建一個(gè)新的線程執(zhí)行Servlet中service方法為這次請(qǐng)求服務(wù).service方法的內(nèi)部根據(jù)請(qǐng)求的方式的不同調(diào)用不同doXXX的方法.當(dāng)Servlet從服務(wù)器中移除或者關(guān)閉服務(wù)器的時(shí)候,Servlet對(duì)象就會(huì)被銷毀.destroy的方法就會(huì)執(zhí)行,垃圾回收就會(huì)將Servlet對(duì)象回收掉芬膝。
Session的生命周期今天上午學(xué)了: 當(dāng)?shù)谝淮握{(diào)用request.getSession()的時(shí)候,創(chuàng)建session,或者 訪問jsp頁(yè)面的也會(huì)創(chuàng)建Session,因?yàn)閖sp頁(yè)面里面有9九大內(nèi)置對(duì)象.包含了session
銷毀session的三種情況:
第一種是服務(wù)器的非正常關(guān)閉,比如說點(diǎn)擊控制臺(tái)的紅色按鈕強(qiáng)制關(guān)機(jī).
第二種是session超時(shí)了. 默認(rèn)情況下是30分鐘.
第三種情況是手動(dòng)的銷毀session,也是我們?cè)诘卿洶咐杏玫姆椒ㄕ{(diào)用Session.invalidate();