由於條件限制,每月流量有限,所以這周沒有在MOOC網上繼續學習相關大學計算機專業的課程,只好重新將javaweb從數據庫連接那裡繼續向後學習,也算是對前一段時間學習的檢驗吧,這次將javaweb的一些相關基礎重新溫習了一邊,搞懂了很多當時一知半解的或者糊裡糊塗的知識,比如真正了解了MVC設計思想,javaweb經典三層架構各個層面的任務及如何運用。
一、重溫了數據庫連接的相關知識,掌握兩種數據源,用以連接數據庫Mysql,由於tomcat內置的dbcp數據源配置和使用比較麻煩,我只是了解了一下,不過以後還是要掌握的。
(1)DBCP
DBCP:使用時需要DBCP的jar包,網上可以下載到。
方式1:
BasicDataSource source = new BasicDataSource();
source.setDriverClassName("com.mysql.jdbc.Driver");
source.setUrl("jdbc:mysql:///day11");
source.setUsername("root");
source.setPassword("root");
方式2:
Properties prop = new Properties();
prop.load(new FileReader("dbcp.properties"));
BasicDataSourceFactory factory = new BasicDataSourceFactory();
DataSource source = factory.createDataSource(prop);
配置文件的配置信息:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///day11
username=root
password=root
#<!--初始化10個連接-->
initialSize=10
#<!--最大連接數量-->
maxActive=50
#<!--最大空閒連接數量-->
maxIdle=20
#<!--最小空閒連接數量-->
minIdle=5
#<!--超時等待時間,以毫秒為單位,到時限後自動轉為空閒連接-->
maxWait=60000
C3P0:使用時需要C3P0的jar包,網上可下載到
方式1:
ComboPooledDataSource source = new ComboPooledDataSource();
source.setDriverClass("com.mysql.jdbc.Driver");
source.setJdbcUrl("jdbc:mysql:///day11");
source.setUser("root");
source.setPassword("root");
方式2:
ComboPooledDataSource source = new ComboPooledDataSource();
在類加載的目錄下配置名稱為c3p0-config.xml的文件如下基本信息:
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///day11</property>
<property name="user">root</property>
<property name="password">root</property>
</default-config>
</c3p0-config>
二、DButils
這個API相當方便,使用後再去連接數據庫,覺得整個世界都干淨了。
對於增刪改來說,很方便調用queryrunner的update方法即可實現,但對於查詢由於不清楚查詢到結果之後要對結果如何處理,所以框架在設計的時候就提供了幾個比較重要的方法,來處理結果,也是很常用的方法query中的ResultSetHandler<T>就是這樣一個處理結果集的類,利用泛型可以很靈活的處理想要處理的數據類型
當然new的類型不止這幾種,但是帶有*號的是非常常用和重要。比如3和4就是我們經常要將結果集中的數據封裝入一個JavaBean實例中,帶到上一層中使用,很方便,不用自己new一個JavaBean實例通過循環遍歷結果集設置屬性,結果多了還要存入list集合中,太麻煩了。4中直接就可以一步到位返回一個list<T>,所以很靈活。
這裡就體現了封裝的思想,將重復的代碼制作成一個工具類,需要使用直接調用即可實現功能,因為底層已經將所有邏輯寫好了。
二、完成了一個小案例,比較粗糙,只是實現了主要的邏輯功能,網頁布局之類的沒有學到,所以先暫時掌握邏輯實現以及對於一個功能實現的設計思路
主要掌握設計思維,還是那句話程序是構造出來的,不是編出來的
案例是一個客戶管理系統,主要掌握經典三次架構及MVC設計模式以及體驗基於數據庫的增刪改查,具體內容我就不在這裡多說了,我就想說說我對經典三層架構的理解,如何真正了解MVC設計模式,我就用大白話和打比方的方式和大家分享,如果有不對的地方,還請大牛能予以賜教。
首先,什麼是MVC
M—模型(Model) 模型是應用程序的主體部分。模型表示業務數據,或者業務邏輯.
V—視圖(View) 視圖是應用程序中用戶界面相關的部分,是用戶看到並與之交互的界面。
C—控制器(controller) 控制器工作就是根據用戶的輸入,控制用戶界面數據顯示和更新model對象狀態。
打給比方:你很有錢,有一個豪華別墅,家裡有總管傭人等等,你現在很餓,想吃東西,但是桌子上什麼也沒有,這裡桌子可以看作是你能看得見的V,你的需求是要桌上能有個吃的,這時候你的總管知道了你的需求,他就可以看作是C,但是總管不會做飯啊,所以他要將你的需求交給傭人,讓傭人去做飯,這裡傭人就可以看作M。飯是如何做的在哪裡做的,需要什麼步驟,買菜,炒菜,下面條什麼的都是M來實現,M的任務就是將需求具體實現出來,好了,M把飯做好了,他通知總管C,C說:好了M你可以忙你的去了,把飯交給我就行了,我把飯端過去就好了(話說C好淫蕩哈~),這時候C就要把飯端到桌子V上,你就可以看到一碗香噴噴的飯菜了。這裡出現的MVC都是相對獨立的,為什麼說是相對獨立的?因為每層之間必須是要聯系的,不然這飯就無法放到桌子上(這裡就要牽扯到工廠解耦,我就先不說了),但是相對獨立體現在哪裡呢?
比如說:有一天M做錯事了,你把他開了,那麼是不是你就吃不上飯了?不,你有錢啊,再雇一個傭人就解決了對吧,代碼也一樣,比如哪天需要修改業務邏輯了,那麼直接修改M層即可,其他層不用大動干戈,整體框架還是能正常運行,多爽。
可以這樣理解,假如C知道你想吃飯了,他跑過去告訴M:你去買菜,我總管大人來做。你想一想C跑來干擾M的業務會有什麼隱患?現在的情況是M只負責買食材,C來做飯,又要去把飯菜端上去。那麼好,突然有一天,C病了(你又不能因為他病了就開了他,當然這是假設),這次怎麼辦?你是真的吃不上飯了,因為M只負責買食材,無法完成做飯這項任務,看到隱患在哪裡了嗎?這就是C跑到M層的隱患。所以軟件的這種MVC設計的意見就在這裡,將功能模塊化,方便維護修改以及更換。這裡純屬個人的理解,我不知道用的例子對不對,還請大牛指點。
那下面再聊聊javaweb的經典三層架構,也是基於MVC的設計思想(網上盜個圖來說明)
Jsp頁面顯示可以看作是—V
Servlet接受請求以及控制其他層處理請求,將結果顯示到jsp頁面,所以Servlet可以看作是—C
Jsp和Servlet共同組成了Javaweb三層架構的web層及V+C=Web,因為這兩個家伙沒啥邏輯可言,就是顯示數據,將需求往下層傳達再將結果傳給jsp(可以理解為一些領導只會下達命令,自己卻獨享成果一樣)。但是M這時候就不干了,尼瑪這個賤人,我辛辛苦苦的干活又買菜又炒菜做飯,最後我還是個傭人...(哈哈,開個玩笑這裡就是想讓大家能形象的理解三層架構,別當真)於是你也覺得不太好就將M的任務分開了,於是就出現了Service業務層和Dao數據層,一個專心做飯,一個跑去買食材。
Service和Dao就是—M
所以總結一下:javaweb基於MVC的三層架構就是web層(jsp+servlet)、業務層(service)和數據層(dao)
javaweb的經典三層架構,說實話一目了然,各自分工合作,將自己的任務完成,最後串聯起來將成果顯示給用戶,很有一種團隊協作的精神有木有~哈哈,所以說程序是構造出來的不是編寫出來的道理就在於此,不要盲目的編寫程序,結構框架和思維是最緊要的,其次才是把握住各部位的細節。
好了,如果這篇文章對你也有一點幫助的話,希望你能告訴更多的人去理解這種思想,因為自從學完了計算機導論我已經開始用計算的思維考慮很多問題了,所以現在回到javaweb的學習是真的豁然開朗,醍醐灌頂(小小的裝個逼~)
我會繼續學習計算機的基礎課程,只是現在條件受限,我只好繼續javaweb的學習,不過看來現在對編程這種事情真的是有一層深入的理解了,希望有夢想的人們,我們一起加油可好?
by Death4
2016-09-18