讀書筆記:Servlet JSP和Spring MVC初學指南
Servlet JSP和Spring MVC初學指南,作者: 克尼亞萬 (Budi Kurniawan) / 戴克 (Paul Deck)
目錄
內容提要
Servlet和JSP是開發Java Web應用程序的兩種基本技術。Spring MVC是Spring框架中用于Web應用快速開發的一個模塊, 是當今最流行的Web開發框架之一。
前言
Servlet/JSP應用架構
Web用戶通過Web瀏覽器來訪問Servlet應用。通常,Web瀏覽器又叫Web客戶端。
Web服務器和Web客戶端問通過HTTP協議通信,因此Web服務器也叫HTTP服務器。
Servlet和JSP只是Java企業版中眾多技術中的兩個,其他Java EE技術還有Java消息服務,企業Java對象、JavaServer Faces以及Java持久化等,完整的Java EE技術列表可以訪問如下地址:
https://www.oracle.com/java/technologies/java-ee-8.html
我們可以將一個 Servlet/JSP 應用部署到一個Java EE容器上,但一個Servet/JSP容器就已經滿足需要了,并且更加輕量。
HTTP
HTTP 1.1版本的RFC編號是2616,下載地址
為 https://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf
2011年,標準化組織IETF發布了WebSocket協議,即RFC 6455規范。該協議允許一個HTTP連接升級為WebSocket連接,支持雙向通信,這就使得服務端可以通過WebSocket協議主動發起同客戶端的會話通信。
通常,HTTP的URL格式如下
protocol://[host.]domain[:port][/context][/resource] [?query string]
另外,example.com 或者example.org無法被注冊,因為它們被保留作為各類文檔手冊舉例使用。
localhost 作為一個保留關鍵字,用于指向本機。
URL中的context部分用來代表應用名稱,該部分也是可選的。一臺 Web服務器可以運行多個上下文(應用),其中一個可以配置為默認上下文,對于訪問默認上下文中的資源,可以跳過context部分。
最后,一個context 可以有一個或多個默認資源(通常為index.html, index.htm 或者default.htm)。一個沒有帶資源名稱的URL通常指向默認資源。當存在多個默認資源時,其中最高優先級的資源將被返回給客戶端。
在資源名之后可以有一個或多個查詢語句或者路徑參數。查詢語句是一個Key/Value組,多個查詢語句間用“&”符號分隔。路徑參數類似于查詢語句,但只有value部分,多個value部分用“/" 符號分隔。
HTTP請求
一個HTTP請求包含三部分內容:
- 方法-URI-協議/版本
- 請求頭信息
- 請求正文
HTTP響應
同HTTP請求一樣,HTTP響應包含三部分:
- 協議一狀態碼描述
- 響應頭信息
- 響應正文
第一部分 Servlets和SP
第1章 Servlets 3
1.1 Servlet API概覽 3
1.2 Servlet 4
init、service 和destroy是生命周期方法。Servlet 容器根據以下規則調用這3個方法:
- init,當該Servlet第一次 被請求時,Servlet 容器會調用這個方法。
- service,每當請求Servlet 時,Servlet 容器就會調用這個方法。
- destroy,當要銷毀Servlet時,Servlet 容器就會調用這個方法。
1.3 編寫基礎的Servlet應用程序 5
1.3.1 編寫和編譯Servlet類 5
1.3.2 應用程序目錄結構 7
放在應用程序目錄下的任何資源,用戶只要輸入資源URL,都可以直接訪問到。如果想讓某一個資源可以被Servlet訪問,但不可以被用戶訪問,那么就要把它放在WEB-INF目錄下。
現在,準備將應用程序部署到Tomcat。使用Tomcat 時,一種部署方法是將應用程序目錄復制到Tomcat 安裝目錄下的webapps目錄中。也可以通過在Tomeat 的conf目錄中編輯serverxml文件實現部署。
部署Servlet/JSP應用程序時,建議將它部署成一個WAR文件。WAR文件其實就是以.war作為擴展名的JAR文件。然后,將WAR文件復制到Tomcat的webapps目錄下。當開始啟動Tomeat時,Tomcat就會自動解壓這個war文件。
1.3.3 調用Servlet 8
要測試這個Servlet, 需要啟動或者重啟Tomcat, 并在瀏覽器中打開下面的URL可以輸出對應的頁面。
1.4 ServletRequest 8
1.5 ServletResponse 9
1.6 ServletConfig 9
1.7 ServletContext 12
1.8 GenericServlet 12
1.9 Http Servlets 14
1.9.1 HttpServlet 15
1.9.2 HttpServletRequest 16
1.9.3 HttpServletResponse 16
1.10 處理HTML表單 17
你可以輕松地將一個 HTML表單從一個Servlet 發送到瀏覽器。當用戶提交表單時,在表單元素中輸入的值就會被當作請求參數發送到服務器。
現在,填寫表單,并單擊Submit按鈕。在表單中輸入的值,將利用HTTP POST方法被發送給服務器,這樣就會調用Servlet 的doPost方法。
1.11 使用部署描述符 22
部署的一個方面是用一個路徑配置Servlet的映射。
利用部署描述符是配置Servlet應用程序的另一種方法。部署描述符總是命名為web.xml, 并且放在WEB-INF 目錄下。
清單:部署描述符
<servlet-mapping>
<servlet-name>SimpleServlet</servlet -name>
<url-pattern>/simple</url-pattern>
</servlet-mapping>
1.12 小結 24
Servlet技術是Java EE技術的一部分。 所有Servlet都運行在Servlet容器中,容器和Servlet間的接口為javax sevet.Servlet. javax.servlet。
第 2章 會話管理 25
由于HTTP的無狀態性,一個 Web 服務器無法區分一個HTTP請求是否為第一次訪問。
例如,一個Web郵件應用要求用戶登錄后才能查看郵件,
本章將闡述4種不同的狀態保持技術: URL重寫、隱藏域、cookies 和HTTPSession對象。
2.1 URL重寫 25
URL重寫是一種會話跟蹤技術, 它將一個或多個token添加到URL的查詢字符串中,每
個token通常為key=value形式,如下:
url?key-1=value-1&key-2=value-2
注意,URL和tokens間用問號(? )分割,token 間用與號(&)。
有如下限制:
- URL在某些瀏覽器上最大長度為2000字符;
- 若要傳遞值到下一個資源,需要將值插入到鏈接中,換句話說,靜態頁面很難傳值;
- URL重寫需要在服務端上完成,所有的鏈接都必須帶值,因此當一個頁面存在很多鏈接時,處理過程會是一個不小的挑戰;
- 某些字符,例如空格、與和問號等必須用base64編碼;
- 所有的信息都是可見的,某些情況下不合適。
示例:若選擇了倫敦,并點擊了Page2,則將以下URL發送給服務端:
http: //localhost: 8080/app02a/top10?city=london&page=2
2.2 隱藏域 30
使用隱藏域來保持狀態類似于URL重寫技術,但不是將值附加到URL上,而是放到HTML表單的隱藏域中。當表單提交時,隱藏域的值也同時提交到服務器端。隱藏域技術僅當網頁有表單時有效。該技術相對于URL重寫的優勢在于:沒有字符數限制,同時無須額外
的編碼。但該技術同URL重寫一樣, 不適合跨越多個界面。
該隱藏域為所編輯的客戶id,因此當表單提交時,服務端就知道應更新哪個客戶信息。
2.3 Cookies 34
Cookies是一個很少的信息片段, 可自動地在瀏覽器和 Web服務器間交互。
瀏覽器在訪問同一Web 服務器時,會將之前收到的cookie一并發送。
2.4 HttpSession對象 41
一個用戶可以有且最多有一個HttpSession并且不會被其他用戶訪問到。
HttpSession對象在用戶第一次訪問網站的時候自動被創建, 你可以通過調用HttpServletRequest的getSession方法獲取該對象。
請注意,不同于URL重寫、隱藏域或cookie,放入到HttpSession的值,是存儲在內存中的,因此,不要往HttpSession放入太多對象或大對象。
注意,所有保存在HttpSession的數據不會被發送到客戶端,不同于其他會話管理技術,Servlet容器為每個HttpSession生成唯一的標識, 并將該標識發送給瀏覽器。
ShoppingCartServlet 映射有如下URL:
- /products:顯示所有商品。
- /viewProductDetails:展示.個商品的細節。
- /addToCart:將一個商品添加到購物車中
- /viewCart:展示購物車的內容。
除/addToCart外,其他URL都會調用doGCet方法。doGet首先根據所請求的URL來生成相應內容:
String uri = request.getRequestURI();
if (uri.endsWith("/products")) {
sendProductList(response) ;
} else if (uri.endsWith("/viewProductDetails") {
sendProductDetails (request, response) ;
} else if (uri.endsWith ("viewCart")) {
showCart(request, response) ;
}
如下URL訪問應用的主界面:
http://localhost: 8080/app02a/products
當用戶單擊View Cart (查看購物車)鏈接時,Web容器調用showCart方法,獲取當前用戶的Htt
pSession并調用其gettribute方法來獲取購物商品列表:
HttpSession session = request.getSession();
List<ShoppingItem> cart = (List<ShoppingItem>) session.getAttribute (CART ATTRIBUTE) ;
然后迭代訪問List對象,并將購物項發送給瀏覽器:
if (cart != null) {
for (ShoppingItem shoppingItem:cart) {
Product product = shoppingItem.getProduct();
int quantity = shoppingItem.getQuantity();
2.5 小結 49
第3章 JavaServer Pages(JSP) 50
Servlet 有兩個缺點是無法克服的: 首先,寫在Servlet中的所有HTML標簽必須包含Java 字符串,這使得處理HTTP響應報文的工作十分煩瑣:第二,所有的文本和HTML標記是硬編碼,導致即使是表現層的微小變化,如改變背景顏色,也需要重新編譯。
JavaServer Pages (JSP)解決了上述兩個問題。同時,JSP 不會取代Servlet,相反,它們具有互補性。
3.1 JSP概述 50
首先,不必編譯JSP頁面:其次,JSP 頁面是一個以jsp為擴展名的文本文件。
JSP頁面在JSP容器中運行,一個Servlet 容器通常也是 JSP容器。
容器就是運行環境。
Servlet/JSP容器主要做以下兩件事情:
(1)轉換JSP頁面到JSP頁面實現類,
(2)如果轉換成功,Servlet/JSP容器隨后編譯該Servlet類,并裝載和實例化該類。
一個JSP頁面的第一次調用的實際花費總比后來的花費多,因為它涉及翻譯和編
譯。為了解決這個問題,可以執行下列動作之一:
- 配置應用程序,使所有的JSP頁面在應用程序啟動時被調用(實際上也可視為翻譯和編譯),而不是在第一次請求時調用。
- 預編譯 JSP頁面,并將其部署為Servlet。
JSP頁面可以包含模板數據和語法元素。這里,語法元素是一些具有特殊意義的 JSP轉換符。例如,“<%”是一個元素,因為它表示在JSP頁面中的Java代碼塊的開始。“%>”也是一個元素,因為它是Java代碼塊的結束符。
清單3.1 welcome.jsp
<html>
<head><title>Welcome</tit1e></head>
<body>
Welcome
</body>
</html>
在Tomcat中,welcome.jsp 頁面在第一次請求時 被翻譯成名為welcome jsp 的Servlet。你可以在Tomcat工作目錄下的子目錄中找到生成的Servlet。
servlet是java代碼。
welcom.jsp --> servlet --> HTML
JSP java運行環境
可以通過如下URL訪問welcome.jsp頁面:
http://localhost:8080/app03a/welcome.jsp
如何在JSP頁面中使用Java代碼來生成動態頁面。
<body>
<%
DateFormat dateFormat =
DateFormat. getDate Instance (DateFormat.LONG);
String s = dateFormat. format (new Date());
out.println("Today is”+ s);
%>
</body>
todaysDate.jsp頁面發送了幾個HTML標簽和字符串“今天是”以及今天的日期到瀏覽器。
請注意兩件事情。首先,Java 代碼可以出現在JSP頁面中的任何位置,并通過
"<%"和“%>”包括起來。
"<%...%>”塊被稱為scriplet。
3.2 注釋 54
JSP支持兩種不同的注釋格式:
(1) JSP注釋。該注釋記錄頁面中做了什么。
(2) HTML/XHTML注釋。這些注釋將會發送到瀏覽器上。
JSP注釋以“<%--”開始,以“--%>”結束。下面是一個例子:
<%-- retrieve products to display --%>
JSP注釋不會被發送到瀏覽器端,也不會被嵌套。
HTML/XHTML注釋語法如下:
<!-- retrieve products to display --!>
一個HTML/XHTML注釋不會被容器處理,會原樣發送給瀏覽器。
3.3 隱式對象 55
Servlet容器會傳遞幾個對象給它運行的Servlet。例如,可以通過Servlet的
service方法拿到HttpServletRequest 和HttpServletResponse 對象,以及可以通過init 方法訪問到ServletConfig對象。此外,可以通過調用HttpServletRequest 對象的getSession 方法訪問到HttpSession對象。處理HTML頁面
此外,PageContext中提供了另組有趣的方法:用于獲取和設置屬性的方法,即getAttribute方法和setAttribute方法。屬性值可被存儲在4個范圍之一: 頁面、請求、會話和應用程序。
3.4 指令 58
指令是JSP語法元素的第一種類型。 它們指示JSP轉換器如何翻譯JSP頁面為Servlet。
3.4.1 page指令 58
可以使用page指令來控制JSP轉換器轉換當前JSP頁面的某些方面。例如,可以告訴JSP用于轉換隱式對象out的緩沖器的大小、內容類型,以及需要導入的Java類型,等等。
page指令的語法如下:
<%@ page attribute1="valuel" attribute2="value2" %>
3.4.2 include指令 59
可以使用inelude指令將其他文件中的內容包含到當前JSP頁面。
include指令的語法如下:
<%@ include file="url" %>
3.5 腳本元素 60
.個腳本程序是一個 Java 代碼塊,以<%符號開始, 以%>符號結束。
3.5.1 表達式 61
表達式以<%=符號開始, 以%>符號結束。
3.5.2 聲明 61
3.5.3 禁用腳本元素 64
3.6 動作 65
3.6.1 useBean 65
3.6.2 setProperty和getProperty 66
3.6.3 include 67
對于include 指令,資源引入發生在頁面轉換時,即當JSP容器將頁面轉換為生成的Servlet 時。而對于include動作,資源引入發生在請求頁面時。
3.6.4 forward 67
3.7 錯誤處理 67
請使用page指令的isErrorPage屬性(屬性值必須為True)來標識一個 JSP頁面是錯誤
頁面。
3.8 小結 68
第4章 表達式語言 69
4.1 表達式語言的語法 69
EL表達式以${開頭,并以}結束。
例如,表達式x+y,可以寫成:
${x+y}
4.1.1 關鍵字 70
以下是關鍵字,它們不能用作標識符:
and or not eq ne lt gt le ge
4.1.2 [ ]和.運算符 70
為了訪問對象的屬性,可以使用以下任意一種形式:
${object["propertyName"] }
${object.propertyName }
4.1.3 取值規則 71
4.2 訪問JavaBean 71
4.3 EL隱式對象 72
4.3.1 pageContext 72
4.3.2 initParam 73
4.3.3 param 73
4.3.4 paramValues 73
4.3.5 header 74
4.3.6 cookie 74
隱式對象cookie可以用來獲取一個cookie。
4.3.7 applicationScope、sessionScope、requestScope和pageScope 74
4.4 使用其他EL運算符 75
4.4.1 算術運算符 75
4.4.2 邏輯運算符 75
下面是邏輯運算符列表:
- 和(
&&和and)
4.4.3 關系運算符 76
下面是關系運算符列表:
- 等于(== 和eq)
4.4.4 empty運算符 76
4.5 應用EL 76
4.6 如何在JSP 2.0及其更高版本中配置EL 80
4.6.1 實現免腳本的JSP頁面 80
4.6.2 禁用EL計算 80
4.7 小結 81
第5章 JSTL 82
JSP標準標簽庫(JavaServer Pages Standard Tag Library, JSTL)是一個定制標簽庫的集合,用來解決像遍歷Map或集合、條件測試、XML處理,甚至數據庫訪問和數據操作等常見的問題。
JSP中寫java程序
JSTL標簽庫
| 區域 | 子函數 | URI | 前綴 |
|---|---|---|---|
| 核心 | 變量支持 | http://java.sun.com/jsp/jstl/core | c |
| 流控制 | |||
| URL管理 | |||
| 其他 | |||
| 例如,要使用Core庫,必須在JSP頁面的開頭處做以下聲明: 引入庫 |
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
5.1 下載JSTL 82
5.2 JSTL庫 82
5.3 一般行為 83
5.3.1 out標簽 83
使用庫
<c:out value="value">
5.3.2 set標簽 84
5.3.3 remove標簽 86
5.4 條件行為 86
5.4.1 if標簽 87
5.4.2 choose、when和otherwise標簽 88
5.5 遍歷行為 89
5.5.1 forEach標簽 89
5.5.2 forTokens標簽 96
5.6 格式化行為 99
5.6.1 formatNumber標簽 99
5.6.2 formatDate標簽 101
5.6.3 timeZone標簽 102
5.6.4 setTimeZone標簽 103
5.6.5 parseNumber標簽 104
5.6.6 parseDate標簽 104
5.7 函數 106
5.7.1 contains函數 106
5.7.2 containsIgnoreCase函數 106
5.7.3 endsWith函數 106
5.7.4 escapeXml函數 107
5.7.5 indexOf函數 107
5.7.6 join函數 107
5.7.7 length函數 107
5.7.8 replace函數 108
5.7.9 split函數 108
5.7.10 startsWith函數 108
5.7.11 substring函數 108
5.7.12 substringAfter函數 109
5.7.13 substringBefore函數 109
5.7.14 toLowerCase函數 109
5.7.15 toUpperCase函數 109
5.7.16 trim函數 109
5.8 小結 110
JSTL可以完成一般的任務(如遍歷、集合和條件)、處理XML文檔、格式化文本、訪間數據庫以及操作數據, 等等。
第6章 自定義標簽 111
6.1 自定義標簽概述 111
6.2 簡單標簽處理器 112
6.3 SimpleTag示例 112
6.3.1 編寫標簽處理器 113
6.3.2 注冊標簽 114
6.3.3 使用標簽 114
6.4 處理屬性 115
6.5 訪問標簽內容 118
6.6 編寫EL函數 120
6.7 發布自定義標簽 122
6.8 小結 124
第7章 標簽文件 125
7.1 Tag File簡介 125
7.2 第 一個Tag File 126
7.3 Tag File指令 127
7.3.1 tag指令 127
7.3.2 include指令 128
7.3.3 taglib指令 130
7.3.4 attribute指令 131
7.3.4 variable指令 132
7.4 doBody 134
7.5 invoke 137
7.6 小結 138
第8章 監聽器 139
Servlet API提供了一系列的事件和事件監聽接口。上層的servletJSP應用能夠通過調用這些API進行事件驅動的開發。監聽器接口可以分為三類: ServletContext. HttpSession 和ServletRequest。
8.1 監聽器接口和注冊 139
8.2 Servlet Context監聽器 140
8.2.1 ServletContextListener 140
8.2.2 ServletContextAttributeListener 142
8.3 Session Listeners 142
8.3.1 HttpSessionListener 142
8.3.2 HttpSessionAttributeListener 145
8.3.3 HttpSessionActivationListener 145
8.3.4 HttpSessionBindingListener 146
8.4 ServletRequest Listeners 147
8.4.1 ServletRequestListener 147
8.4.2 ServletRequestAttributeListener 149
8.5 小結 149
本章,我們學習了Servlet API提供的多個監聽器類型。這些監聽器可以分成三類: application范圍、session范圍和request范圍。
第9章 Filters 150
Filter是攔截Request請求的對象:在用戶的請求訪問資源前處理ServletRequet以及ServletResponse,它可用于日志記錄、加解密、Session 檢查、圖像文件保護等。
9.1 Filter API 150
9.2 Filter配置 151
9.3 示例1:日志Filter 153
作為第1個例子,將做一個簡單的Filter:在app09a的應用中把Request請求的URL記來到日志文本文件中。
9.4 示例2:圖像文件保護Filter 156
9.5 示例3:下載計數Filter 158
9.6 Filter順序 162
9.7 小結 162
第 10章 修飾Requests及Responses 163
10.1 Decorator模式 163
10.2 Servlet封裝類 164
10.3 示例:AutoCorrect Filter 165
10.4 小結 172
第 11章 異步處理 173
11.1 概述 173
11.2 編寫異步Servlet和過濾器 173
11.3 編寫異步Servlets 174
11.4 異步監聽器 179
11.5 小結 181
第 12章 安全 182
12.1 身份驗證和授權 182
12.1.1 指定用戶和角色 183
12.1.2 實施安全約束 184
security-constraint元素指定一個資源集合和角色或角色可以訪問的資源。這個元素有兩個子元素: web-resource-collection 和auth-constraint。
12.2 身份驗證方法 185
12.2.1 基于表單的認證 189
12.2.2 客戶端證書認證 192
12.3 安全套接層 192
12.3.1 密碼學 192
12.3.2 加密/解密 193
12.3.3 認證 193
12.3.4 數據的完整性 195
12.3.5 SSL是怎么工作的 195
12.4 編程式安全 196
12.4.1 安全注釋類型 196
12.4.2 Servlet的安全API 197
12.5 總結 199
第 13章 部署 200
13.1 概述 200
13.1.1 核心元素 202
13.1.2 context-param 202
13.1.3 distributable 202
13.1.4 error-page 202
13.1.5 filter 203
13.1.6 filter-mapping 204
13.1.7 listener 204
13.1.8 locale-encoding-mapping-list
和locale-encoding-
mapping 204
13.1.9 login-config 205
13.1.10 mime-mapping 205
13.1.11 security-constraint 206
13.1.12 security-role 207
13.1.13 Servlet 207
13.1.14 servlet-mapping 209
13.1.15 session-config 209
13.1.16 welcome-file-list 209
13.1.17 JSP-Specific
Elements 210
13.1.18 taglib 210
13.1.19 jsp-property-group 210
13.2 部署 212
從Servlet 1.0 開始,可以很方便地部署一個 Servlet/JSP 應用程序。僅需要將應用原始目錄結構壓縮成一個 WAR文件。可以在JDK中使用jar工具或流行的工具,如WinZip。需要確保壓縮文件有.war擴展名。如果使用WinZip,則在壓縮完成后重命名文件。
WAR文件必須包含所有庫文件、類文件、HTML文件、JSP 頁面、圖像文件以及版權聲明(如果有的話)等,但不包括Java 源文件。任何人都可以獲取一個WAR文件的副本,井部署到一個Servlet/JSP容器上。
13.3 web fragment 212
13.4 小結 214
第 二部分 Spring mvc
第 14章 動態加載及Servlet
容器加載器 217
14.1 動態加載 217
14.2 Servlet容器加載器 220
14.3 小結 222
第 15章 Spring框架 223
15.1 Spring入門 223
15.2 依賴注入 223
依賴注入框架會分別創建對象A和對象B,將對象B注入到對象A中。
15.3 XML配置文件 226
15.4 Spring控制反轉容器的
使用 226
15.4.1 通過構造器創建一個
bean實例 226
15.4.2 通過工廠方法創建
一個bean實例 227
15.4.3 Destroy Method的
使用 227
15.4.4 向構造器傳遞參數 228
15.4.5 setter方式依賴注入 229
15.4.6 構造器方式依賴
注入 231
15.5 小結 232
第 16章 模型2和MVC模式 233
16.1 模型1介紹 233
16.2 模型2介紹 233
16.3 模型2之Servlet控制器 234
16.3.1 Product類 236
16.3.2 ProductForm類 237
16.3.3 ControllerServlet類 238
16.3.4 視圖 241
16.3.5 測試應用 243
16.4 解耦控制器代碼 243
16.5 校驗器 247
16.6 后端 251
16.7 小結 252
第 17章 Spring MVC介紹 253
Spring MVC框架可以幫助開發人員快速地開發MVC應用。
17.1 采用Spring MVC的好處 253
17.2 Spring MVC的
DispatcherServlet 254
17.3 Controller接口 255
17.4 第 一個Spring MVC應用 255
17.4.1 目錄結構 255
17.4.2 部署描述符文件和Spring
MVC配置文件 256
17.4.3 Controller 257
17.4.4 View 259
17.4.5 測試應用 260
17.5 View Resolver 261
17.6 小結 263
第 18章 基于注解的控制器 264
18.1 Spring MVC注解類型 264
18.1.1 Controller注解
類型 264
18.1.2 RequestMapping
注解類型 265
18.2 編寫請求處理方法 267
18.3 應用基于注解的控制器 269
18.3.1 目錄結構 269
18.3.2 配置文件 270
18.3.3 Controller類 272
18.3.4 View 273
18.3.5 測試應用 274
18.4 應用@Autowired和@Service
進行依賴注入 275
18.5 重定向和Flash屬性 278
作為一個經驗豐富的ServletUJSP程序員,必須知道轉發和重定向的區別。轉發比重定向快,因為重定向經過客戶端,而轉發沒有。但是,有時采用重定向更好,若需要重定向到一個外部網站,則無法使用轉發。
使用重定向的一個不便的地方是:無法輕松地傳值給目標頁面。而采用轉發,則可以簡單地將屬性添加到Model,使得目標視圖可以輕松訪問。由于重定向經過客戶端,所以Model中的一切都在重定向時丟失。幸運的是,Spring 3.1版本以及更高版本通過Flash 屬性提供了一種供重定向傳值的方法。
18.6 請求參數和路徑變量 279
18.7 @ModelAttribute 281
18.8 小結 282
第 19章 數據綁定和表單標簽庫 283
19.1 數據綁定概覽 283
19.2 表單標簽庫 284
| 標簽 | 描述 |
|---|---|
| form | 渲染表單元素 |
| input | 渲染<input type="text"/>元素 |
19.2.1 form標簽 284
19.2.2 input標簽 285
19.2.3 password標簽 286
19.2.4 hidden標簽 287
19.2.5 textarea標簽 287
19.2.6 checkbox標簽 287
19.2.7 radiobutton標簽 288
19.2.8 checkboxes標簽 288
19.2.9 radiobuttons標簽 289
19.2.10 select標簽 290
19.2.11 option標簽 290
19.2.12 options標簽 291
19.2.13 errors標簽 291
19.3 數據綁定范例 292
19.3.1 目錄結構 292
19.3.2 Domain類 293
19.3.3 Controller類 294
19.3.4 Service類 295
19.3.5 配置文件 298
19.3.6 視圖 299
19.3.7 測試應用 301
19.4 小結 302
第 20章 轉換器和格式化 303
20.1 Converter 303
20.2 Formatter 307
20.3 用Registrar注冊
Formatter 310
20.4 選擇Converter,還是
Formatter 312
20.5 小結 312
第 21章 驗證器 313
21.1 驗證概覽 313
驗證器則作用于object級。它決定某一個對象中的所有field是否均是有效的,以及是否遵循某些規則。
21.2 Spring驗證器 314
21.3 ValidationUtils類 315
21.4 Spring的Validator范例 316
21.5 源文件 317
21.6 Controller類 318
21.7 測試驗證器 319
21.8 JSR 303驗證 320
@Min(value)被注釋的元素必須是一個數字,其值必須大于等于指定的最小值
@Max(value)被注釋的元素必須是一個數字,其值必須小于等于指定的最大值
21.9 JSR 303 Validator范例 322
21.10 小結 323
第 22章 國際化 324
22.1 語言區域 324
22.2 國際化Spring MVC
應用程序 326
22.2.1 將文本元件隔離成
屬性文件 326
22.2.2 選擇和讀取正確的
屬性文件 328
22.3 告訴Spring MVC使用哪個
語言區域 329
22.4 使用message標簽 329
22.5 范例 330
22.6 小結 334
第 23章 上傳文件 335
為此,在Spring MVC中處理文件上傳有兩種方法:
(1)購買Apache Commons FileUpload元件。
(2)利用Servlet 3.0及其更高版本的內置支持。
23.1 客戶端編程 335
23.2 MultipartFile接口 336
23.3 用Commons FileUpload
上傳文件 336
23.4 Domain類 337
23.5 控制器 338
23.6 配置文件 340
23.7 JSP頁面 341
23.8 應用程序的測試 343
23.9 用Servlet 3.0及其更高版本
上傳文件 344
23.10 客戶端上傳 347
雖然Servlet 3.0中的文件上傳特性使文件上傳變得十分容易,只需在服務器端編程即可,但這對提升用戶體驗毫無幫助。單獨一個 HTML表單并不能顯示進度條,或者顯示已經成功工傳的文件數量。開發人員采用了各種不同的技術來改善用戶界面,例如,單獨用一個瀏覽器線程對服務器發出請求,以便報告上傳進度。
HTML 5在其DOM中添加了一個FileAPI。它允許訪問本地文件。HTML 5似乎是針對客戶端文件上傳局限性的最佳解決方案。
23.11 小結 355
第 24章 下載文件 356
像圖片或者HTML文件這樣的靜態資源,在瀏覽器中打開正確的URL即可下載。只要該資源是放在應用程序的目錄下,或者放在應用程序目錄的子目錄下,而不是放在WEB-INF下,ServletJSP 容器就會將該資源發送到瀏覽器。然而,有時靜態資源是保存在應用程序目錄外,或者是保存在某一個數據庫中, 或者有時需要控制它的訪間權限, 防止其他網站交叉引用它。如果出現以上任意一種情況, 都必須通過編程來發送資源。
24.1 文件下載概覽 356
24.2 范例1:隱藏資源 357
24.3 范例2:防止交叉引用 360
24.4 小結 363
附錄A Tomcat 364
A.1 下載和配置Tomcat 364
A.2 啟動和終止Tomcat 364
A.3 定義上下文 365
A.4 定義資源 366
A.5 安裝SSL證書 366
附錄B Web Annotations 368
B.1 HandlesTypes 368
B.2 HttpConstraint 368
B.3 HttpMethodConstraint 369
B.4 MultipartConfig 369
B.5 ServletSecurity 370
B.6 WebFilter 370
B.7 WebInitParam 371
B.8 WebListener 371
B.9 WebServlet 371
附錄C SSL證書 372
C.1 證書簡介 372
C.2 KeyTool 373
C.2.1 生成密鑰對 373
C.2.2 獲得認證 374
C.2.3 將證書導入到密鑰庫 375
C.2.4 從密鑰庫導出證書 375
C.2.5 列出密鑰庫條目 375

浙公網安備 33010602011771號