close

需要上課的人員:

題目一:

程式碼如下:

請問Server端可以收到的參數與值為何:

答案:password=yorkP (反白中)

題目二:

程式碼如下:

請問Server端收到的參數與值為何?

答案:name=John,location=Boston(反白中)

請答錯的同仁進來聽課。

資料如何由Client前端傳遞到Server後端

前端的網頁在收集使用者填寫的資料,或是程式自訂的資料,可以利用幾種方法傳送到後端,我們一一來介紹。

URL with 參數

Http傳送協定中的其中一種--GET,這種傳送方式會在網址的後端帶上參數到Server,格式為:

URL?key1=value1&key2=value2

其中?是區隔網址與參數,而參數與參數中間利用&區隔,參數與值中間用=區隔。

form submit

form(表單)是HTML標籤中的其中一種,它會將在form裡宣告的<input … >...</input>、<select … > … </select>、<textarea … > … </textarea>這三種類型的資料送出給Server端,不過有幾點要注意的是:

  1. <input … >...</input>、<select … > … </select>、<textarea … > … </textarea>,這些標籤必須被包含在<form> … </form>裡,並利用submit的方式送出。

  2. <input … >...</input>、<select … > … </select>、<textarea … > … </textarea>,這些標籤必須包含一個name的屬性,原因是這個屬性的值會被當做送到Server端參數的key,所以如果沒有key的話,這個值當然也沒辦法被送出。

 

  • 在初學者之間常常遇到的迷思:

<input type="hidden" id="username" name="username" value="york" />

這一段HTML語法中,id與name到底有什麼不同,最大的不同是在form submit時,吃的參數是name,form會把name拿來當參數的key值,所以沒有name,這筆參數就不會被送到後端;而id是javascript用來操控方便使用而已,並不會影響到要傳送到後端的參數。

 

AJAX

AJAX是比較特殊的一種資料傳送方式,因為它算是在javascript中多開一條執行緒,用來即時傳送資料到後端並處理接收的資料,其中最特別的方法是它並不會影響使用者的操作,而且接收回來的資料並不會變更整個網址與網頁,不像上述的二種方法,在接收Server端回傳的網址時,是整個網址與網頁都替換掉。

因為AJAX比較特殊,所以它的寫法也比較麻煩,下方是很正規的AJAX寫法:

可以看到這樣的AJAX寫法不好理解且不好維護,所以JQuery發展了一套簡單的AJAX寫法,替代表上述的寫法,如下:

Client前端傳送資料的設計

雖然前端有這幾種方法可以傳送資料到後端,不過簡單的分類,總共有三種傳送的方式:

  1. GET:

網址包含參數,若參數過大會有封包大小限制的問題。

  1. POST:

網址不帶參數,若參數過大,瀏灠器會自動進行分段傳送,所以較不會有封包大小限制的問題,不過因為參數不在網址,所以重新整理時,Server端不會收到參數。

  1. AJAX:

瀏覽器另開執行緒執行,不影響網頁;不過傳送回來的資料不會將整個網頁重新處理。

因為有三種傳送資料的方式可以使用,那到底我們要用那一種方式來傳送資料到後端呢?通常會考慮幾種情況來決定。

  • 安全性:

GET的資料參數會呈現在網址上,所以很容易被別人看到,如果比較有安全性的問題,不適用GET,例如帳號、密碼等。

  • 使用者操作網頁重新整理時:

當網頁重新整理時,會以目前的網址列重新執行一次,所以POST的資料會遺失,而GET的資料因為帶在網址上,所以不會有問題;通常用在搜尋的狀態時,會以GET的方式來處理,因為目前頁數、查詢條件資料都被放在網址列,所以重新整理後會保留。

  • 方便時與即時性:

AJAX的方便在於它不會影響使用者在網頁上的操作,而正常的form submit會在資料回傳時,將網頁整個重組;所以在要不要使用AJAX的思考時,必須考慮這筆資料的傳送是否應該讓使用者等待後再繼續?如果是,那就不應該是使用AJAX,而是應該使用form submit的方式,或是它並不是需要使用者等待的,那就可以使用AJAX;通常在使用者註冊時,檢查帳密是否重覆的確認會使用AJAX,讓使用者方便繼續填寫會員資料。

特殊狀況:Checkbox的資料傳送與接收

在HTML的資料傳輸中,通常遇到的情況是一個key配一個value,不過有一種特殊的狀況叫做checkbox。

Checkbox的特殊情況在於,每一個不同的value,都會搭配相同的key,例如下圖的範例:

可以看到所有的checkbox都是配相同的name,此時送出的封包也是一樣,如下圖:

這時候後,後端如果使用request.getParameter("vehicle")這種方式來取值的話,會只取到一個值,所以要改用request.getParameterValues("vehicle")這種方式來取,如下圖。

Server後端接收資料

當資料由前端傳送到後端時,後端即可以透過javax.servlet.http.HttpServletRequest這個物件的getParameter(String key)的方法,根據傳入的key來取得對應的value值,而這個方法是很基礎的取得參數方法,但通常使用framework的話,都會有更方便的應用,下方我們來看struts2如何幫我們取得前端傳送過來的參數。

Struts2自動填入參數

在說明之前,首先有幾個必須要瞭解的:

  • 很多framework都有支援自動填入參數功能,不是只有struts2有做而已。

  • 自動填入參數的功能是引用JAVA的Reflection機制,並以JAVA命名規則為主(即setXxx)。

Action中的參數與命名規則

Struts2的Controller為Action,以前端觸發這個Action中的其中一個method並帶入參數的情況來說,我們直接來看程式碼比較容易瞭解。

首先是後端Action的程式碼:

有一個private屬性的field,並且有一個public屬性的setQ的method,此時在前端的網頁會寫成:

根據上一節教過的,這個值被送到後端時,它的key會是q(name="q"),所以Struts2會自動尋找有沒有setQ的public method可以呼叫,所以它會自動填入使用者填入的參數並存在query這個變數中,這個就是Struts2幫我們做好的自動填入功能。

進階版自動填入

上方講述的是簡易版的,接下來我們來看進階版的功能:

一樣在這個Action中有一個private的User屬性,而且它帶有一個setUser的public method;而這個User的程式如下:

而前端的程式會寫成:

這裡是JSP的寫法,實際上被處理為HTML時,它的語法會變成:

所以被送到後端時,因為key為user.username,所以會自動對到User的username中,而我們在Action中就可以直接使用user這個變數來取得所有對應的資料。

這個自動對應的方法是很好用的,想想,如果今天由我們手動寫程式來完成將所有的資料塞到User這個class裡面,要多寫個好幾十行的Code,所以framework真的幫我們省了好多功。

 

arrow
arrow
    創作者介紹
    創作者 JAVA Programmer 的頭像
    JAVA Programmer

    台灣的Web工程師

    JAVA Programmer 發表在 痞客邦 留言(0) 人氣()