今天游泳有了較大的進步,可以換氣了,游了兩個來回;感覺還行,只是手、腳、口還不太協調。
備注:是室外游泳。
--------------------------------------------------
1、Jsp 網站的結構化
本章主要講了一些進行結構化的技術,以使程序達到可維護性和可重用性。
include機制:
<%@ include file="footer.jsp" %>
這種機制的缺點:如果被包含頁 footer.jsp 做了修改,但不修改包含頁 index.jsp 的話,包含頁 index.jsp 的內容不會發生變化。因為包含頁將被包含頁做了編譯包含了進去;但現在被包含頁做了變化,變化后的內容沒有被包含進去(沒有被編譯)
動態包含:
<jsp:include page="footer.jsp" flush="true" />
這句話同樣包含了footer.jsp頁,并且增加了參數flush="true",這樣可以保證,如果footer.jsp發生了改變,index.jsp頁也會發生變化。
使用下面的語法還可以給被包含頁傳遞參數:
<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 結構的主要特征是:
a、表現層用HTML 文件或JSP文件。如果需要,Jsp 文件可以用 JavaBean 去存取數據。
b、Jsp 文件還負責所有的業務和處理邏輯,如接收到來的請求,轉給適當的JSP,激活適當的JSP頁等。這意味著 Model 1 結構是以頁面設計為中心的---所有的邏輯和處理邏輯都出現在JSP頁面上。
c、數據訪問要么通過JavaBean 實現,在Jsp中用JavaBean ,要么在Jsp 頁面中寫 scriptlet 實現。
在Model 1 結構下,應用程序的邏輯和程序流程都在頁面中出現,因此頁面與應用程序的邏輯是緊耦合的。
缺點:
在大型應用程序中,這種把邏輯耦合在頁面中,以及需要將頁錨鏈在一起的方式會帶來問題,由于頁面間是緊耦合的,因此分工很麻煩,有可能做美工的還需要了解程序的邏輯;
JSP Model 2 結構:
由于 Model 1 存在的缺限,因此為了將表示邏輯與控制邏輯分開,就產生了第二種結構,Model 2。
Model 2結構也就是著名的MVC結構。在這種結構中,將應用程序分了三種角色Model、 Controller、 View
在這種結構中,View視圖是指表示層,Controller是控制器,Model 是與數據打交道的部分。
控制器接收應用程序的所有請求,對每一個接收到的請求,控制器將選擇是做相應的處理還是要顯示數據。若要顯示數據,它將把請求轉發給含有表示邏輯(叫view的應用)的JSP;如果要進行處理(如從數據庫中讀取數據),要么調用適當的JavaBean自己進行處理,要么把請求指派或轉發給包含所需處理邏輯的JSP。
轉發標簽的寫法:
<jsp:forward page="menu.jsp">
<jsp:param name="userid" value="wuxs">
<jsp:param name="pwd" value="pwd">
</jsp:forwar>
個人理解:所謂控制器,Controller 就是一個純粹的Jsp頁,它實現業務邏輯后(或處理后),轉發給另外一個顯示頁。也就是說,應用程序可能經過了稱為控制器的JSP頁,但不會在此處停留。
也可以是一個servlet,使用 servlet 的缺點是代碼中會包含有太多的HTML 代碼。
-------------------------
2、servlet 技術介紹
servlet :是一種組件或程序,它可以動態的生成web內容。servlet 用Java Servlet API 編寫,用像Tomcat 這樣的服務器或容器管理。
web 應用程序中servlet 的作用:
自定義的servlet 繼承自:java.servlet.http.HttpServlet。在寫HTTP Servlet 時,我們可以得到一個實現了java.servlet.http.HttpServletRequest 接口的request 對象和一個實現了java.servlet.http.HttpServletResponse接口的response對象。
典型的,當開發基于HTTP的servlet 時,servlet 開發者只關心doGet()和 doPost() 方法。servlet 必須重載至少這兩個方法中的一種方法。
還有另外五種可重載的不常用的方法:
doHead() :用于處理 Http Head 請求。在HttpServlet 中 doHead()方法是一個特殊的方法,它將執行doGet()方法,但只給客戶返回由doGet()產生的頭信息。
doOptions() :用于處理Http Options 請求。 doOptions() 方法自動決定servlet 直接支持哪一種Http 方法,并把信息返回給客戶。
doTrace() :用于處理Http Trace請求。 doTrace()方法引起一個響應,該響應帶有包含Trace請求中所有頭的信息。
doPut() :用于處理Http Put 請求。
doDelete() :用于處理 Http Delete 請求。
int() :初始化
destroy() :析構。
getServletInfo() : 讓servlet 提供自身的信息。
servlet 的生存周期:
a)、裝載、實例化及初始化:當第一次請求時,服務器動態裝載并實例化servlet 。也可以通過配置服務器,使web 服務器初始化時就加載servlet 。因此,在開發過程中,如果更改了servlet 內容,而服務器沒有重啟,servlet 的響應是不會產生變化的。
b)、處理請求:容器在接收到客戶的訪問請求時,會查找servlet,并加載(如果還沒有加載的話),并根據用戶的請求使用doPost()或doGet()方法進行響應。
Request 對象:Request 對象封裝了所有的用戶請求信息。
獲取傳遞的參數:
getParameter() getParameterValues()
getQueryString() ,針對Http Get請求,獲取參數串,需要自己處理
getReader() ,針對Http Post 請求,返回一個BufferedReader 對象
getInputStream() ,針對Http Post 請求,返回一個ServletInputStream 對象
Response 對象:HttpServletResponse 接口為應答客戶定義了servlet方法。Response 對象封裝了從服務器向客戶返回的所有信息。
HttpServletResponse 對象提供了getWriter() 方法和getOutputStream()方法。
getWriter() ,返回Writer對象,用于輸出文本數據;
getOutputStream() ,返回servletOutputStream對象,用于輸出二進制數據。
在送出響應之后關閉Writer對象或servletOutputStream對象。
其它方法:
sendRedirect(),把客戶重定向到另外的URL,這里的URL必須是絕對地址;
sendError(),用當前的出錯代碼狀態送給客戶一個出錯信息。
c)、卸載:
典型情況下,servlet 從內存中卸載是在要求關閉容器時。容器會調用servlet的destroy()方法。
還有servlet 中的環境配置、參數獲取及會話跟蹤等不詳細列出。