大致總結(jié)一下兩種開發(fā)模式的流程,然后以 MVC模式的一個簡單工程為例,詳細(xì)總結(jié)一下具體的代碼
(這篇博客是跟隨課堂筆記的最開始一篇,之后的每節(jié)課內(nèi)容會順序更新)
一、Java Web的兩種模式 :
1. Model1 : 模式1
先上總體的結(jié)構(gòu)圖
具體來說:
(1)首先使用 HTML或者 JSP編寫一個頁面(使用JSP便于讓數(shù)據(jù)回流,以便于某些功能的實現(xiàn),JSP中通過Java代碼段從發(fā)來的Request 中根據(jù)屬性值獲得數(shù)據(jù)并插入顯示在網(wǎng)頁中),在這個頁面的表單中輸入數(shù)據(jù),然后點(diǎn)擊提交按鈕,信息便從用戶端發(fā)給了服務(wù)器端
(2)服務(wù)器端 JSP (thanks.jsp) 既要接收并處理數(shù)據(jù),還要顯示一定的內(nèi)容,同時還要對用戶發(fā)來的數(shù)據(jù)進(jìn)行更進(jìn)一步的處理(往下與 user.class userDB.java進(jìn)行互動),可以說鴨梨山大。
(3)user.class userDB.java負(fù)責(zé)為thanks.jsp提供服務(wù),例如 thanks.jsp可以封裝一個User對象然后通過 userDB.java將新用戶的數(shù)據(jù)寫入數(shù)據(jù)庫中
總結(jié) :Model1模式下,thanks.jsp的負(fù)擔(dān)太重,對于非常簡單的業(yè)務(wù)處理的話還好說,復(fù)雜一些的業(yè)務(wù)的話就不太合適了
2.Model2 : 也稱 MVC模式
貼圖:
在這個例子中,MVC模式的運(yùn)作:
M: Model 主要就是 User.class UserDB.class 功能和之前說的差不多
V: View 這一部分主要是 : Controller接收并處理完數(shù)據(jù)之后給View一個指令,然后View就根據(jù)這個指令為用戶展示出相應(yīng)的頁面,
C: Controller 這一部分主要負(fù)責(zé)數(shù)據(jù)的進(jìn)一步處理(例如用戶數(shù)據(jù)的封裝并序列化存儲到數(shù)據(jù)庫中)
我理解的大致流程:
用戶發(fā)送數(shù)據(jù)到服務(wù)器端,首先發(fā)送給了 Controller(即 EmailListServlet.java), 在這里我們只需要接收數(shù)據(jù),處理數(shù)據(jù),然后與Model模塊(M模塊)進(jìn)行交互,最后指示View模塊應(yīng)該顯示怎樣的頁面反饋給用戶
在代碼中看一下:
完整的EmailListServlet.java 代碼:
第一部分就是接收了從客戶端發(fā)來的數(shù)據(jù)(這里因為客戶端也是自己,所以客戶端就是 index.jsp)
通過 request.getParameter("name") 來接收數(shù)據(jù)
第二部分就是和 Model模塊進(jìn)行交互了 (雖然并沒有完全實現(xiàn)? : - )? ? )
第三部分,將我們要發(fā)送給 View 模塊的數(shù)據(jù)打包( setAttribute方法 ), 這里的 View 模塊就是 thanks.jsp了
二、MVC模式下的一個實例工程 :
以上課時講的工程為例子 :
1. 工程結(jié)構(gòu) :
對應(yīng)上面的圖來說明一下
紅色的部分代表我工程中對應(yīng)的文件
User.java 雖然寫好了但是,因為沒有弄序列化所以還沒法傳給 thanks.jsp
圖中沒有寫 最關(guān)鍵的一個文件 :
負(fù)責(zé) index.jsp -> emailListServlet? 映射配置的 web.xml,這個會在后面提到
2.具體代碼 :
(1)thanks.jsp
它屬于 View層次,所以就有兩個職責(zé),接收來自Controller的指令(實際上就是一個包含一些數(shù)據(jù)的請求), 然后將這些數(shù)據(jù)展示給用戶看 ,具體代碼如下 :
顯然第一個圈里面就是從 request 中接收了數(shù)據(jù) (數(shù)據(jù)來自 Controller),第二個圈就是把這些數(shù)據(jù)展示出來,View頁面負(fù)責(zé)的就是顯示,所以涉及數(shù)據(jù)處理的部分不會很復(fù)雜
(2) emailListServlet.java 上面大致說過了,這里說一下一些細(xì)節(jié):
黃色的圈里的 url指定了要把打包好的數(shù)據(jù)發(fā)送到哪里(發(fā)送到 View 模塊去), 這里需要注意的就是 url 的寫法,之前沒有加 /thanks.jsp 中的 / , 導(dǎo)致找不到文件(404 not found),至于最后這個長長的語句,功能上就是把上面打包好的數(shù)據(jù)發(fā)送到url指定的頁面中。
(3) index.jsp
因為這個里面很大一部分是修使用的 HTML 和 CSS 代碼,所以有些長,這里只把關(guān)鍵的 表單部分代碼貼出來
其實這里面關(guān)鍵的部分只有幾個:
①第一個圈里畫的 action 和 method :
action 指的是要把數(shù)據(jù)發(fā)送到哪里,method是指怎么發(fā)送數(shù)據(jù),如果method 不是 post ,而是 get 的話,獲取數(shù)據(jù)的方式就是通過拼接字符串了,而action屬性在這個工程中其實指向的是 emailListServlet.java ,正因為如此,才需要在 web.xml中配置從 index.jsp 到 emailListServlet.java 的映射,這樣 Controller才能收到數(shù)據(jù)
②也要注意用戶輸入數(shù)據(jù)的 name 屬性:
因為對方接收數(shù)據(jù)的時候是要通過這個 name 屬性來決定接收哪個數(shù)據(jù)的,如果屬性名匹配就無法接收到數(shù)據(jù)
3. web.xml
這也是很關(guān)鍵的一個環(huán)節(jié),如果 index.jsp -> emailListServlet.java 的映射沒有配好,數(shù)據(jù)就傳不到Controller中,也就沒有什么意義了
三、運(yùn)行:
(1) index.jsp 輸入數(shù)據(jù) :
(2) 經(jīng)過 emailListServlet.java 處理后直接由 View 模塊返回給用戶結(jié)果 (thanks.java)
完整的工程壓縮文件地址 :
https://github.com/ALK416/Java_Web/blob/master/Task_9_21.zip