做到昨天,我們已經可以完成:
HTML 表單
↓
Servlet
↓
JSP
↓
顯示資料
但是在寫 HTML 表單的時候,有一個地方其實一直出現:
這裡的:
method="post"
到底是什麼?
而且有時候我們又會看到:
method="get"
GET 和 POST 到底有什麼不同?
今天就來把它搞懂。
⸻
一、GET 和 POST 是什麼?
GET 和 POST 都是 HTTP Request Method,也就是:
瀏覽器告訴伺服器「我想做什麼」的方式。
最常見的兩個就是:
簡單記:
GET 比較常用來取得資料。
POST 比較常用來送出資料。
例如我們的醫療資訊系統:
查詢病患
我要找這個病患
↓
GET
↓
Servlet
↓
查詢資料
新增病患
我要新增這個病患
↓
POST
↓
Servlet
↓
處理資料
↓
存進 MySQL
所以兩者在系統裡扮演的角色不太一樣。
⸻
二、GET 是什麼?
假設我們想查詢病患:
病患編號:1001
可以使用 GET。
例如:
使用者輸入:
1001
送出之後,瀏覽器可能會看到類似:
/search?id=1001
你會發現:
資料出現在網址裡。
這就是 GET 很明顯的特色之一。
⸻
三、Servlet 怎麼接收 GET?
如果 HTML 使用:
method="get"
那 Servlet 就可以使用:
doGet()
例如:
@WebServlet("/search")
public class SearchServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String id = request.getParameter("id");
System.out.println("查詢病患:" + id);
}
}
當使用者查詢:
1001
Servlet 就可以取得:
request.getParameter("id");
得到:
1001
⸻
四、POST 又是什麼?
再來看看我們昨天使用的新增病患表單:
這次使用的是:
POST
例如:
使用者輸入:
姓名:小明
電話:0912345678
按下送出之後:
HTML
↓
POST
↓
PatientServlet
Servlet 裡面則使用:
doPost()
例如:
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String phone = request.getParameter("phone");
System.out.println(name);
System.out.println(phone);
}
⸻
五、GET 和 POST 最直觀的差別
可以先用這張表記:
比較 GET POST
常見用途 取得資料 傳送/提交資料
資料是否常出現在 URL 是 通常不會
適合查詢 ✅ 可以,但較少見
適合新增資料 不適合 ✅
Servlet 方法 doGet() doPost()
所以我們的醫療資訊系統可以這樣設計:
查詢病患
↓
GET
新增病患
↓
POST
修改病患
↓
POST
刪除病患
↓
POST
這是一個很基本的概念。
⸻
六、為什麼新增病患不能直接用 GET?
假設我們今天用 GET 新增病患:
/patient?name=小明&gender=男
網址就可能帶著這些資料。
但新增病患是一個「改變系統資料」的動作。
我們不希望只是因為:
使用者重新整理頁面、點了一個網址,甚至搜尋引擎去抓取網址
就意外造成資料新增。
所以一般來說:
取得資料可以使用 GET;會造成資料新增、修改或刪除的操作,通常使用 POST 或其他適合的方法。
這也是為什麼我們昨天的新增病患表單使用:
method="post"
⸻
七、GET 不等於「不安全」
這裡有一個很容易搞錯的地方。
很多初學者會想:
「POST 的資料不在網址,所以 POST 比 GET 安全?」
不能這樣直接理解。
GET 和 POST 本身都不是加密機制。
如果系統有:
姓名
電話
身分證字號
病歷資訊
這些醫療相關資料,更重要的是:
等等安全措施。
所以不要把:
POST = 安全
GET = 不安全
畫上等號。
⸻
八、放回我們的醫療資訊小系統
現在可以想像我們之後會有很多功能。
① 新增病患
新增病患
↓
POST
↓
PatientServlet
↓
MySQL
② 查詢病患
輸入病患編號
↓
GET
↓
SearchServlet
↓
MySQL
↓
JSP
③ 修改病患
修改資料
↓
POST
↓
PatientServlet
↓
MySQL
④ 刪除病患
刪除資料
↓
POST
↓
PatientServlet
↓
MySQL
慢慢地,我們的 CRUD 架構就會形成。
CRUD 就是:
C → Create 新增
R → Read 查詢
U → Update 修改
D → Delete 刪除
這也是我們這 30 天最後要完成的重要功能。
⸻
九、GET 和 POST 的程式差在哪?
其實 Servlet 裡面最大的差異很簡單。
GET
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String id = request.getParameter("id");
}
POST
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
}
取得參數的方法:
request.getParameter()
其實是一樣的。
真正不同的是:
doGet()
和
doPost()
以及瀏覽器送出的 HTTP Method。
⸻
十、今天把整個流程再串一次
現在我們已經可以把這幾天學的東西連起來了。
查詢
使用者
↓
HTML
↓
GET
↓
Servlet
↓
MySQL
↓
JSP
↓
顯示病患資料
新增
使用者
↓
HTML Form
↓
POST
↓
Servlet
↓
MySQL
↓
JSP
↓
顯示新增結果
這時候你會發現:
Servlet 並不是單純拿來顯示 Hello World。
它其實是整個 Web 系統裡負責「處理事情」的重要角色。
⸻
十一、今天學到什麼?
今天主要搞懂了:
GET
比較常用來:
取得資料、查詢資料
例如:
查詢病患
搜尋病患
查看資料
POST
比較常用來:
提交資料、改變系統資料
例如:
新增病患
修改病患
刪除病患
另外也要記住:
GET ≠ 不安全
POST ≠ 自動安全
真正的系統安全還需要其他機制一起處理。
⸻
今日小結
一開始看到:
method="get"
和:
method="post"
可能會覺得只是兩個不同的單字。
但真正開始做系統之後,就會發現它們其實代表了不同的資料傳遞方式。
而我們現在已經可以開始思考:
「這個功能到底是在取得資料,還是在改變資料?」
這個觀念會直接影響我們之後怎麼設計 Servlet。
目前我們的醫療資訊小系統已經完成:
HTML
↓
CSS
↓
Servlet
↓
JSP
↓
GET / POST
下一步,就要開始讓資料真正留下來。
Day 13 完成 ✅