一、資料存在資料庫裡,還不代表使用者看得到
前兩天,我們已經學會使用 JDBC 查詢及新增病患資料。
不過,目前的查詢結果主要顯示在 Java Console,新增資料也需要透過測試程式執行。
對一般使用者來說,這樣的操作並不方便。
我們希望完成的畫面應該是:
因此,今天要把前面學過的 Servlet、JSP 和 JDBC 串在一起。
二、先了解整體流程
今天的資料傳遞流程如下:
瀏覽器
↓
PatientListServlet
↓
DBConnection
↓
MySQL patient 資料表
↓
ResultSet
↓
Servlet 整理查詢結果
↓
JSP 顯示病患清單
這裡有一個重要觀念:
Servlet 負責處理請求和取得資料,JSP 負責呈現畫面。
不要把所有資料庫操作和商業邏輯都寫在 JSP 裡,這樣未來會比較難維護。
三、建立 Patient 類別
我們先建立一個簡單的 Java 類別,用來代表一筆病患資料。
例如在 model 套件中建立 Patient.java:
package model;
import java.sql.Date;
public class Patient {
private int id;
private String name;
private String gender;
private Date birthday;
private String phone;
public Patient(
int id,
String name,
String gender,
Date birthday,
String phone) {
this.id = id;
this.name = name;
this.gender = gender;
this.birthday = birthday;
this.phone = phone;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getGender() {
return gender;
}
public Date getBirthday() {
return birthday;
}
public String getPhone() {
return phone;
}
}
這個類別的作用是把一筆病患資料包裝成一個物件,讓 Java 程式更容易傳遞和管理資料。
四、建立 PatientListServlet
接下來建立 PatientListServlet.java。
以下使用 Jakarta Servlet,請確認你的專案已經設定對應的 Servlet API 和 Tomcat 版本。
package servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
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 model.Patient;
import util.DBConnection;
@WebServlet("/patients")
public class PatientListServlet extends HttpServlet {
@Override
protected void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String sql = "SELECT id, name, gender, birthday, phone "
+ "FROM patient ORDER BY id DESC";
List patients = new ArrayList<>();
try (
Connection conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()
) {
while (rs.next()) {
Patient patient = new Patient(
rs.getInt("id"),
rs.getString("name"),
rs.getString("gender"),
rs.getDate("birthday"),
rs.getString("phone")
);
patients.add(patient);
}
} catch (SQLException e) {
throw new ServletException(
"無法取得病患清單", e
);
}
request.setAttribute("patients", patients);
request.getRequestDispatcher("/patients.jsp")
.forward(request, response);
}
}
這段程式主要做了四件事:
ORDER BY id DESC 則是讓編號較新的資料排在前面。
五、建立 patients.jsp
現在,我們要把 Servlet 傳來的資料顯示在網頁上。
在專案中建立 patients.jsp:
<%@ page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib prefix="c"
uri="jakarta.tags.core" %>
這裡使用 JSTL 的 <c:forEach> 逐筆顯示病患資料,並使用 <c:out> 輸出欄位內容。
注意:這份 JSP 使用 Jakarta Tags 的 URI,專案需要加入相容版本的 JSTL/Jakarta Tags 依賴。如果你的專案尚未加入 JSTL,請先依照目前的 Tomcat 與 Jakarta EE 版本設定相關依賴。
六、如何測試?
啟動 MySQL 和 Tomcat,確認專案部署成功後,在瀏覽器開啟:
http://localhost:8080/你的專案名稱/patients
請將「你的專案名稱」換成實際的 Web 專案 Context Path。
如果程式和設定正確,頁面就會顯示病患清單。
如果出現錯誤,可以依序檢查:
七、為什麼要把資料和畫面分開?
今天我們建立了 Patient、PatientListServlet 和 patients.jsp 三個部分。
它們各自負責不同的工作:
檔案 負責工作
Patient.java 表示一筆病患資料
PatientListServlet.java 查詢資料並處理請求
patients.jsp 將資料呈現成網頁
這種分工能讓專案更清楚。未來要修改表格樣式時,不需要把資料庫查詢全部重寫;要改變查詢方式時,也不需要把所有 HTML 一起修改。
當然,這只是教學用的基礎架構。正式醫療系統還需要登入驗證、權限控管、資料最小化、操作稽核,以及對敏感資料的保護。病患資料不應直接公開給未經授權的使用者。
今日小結
今天我們把 JDBC、Servlet 和 JSP 串接起來,讓資料庫中的病患資料可以出現在網頁上。
這篇學到的重點有:
Day 19 完成!
到這裡,我們的醫療資訊小系統已經具備基本的資料讀取與清單展示能力。接下來就能繼續加入搜尋、修改和刪除功能,讓它逐步成為一個完整的小系統。
參考資料:MySQL Connector/J 官方文件