【JSP 實戰教學】使用 Top.jsp 與 Bottom.jsp 管理使用者 Session 狀態(含範例與歷史脈絡)

| Java | 5 Reads

本文教你如何在傳統 JSP 系統中使用 Top.jspBottom.jsp 來維護使用者登入狀態與頁面流程。這種設計在大量政府與企業內部系統中仍廣泛使用,是維護舊系統的重要知識。


🔍 為什麼需要 Top.jsp 與 Bottom.jsp?

在早期 JSP 系統中,沒有現代框架、沒有過濾器(Filter),一切都靠你自己控制。每次進入一個 JSP 頁面,都要自行判斷使用者是否已登入、是否可以存取該頁。這樣就產生了大量重複程式碼。

為了解決這個問題,開發者將這些「共通邏輯」抽出來:

檔案 功能說明
Top.jsp 在每個頁面開頭 include,負責從 Session 讀取使用者狀態,必要時自動初始化
Bottom.jsp 在每個頁面結尾 include,將使用者狀態寫回 Session,確保後續頁面能使用

這就是「Top–Bottom 包夾設計模式」,至今仍在許多系統穩定運作中。


🧱 範例專案結構

AppManager.java      // 用來記錄登入者資訊
Top.jsp              // 頁首共通邏輯:初始化狀態
Bottom.jsp           // 頁尾共通邏輯:寫回狀態
Blog.jsp             // 模擬一個部落格主頁

✅ AppManager.java – 管理登入者資訊

// 負責保存登入者狀態的 Java 類別
public class AppManager {
    private String username;

    public AppManager(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    // Session 中的儲存 key
    public static final String NAME = "AppManager";
}

⬆️ Top.jsp – 頁首邏輯:取得或建立狀態

<%@ page import="AppManager" %>
<%
    // 從 Session 取得登入者資訊(如不存在,初始化為訪客)
    AppManager manager = (AppManager) session.getAttribute(AppManager.NAME);

    if (manager == null) {
        manager = new AppManager("訪客"); // 實務中應由 Login.jsp 建立
        session.setAttribute(AppManager.NAME, manager);
    }

    // 此處可擴充流程驗證,例如是否已登入、是否具備權限等
%>

⬇️ Bottom.jsp – 頁尾邏輯:寫回狀態

<%
    // 確保 manager 寫回 Session,保存任何中途的變更
    session.setAttribute(AppManager.NAME, manager);
%>

📄 Blog.jsp – 實際使用頁面

<%@ include file="Top.jsp" %>
<html>
<head>
    <title>JSP 部落格首頁 - 管理使用者狀態</title>
    <meta name="description" content="教你如何用 Top.jsp 與 Bottom.jsp 在 JSP 系統中正確管理使用者 Session 狀態,維護登入流程與頁面邏輯。" />
</head>
<body style="font-family:sans-serif">

<h1>我的 JSP 部落格</h1>

<%
    // Top.jsp 中已初始化 manager,這裡直接使用
    AppManager manager = (AppManager) session.getAttribute(AppManager.NAME);
%>

<p>目前登入者:<strong><%= manager.getUsername() %></strong></p>

<!-- 這裡可展示文章列表、留言、上傳功能等 -->

<%@ include file="Bottom.jsp" %>
</body>
</html>

📌 為什麼一定要寫 Bottom.jsp?

如果沒有 Bottom.jsp,會發生什麼? 結果
修改過 manager(例如使用者名稱、流程狀態) 不會被保存,下一頁會還原
多頁流程控制需要持續狀態(如審核流程) 狀態中斷,流程錯誤
頁面不穩定,Session 中出現 null 或過時的狀態 報錯或強制返回登入頁

🕰️ Top.jsp/Bottom.jsp 的歷史與設計背景

這種寫法不是偶然,而是早期 Java Web 系統的產物。以下是設計背景摘要:

時期 背景說明
1999–2002 JSP 與 Servlet 剛問世,開發者需自行管理 Session 與流程邏輯。
2002–2006 成為老系統的主流實作模式,用來支撐登入邏輯與頁面流程控制。
2006–今 雖然現代系統已採用框架,但仍有大量老系統沿用此設計並穩定運作。

✅ 總結:這是一套可持續維護的 JSP 管理模式

檔案名 功能重點
Top.jsp 初始化登入資訊、流程驗證
Bottom.jsp 寫回狀態,保存修改
AppManager 保存在 Session 中的狀態容器
Blog.jsp 實際頁面,專注展示,不處理共通邏輯

這套設計不依賴任何現代框架,易懂、好維護、可擴充。如果你正在維護類似系統,它依然是非常實用的解法。


📌 延伸建議:若你有數十個頁面都需要用到相同邏輯,建議統一用 Top.jsp / Bottom.jsp 包夾模式,可極大減少錯誤與重複程式碼。

This article was last edited at