昨天我們完成了一件很重要的事情:
使用 HTML 表單輸入病患資料,再交給 Servlet 接收。
但是如果你有看過昨天的程式,可能會發現一個問題。
Servlet 裡面如果要把結果顯示在網頁上,常常會寫:
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("病患資料");
out.println("姓名:" + name + "");
out.println("性別:" + gender + "");
資料少的時候還可以接受。
但如果今天整個醫療資訊系統有很多 HTML:
全部都寫在 Java 裡面,程式很快就會變得非常難閱讀。
所以今天要認識一個新的東西:
JSP。
⸻
一、JSP 是什麼?
JSP 的全名是:
JavaServer Pages
簡單來說:
JSP 就是一種可以讓我們用 HTML 製作「動態網頁」的技術。
如果把目前學到的東西簡單分工:
技術 主要工作
HTML 建立網頁結構
CSS 美化網頁
JavaScript 網頁互動
Servlet 處理 Java 邏輯
JSP 顯示動態資料
MySQL 儲存資料
這樣就比較容易理解了。
例如:
使用者填寫病患資料:
↓
HTML
↓
Servlet
↓
處理資料
↓
JSP
↓
顯示病患資料
這就是我們接下來要建立的架構。
⸻
二、建立第一個 JSP
假設我們在:
src/main/webapp
裡面新增:
patient.jsp
先放入最基本的 HTML:
其實你會發現:
JSP 看起來跟 HTML 非常像。
這也是 JSP 好用的地方。
我們可以直接用 HTML 排版,不需要在 Java 裡面一直寫:
out.println();
⸻
三、讓 Servlet 把資料交給 JSP
接下來才是今天最重要的部分。
假設我們昨天的 Servlet 接收到:
姓名:小明
性別:男
我們希望 Servlet 不直接把資料印出來,而是:
把資料交給 JSP,讓 JSP 負責顯示。
Servlet 可以這樣寫:
package MyCode;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/patient")
public class PatientServlet extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String gender = request.getParameter("gender");
request.setAttribute("name", name);
request.setAttribute("gender", gender);
request.getRequestDispatcher("patient.jsp")
.forward(request, response);
}
}
這裡有三個很重要的地方。
⸻
四、request.setAttribute() 是做什麼的?
這兩行:
request.setAttribute("name", name);
request.setAttribute("gender", gender);
可以理解成:
把 Servlet 收到的資料暫時放進 request 裡,準備交給 JSP 使用。
例如:
request.setAttribute("name", name);
左邊的 "name" 是我們給資料取的名字。
右邊的 name 則是我們從表單取得的實際資料。
假設使用者輸入:
小明
那麼就會變成:
name → 小明
⸻
五、forward() 是做什麼的?
接下來這段:
request.getRequestDispatcher("patient.jsp")
.forward(request, response);
可以先把它理解成:
「Servlet 處理完資料後,請 JSP 負責把結果顯示出來。」
所以整個流程變成:
使用者
↓
HTML 表單
↓
PatientServlet
↓
接收資料
↓
request.setAttribute()
↓
patient.jsp
↓
顯示結果
這樣 Servlet 就不用負責整個網頁的 HTML。
⸻
六、JSP 怎麼取得 Servlet 傳來的資料?
現在回到:
patient.jsp
我們可以使用:
${name}
來取得 Servlet 放進 request 的資料。
例如:
如果使用者輸入:
姓名:小明
性別:男
最後網頁就會顯示:
病患資料
姓名:小明
性別:男
是不是比在 Servlet 裡面一直寫:
out.println()
舒服很多?
⸻
七、Servlet 和 JSP 的分工
做到這裡,我們就可以開始建立比較清楚的系統架構。
Servlet
負責:
JSP
負責:
也就是:
Browser
↓
Servlet
↓
Java 處理
↓
JSP
↓
HTML
↓
Browser
這種「分工」對之後開發大型系統非常重要。
⸻
八、放進我們的醫療資訊小系統
現在我們的系統開始有一點雛形了。
假設未來病患資料有:
姓名
性別
生日
電話
身分證字號
使用者填寫表單後:
HTML
↓
PatientServlet
↓
接收病患資料
↓
MySQL
↓
取得資料
↓
JSP
↓
顯示病患資訊
這就是我們接下來要慢慢完成的醫療資訊小系統。
今天雖然還沒有真正連接 MySQL,但我們已經完成了一個很重要的觀念:
Servlet 負責處理,JSP 負責顯示。
⸻
九、今天學到什麼?
今天第一次接觸 JSP,我學到:
目前整個系統的流程也越來越清楚:
HTML
↓
Servlet
↓
JSP
而接下來,我們還要把:
MySQL
加入進來。
到那時候,這個系統才會真正開始「記住」病患資料。
⸻
今日小結
今天最大的收穫不是多學了一個 JSP 語法,而是開始理解:
一個完整的網站,不是所有事情都丟給同一個程式做。
HTML 負責結構、CSS 負責外觀、JavaScript 負責互動,Servlet 負責後端邏輯,而 JSP 負責把後端資料呈現在網頁上。
接下來,就可以開始讓 Servlet、JSP 和表單真正串在一起,再一步一步接上 MySQL。
Day 11 完成 ✅