今天游泳有了較大的進(jìn)步,可以換氣了,游了兩個(gè)來(lái)回;感覺(jué)還行,只是手、腳、口還不太協(xié)調(diào)。
備注:是室外游泳。
--------------------------------------------------
1、Jsp 網(wǎng)站的結(jié)構(gòu)化
本章主要講了一些進(jìn)行結(jié)構(gòu)化的技術(shù),以使程序達(dá)到可維護(hù)性和可重用性。
include機(jī)制:
<%@ include file="footer.jsp" %>
這種機(jī)制的缺點(diǎn):如果被包含頁(yè) footer.jsp 做了修改,但不修改包含頁(yè) index.jsp 的話,包含頁(yè) index.jsp 的內(nèi)容不會(huì)發(fā)生變化。因?yàn)榘?yè)將被包含頁(yè)做了編譯包含了進(jìn)去;但現(xiàn)在被包含頁(yè)做了變化,變化后的內(nèi)容沒(méi)有被包含進(jìn)去(沒(méi)有被編譯)
動(dòng)態(tài)包含:
<jsp:include page="footer.jsp" flush="true" />
這句話同樣包含了footer.jsp頁(yè),并且增加了參數(shù)flush="true",這樣可以保證,如果footer.jsp發(fā)生了改變,index.jsp頁(yè)也會(huì)發(fā)生變化。
使用下面的語(yǔ)法還可以給被包含頁(yè)傳遞參數(shù):
<jsp:include page="footer.jsp" flush="true">
<jsp:param name="menuitem1" value="news"/>
<jsp:param name="menuitem2" value="new2">
</jsp:include>
JSP Model 1:

Model 1 結(jié)構(gòu)的主要特征是:
a、表現(xiàn)層用HTML 文件或JSP文件。如果需要,Jsp 文件可以用 JavaBean 去存取數(shù)據(jù)。
b、Jsp 文件還負(fù)責(zé)所有的業(yè)務(wù)和處理邏輯,如接收到來(lái)的請(qǐng)求,轉(zhuǎn)給適當(dāng)?shù)腏SP,激活適當(dāng)?shù)腏SP頁(yè)等。這意味著 Model 1 結(jié)構(gòu)是以頁(yè)面設(shè)計(jì)為中心的---所有的邏輯和處理邏輯都出現(xiàn)在JSP頁(yè)面上。
c、數(shù)據(jù)訪問(wèn)要么通過(guò)JavaBean 實(shí)現(xiàn),在Jsp中用JavaBean ,要么在Jsp 頁(yè)面中寫 scriptlet 實(shí)現(xiàn)。
在Model 1 結(jié)構(gòu)下,應(yīng)用程序的邏輯和程序流程都在頁(yè)面中出現(xiàn),因此頁(yè)面與應(yīng)用程序的邏輯是緊耦合的。
缺點(diǎn):
在大型應(yīng)用程序中,這種把邏輯耦合在頁(yè)面中,以及需要將頁(yè)錨鏈在一起的方式會(huì)帶來(lái)問(wèn)題,由于頁(yè)面間是緊耦合的,因此分工很麻煩,有可能做美工的還需要了解程序的邏輯;
JSP Model 2 結(jié)構(gòu):
由于 Model 1 存在的缺限,因此為了將表示邏輯與控制邏輯分開,就產(chǎn)生了第二種結(jié)構(gòu),Model 2。
Model 2結(jié)構(gòu)也就是著名的MVC結(jié)構(gòu)。在這種結(jié)構(gòu)中,將應(yīng)用程序分了三種角色Model、 Controller、 View
在這種結(jié)構(gòu)中,View視圖是指表示層,Controller是控制器,Model 是與數(shù)據(jù)打交道的部分。
控制器接收應(yīng)用程序的所有請(qǐng)求,對(duì)每一個(gè)接收到的請(qǐng)求,控制器將選擇是做相應(yīng)的處理還是要顯示數(shù)據(jù)。若要顯示數(shù)據(jù),它將把請(qǐng)求轉(zhuǎn)發(fā)給含有表示邏輯(叫view的應(yīng)用)的JSP;如果要進(jìn)行處理(如從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)),要么調(diào)用適當(dāng)?shù)腏avaBean自己進(jìn)行處理,要么把請(qǐng)求指派或轉(zhuǎn)發(fā)給包含所需處理邏輯的JSP。
轉(zhuǎn)發(fā)標(biāo)簽的寫法:
<jsp:forward page="menu.jsp">
<jsp:param name="userid" value="wuxs">
<jsp:param name="pwd" value="pwd">
</jsp:forwar>
個(gè)人理解:所謂控制器,Controller 就是一個(gè)純粹的Jsp頁(yè),它實(shí)現(xiàn)業(yè)務(wù)邏輯后(或處理后),轉(zhuǎn)發(fā)給另外一個(gè)顯示頁(yè)。也就是說(shuō),應(yīng)用程序可能經(jīng)過(guò)了稱為控制器的JSP頁(yè),但不會(huì)在此處停留。
也可以是一個(gè)servlet,使用 servlet 的缺點(diǎn)是代碼中會(huì)包含有太多的HTML 代碼。
-------------------------
2、servlet 技術(shù)介紹
servlet :是一種組件或程序,它可以動(dòng)態(tài)的生成web內(nèi)容。servlet 用Java Servlet API 編寫,用像Tomcat 這樣的服務(wù)器或容器管理。
web 應(yīng)用程序中servlet 的作用:
自定義的servlet 繼承自:java.servlet.http.HttpServlet。在寫HTTP Servlet 時(shí),我們可以得到一個(gè)實(shí)現(xiàn)了java.servlet.http.HttpServletRequest 接口的request 對(duì)象和一個(gè)實(shí)現(xiàn)了java.servlet.http.HttpServletResponse接口的response對(duì)象。
典型的,當(dāng)開發(fā)基于HTTP的servlet 時(shí),servlet 開發(fā)者只關(guān)心doGet()和 doPost() 方法。servlet 必須重載至少這兩個(gè)方法中的一種方法。
還有另外五種可重載的不常用的方法:
doHead() :用于處理 Http Head 請(qǐng)求。在HttpServlet 中 doHead()方法是一個(gè)特殊的方法,它將執(zhí)行doGet()方法,但只給客戶返回由doGet()產(chǎn)生的頭信息。
doOptions() :用于處理Http Options 請(qǐng)求。 doOptions() 方法自動(dòng)決定servlet 直接支持哪一種Http 方法,并把信息返回給客戶。
doTrace() :用于處理Http Trace請(qǐng)求。 doTrace()方法引起一個(gè)響應(yīng),該響應(yīng)帶有包含Trace請(qǐng)求中所有頭的信息。
doPut() :用于處理Http Put 請(qǐng)求。
doDelete() :用于處理 Http Delete 請(qǐng)求。
int() :初始化
destroy() :析構(gòu)。
getServletInfo() : 讓servlet 提供自身的信息。
servlet 的生存周期:
a)、裝載、實(shí)例化及初始化:當(dāng)?shù)谝淮握?qǐng)求時(shí),服務(wù)器動(dòng)態(tài)裝載并實(shí)例化servlet 。也可以通過(guò)配置服務(wù)器,使web 服務(wù)器初始化時(shí)就加載servlet 。因此,在開發(fā)過(guò)程中,如果更改了servlet 內(nèi)容,而服務(wù)器沒(méi)有重啟,servlet 的響應(yīng)是不會(huì)產(chǎn)生變化的。
b)、處理請(qǐng)求:容器在接收到客戶的訪問(wèn)請(qǐng)求時(shí),會(huì)查找servlet,并加載(如果還沒(méi)有加載的話),并根據(jù)用戶的請(qǐng)求使用doPost()或doGet()方法進(jìn)行響應(yīng)。
Request 對(duì)象:Request 對(duì)象封裝了所有的用戶請(qǐng)求信息。
獲取傳遞的參數(shù):
getParameter() getParameterValues()
getQueryString() ,針對(duì)Http Get請(qǐng)求,獲取參數(shù)串,需要自己處理
getReader() ,針對(duì)Http Post 請(qǐng)求,返回一個(gè)BufferedReader 對(duì)象
getInputStream() ,針對(duì)Http Post 請(qǐng)求,返回一個(gè)ServletInputStream 對(duì)象
Response 對(duì)象:HttpServletResponse 接口為應(yīng)答客戶定義了servlet方法。Response 對(duì)象封裝了從服務(wù)器向客戶返回的所有信息。
HttpServletResponse 對(duì)象提供了getWriter() 方法和getOutputStream()方法。
getWriter() ,返回Writer對(duì)象,用于輸出文本數(shù)據(jù);
getOutputStream() ,返回servletOutputStream對(duì)象,用于輸出二進(jìn)制數(shù)據(jù)。
在送出響應(yīng)之后關(guān)閉Writer對(duì)象或servletOutputStream對(duì)象。
其它方法:
sendRedirect(),把客戶重定向到另外的URL,這里的URL必須是絕對(duì)地址;
sendError(),用當(dāng)前的出錯(cuò)代碼狀態(tài)送給客戶一個(gè)出錯(cuò)信息。
c)、卸載:
典型情況下,servlet 從內(nèi)存中卸載是在要求關(guān)閉容器時(shí)。容器會(huì)調(diào)用servlet的destroy()方法。
還有servlet 中的環(huán)境配置、參數(shù)獲取及會(huì)話跟蹤等不詳細(xì)列出。