第7章 JSP的表單處理與Cookie 7-1 JSP狀態管理的基礎 7-2 URL參數傳遞 7-3 HTML表單欄位處理 7-6 取得HTTP標頭和系統環境變數
7-1 JSP狀態管理的基礎 7-1-1 HTTP通訊協定的特性 7-1-2 狀態管理的種類
7-1-1 HTTP通訊協定的特性 HTTP通訊協定不會持續保持連線:當瀏覽程式提出請求時才會建立連線,在請求後就斷線等待回應,每一次請求和回應都需事先建立連線。 HTTP通訊協定並不會保留狀態:因為HTTP通訊協定並不會保持連線,所以在連線時,伺服端和客戶端互相知道對方,一旦請求結束,就互不相干,使用者狀態並不會保留。 HTTP通訊協定與資料類型無關:任何種類的資料都可以透過HTTP通訊協定傳送到客戶端,這就是Content-Type標頭資訊指定的MIME資料類型。
7-1-2 狀態管理的種類-說明 狀態管理(State Management)是在JSP程式間傳遞資料,以便不同的JSP程式能夠保留使用者狀態。 狀態管理以狀態資訊儲存的位置,可以區分成兩大類:儲存在客戶端和伺服端。
7-1-2 狀態管理的種類-客戶端的狀態管理 客戶端的狀態管理是將資料儲存在使用者電腦,或是儲存在JSP程式建立的網頁標籤中,以便將資料傳遞給下一頁JSP程式,常用的方法如下表所示:
7-1-2 狀態管理的種類-伺服端的狀態管理 伺服端的狀態管理是將資料儲存在伺服端的電腦,換句話說,狀態管理的使用者狀態資訊會佔用伺服器的資源,常用的方法如下表所示:
7-2 URL參數傳遞-說明 在瀏覽程式輸入的URL網址,或是JSP程式將HTTP請求轉向到其它JSP程式時,都可以使用URL參數來傳遞資料。 如果在URL網址附加有參數,JSP程式可以使用request物件的方法,或JSTL的param隱含物件來取得傳遞的參數值。
7-2 URL參數傳遞-方法1 在HTML超連結標籤<a href="">…</a>的href屬性後加上參數,如下所示: <a href="Ch7_2next.jsp?Username=陳會安 &Password=1234"> </a> <jsp:include>動作元素使用<jsp:param>動作元素傳遞參數,如下所示: <jsp:include page="Ch7_2next.jsp“ flush="true"> <jsp:param name="Username" value="江小魚"/> <jsp:param name="Password“ value="5678"/> </jsp:include>
7-2 URL參數傳遞-方法2 <jsp:forward>動作元素使用<jsp:param>動作元素傳遞參數,如下所示: <jsp:forward page="Ch7_2next.jsp"> <jsp:param name="Username" value="張無忌"/> <jsp:param name="Password" value="9012"/> </jsp:forward> JSTL的<c:redirect>標籤也可以傳遞參數,使用<c:param>標籤建立這些參數,如下所示: <c:redirect url="Ch7_2next.jsp"> <c:param name="Username" value="小龍女"/> <c:param name="Password" value="7890"/> </c:redirect> HTML表單使用GET方法,詳細的說明請參閱下一節。
7-2 URL參數傳遞-取得URL傳遞的參數值 在JSP程式是使用request物件的方法取得URL參數值,如下所示: username = request.getParameter("Username"); password = request.getParameter("Password"); 上述程式碼取得參數名稱是Username和Password的值。
7-3 HTML表單欄位處理 7-3-1 HTML表單的用途 7-3-2 HTML標籤建立網頁表單 7-3-3 文字方塊與密碼欄位 7-3-4 文字區域 7-3-5 核取方塊 7-3-6 下拉式清單方塊 7-3-7 選擇鈕 7-3-8 隱藏欄位 7-3-9 同名與複選的表單欄位處理
7-3-1 HTML表單的用途 JSP程式是在伺服端執行,換句話說,客戶端的HTML表單只是負責取得使用者輸入的資料,然後將輸入資料送到伺服端進行處理,如下圖所示:
7-3-2 HTML標籤建立網頁表單-說明 在HTML標籤關於HTML表單的標籤只有5個,如下表所示:
7-3-2 HTML標籤建立網頁表單-架構 網頁表單是上表HTML標籤的組合,基本表單的架構如下所示: <form name="name" method="post | get" action="URL" enctype="MIME"> <input type=…> <textarea> …. </textarea> <select> <option> …. </option> </select> <input type="submit" …> </form>
7-3-2 HTML標籤建立網頁表單-屬性說明 name屬性:表單名稱。 method屬性:設定資料送出方式,主要是針對伺服端處理,GET方法(不分大小寫)就是URL網址的參數傳遞,請處理方式和上一節相同,POST方法是使用HTTP通訊協定的標頭來傳遞欄位資料,如下所示: <form name="order" method="post"> </form> action屬性:設定JSP表單處理程式所在的路徑,也可以是URL網址,如下所示: <form name="order" method="post" action="Ch7_3_3.jsp"> enctype屬性:設定表單資料傳送時的編碼方式,預設使用application/x-www-form-urlencoded,除非使用在上傳檔案,否則並不用設定此屬性。
7-3-3 文字方塊與密碼欄位-表單欄位 文字方塊是使用最頻繁的表單欄位,因為它是直接傳遞使用者輸入的資料,例如:姓名、地址、電話等資料;密碼欄位只是輸入的字串以指定符號取代,在使用上和文字方塊並沒有什麼不同。
7-3-3 文字方塊與密碼欄位-取得欄位值 在JSP程式是使用request物件的getParameter()方法,如下所示: name = request.getParameter("Name"); password= request.getParameter("Password"); 上述程式碼取得參數名稱是Name和Password的值。在JSTL是使用param隱含物件來取得參數值,表單欄位就是物件屬性,如下所示: ${param.Username} ${param.Password}
7-3-4 文字區域-表單欄位 文字區域和文字方塊都可以讓使用者輸入資料,其輸入的資料是完整段落或整篇文字,特別適合在地址、描述或備註等文字內容。
7-3-4 文字區域-取得欄位值 在JSP程式取得文字區域欄位內容,如下所示: address = request.getParameter("Address"); out.print(address.replaceAll("\r\n","<br>")); 上述程式碼取得名為Address文字區域的內容,如果有換行,我們可以使用String物件的replaceAll()方法,將換行符號取代成<br>標籤。 在JSTL是使用param隱含物件來取得參數值,表單欄位就是物件屬性,如下所示: ${param.Address}
7-3-5 核取方塊-表單欄位 核取方塊是一個開關,可以讓使用者選擇是否開啟指定功能或設定某些參數,核取方塊欄位能夠複選,因為每一個都是獨立的開關。
7-3-5 核取方塊-取得欄位值 核取方塊在表單欄位扮演的角色是一個開關,JSP程式取得核取方塊欄位內容是檢查是否是null,以判斷是否勾選,如下所示: if (request.getParameter("Tel") != null) { out.print("使用電話來確認<br>"); } 在JSTL是使用param隱含物件來取得參數值,如下所示: <c:if test="${not empty param.Tel}"> 使用電話來確認<br> </c:if>
7-3-6 下拉式清單方塊-表單欄位 下拉式清單方塊和第7-3-7節選擇鈕的功能十分相似,都是選擇題,只不過以不同方式來顯示,而且下拉式清單方塊支援複選。
7-3-6 下拉式清單方塊-取得欄位值 JSP程式是使用request物件的getParameter()方法取得下拉式清單方塊各選項的value屬性值,如下所示: int ship = Integer.parseInt(request.getParameter("Ship")); 在JSTL是使用param隱含物件來取得參數值,表單欄位就是物件屬性,如下所示: <c:set var="ship" value="${param.Ship}"/>
7-3-7 選擇鈕-表單欄位 選擇鈕能夠在表單設計一組選項,在每一個選項名稱旁有一個圓形的選項鈕,建立多選一的單選題。
7-3-7 選擇鈕-取得欄位值 在JSP程式和JSTL是使用和下拉式清單方塊相同的方法來取得使用者的選擇。
7-3-8 隱藏欄位-HTML標籤 隱藏欄位並不會在表單網頁顯示輸入介面,它是直接將value屬性值傳送到伺服器,所以並不需要使用者輸入資料或進行選擇。 在HTML表單加上隱藏欄位的目的,就是將資料傳遞到Web伺服器,在JSP程式常常用來傳遞一些應用程式所需參數,例如:訂單號碼,或將上一步驟的欄位值傳到下一步驟的表單網頁。隱藏欄位的HTML標籤,如下所示: <input type="HIDDEN" name="Order" value="Order0001">
7-3-8 隱藏欄位-取得欄位值 JSP程式是使用與文字方塊相同的方式來取得欄位值,如下所示: <% order = request.getParameter("Order"); %> <c:out value="${param.Order}" default="無編號"/>
7-3-9 同名與複選的表單欄位處理-說明 在HTML表單的欄位名稱可能同名,而且下拉式清單方塊允許複選,此時JSP程式是使用request物件的getParameterValues()方法,如下所示:
7-3-9 同名與複選的表單欄位處理-取得欄位值1 JSP程式是使用request物件的getParameterValues()方法取得選擇的字串陣列,如下所示: String[] langs = request.getParameterValues("Languages"); for ( int i = 0; i < langs.length; i++ ) out.print("[" + langs[i] + "]");
7-3-9 同名與複選的表單欄位處理-取得欄位值2 在JSTL處理同名與複選表單欄位是使用paramValues隱含物件來取得欄位值或選項,如下所示: <c:forEach var="gift" items="${paramValues.Gifts}"> [<c:out value="${gift}"/>] </c:forEach>
7-4 HTML表單欄位驗證 7-4-1 網頁表單欄位的驗證方式 7-4-2 伺服端的表單欄位驗證
7-4-1 網頁表單欄位的驗證方式 在網頁表單欄位的驗證過程中,可以在兩個地方進行把關,如下所示: 客戶端表單欄位驗證:客戶端欄位驗證是指在尚未送到伺服端前,在客戶端的瀏覽程式進行檢查,目前來說,主要是使用JavaScript或VBScript等腳本語言進行表單欄位檢查。 伺服端表單欄位驗證:相對於客戶端的欄位驗證,伺服端的表單欄位驗證是在資料送到伺服端後,才進行資料檢查,也就是使用JSP程式碼進行欄位檢查。
7-4-2 伺服端的表單欄位驗證-說明 JSP程式在取得表單欄位值後,在真正處理前,可以使用if或JSTL的<c:if>標籤等條件敘述來檢查使用者輸入的欄位資料是否正確,或是忘了輸入指定的欄位資料。 如果輸入的資料錯誤,JSP程式並不會進行處理,而是顯示錯誤訊息,然後回到表單網頁要求使用者重新輸入。
7-4-2 伺服端的表單欄位驗證-圖例
7-5 Cookie處理 7-5-1 新增Cookie 7-5-2 取得Cookie值 7-5-3 刪除Cookie值
7-5 Cookie處理 Cookies的英文意義是小餅乾,源於這些儲存在客戶端電腦的檔案尺寸都很小(1KB左右),Cookies是儲存在瀏覽程式所在電腦,而不是伺服端,所以並不會浪費伺服器資源,其目的是記錄一些與使用者相關的瀏覽資訊。
7-5-1 新增Cookie-建立Cookie 在瀏覽程式的客戶端電腦建立Cookie需要在JSP程式建立Cookie物件,如下所示: Cookie newCookie = new Cookie("name", value); 上述程式碼建立名為name的Cookie物件,其值為value。 接著我們需要設定Cookie存在期限的壽命,如下所示: newCookie.setMaxAge(3000);
7-5-1 新增Cookie-Cookie物件的方法
7-5-1 新增Cookie-新增Cookie 最後請使用response隱含物件的addCookie()方法來新增Cookie到客戶端電腦,如下所示: response.addCookie(newCookie); 上述addCookie()方法的參數是Cookie物件。
7-5-2 取得Cookie值-JSP 當客戶端電腦已經儲存有Cookie時,JSP程式可以使用request隱含物件的getCookies()方法取得Cookie的物件陣列,如下所示: Cookie[] cookies = request.getCookies(); 取得Cookie物件陣列後可以使用for迴圈顯示每一個Cookie的名稱和值,如下所示: for ( int i = 0; i < cookies.length; i++ ) { Cookie myCookie = cookies[i]; String name = myCookie.getName(); String value = myCookie.getValue(); …… }
7-5-2 取得Cookie值-JSTL 在JSTL是使用cookie物件來取得Cookie,可以配合<c:forEach>迴圈標籤來顯示所有的Cookie名稱和值,如下所示: <c:forEach var="item" items="${cookie}"> Cookie名稱 : ${item.key} / 值 : ${item.value.value}<br> </c:forEach>
7-5-3 刪除Cookie值 Cookie物件在setMaxAge()方法設定的期限到時,就會自動刪除Cookie,不過,在JSP程式可以使用同一個方法來馬上刪除Cookie,如下所示: myCookie.setMaxAge(0); response.addCookie(myCookie);
7-6 取得HTTP標頭和系統環境變數 7-6-1 取得HTTP標頭資訊 7-6-2 取得系統環境變數
7-6-1 取得HTTP標頭資訊-方法 HTTP請求的標頭(HTTP Request Header)資訊,可以提供客戶端請求和伺服器的相關資訊。在JSP是屬於HttpServletRequest介面的方法,如下表所示:
7-6-1 取得HTTP標頭資訊-標頭名稱 HTTP常見的標頭資訊名稱和說明,如下表所示:
7-6-2 取得系統環境變數