首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JavaBean 入門(五):四大作用域 Bean 移除與銷毀操作指南

     編輯:關於JSP

移除 API 統一入口

每個作用域隱式對象均提供 removeAttribute(String name) 方法,參數為 <jsp:useBean id="..."> 指定的 id。

四大作用域移除代碼對照

作用域移除代碼典型觸發時機
pagepageContext.removeAttribute("beanId");頁面邏輯結束前主動釋放 (極少用)
requestrequest.removeAttribute("beanId");forward 後不想傳遞給下一資源
sessionsession.removeAttribute("beanId");用戶登出、清空購物車、權限變更
applicationapplication.removeAttribute("beanId");管理員刷新快取、模塊卸載、容器關閉

實戰:Session 計數器「一次性」演示

Bean CountBean.java (同前)

頁面 counter.jsp

<%@ page contentType="text/html;charset=utf-8" %>
<jsp:useBean id="cou" class="javabean01.CountBean" scope="session"/>
<html><body>
<h3>第 <jsp:getProperty name="cou" property="count"/> 次訪問!</h3>
<% session.removeAttribute("cou"); %> <!-- 立即銷毀 -->
<p>已移除 session 中的 cou,下次訪問將重新計數。</p>
</body></html>

**效果**:每次刷新頁面計數永遠為 1,控制台每次印「新實例誕生」。

進階:監聽器自動清理 (推薦生產用法)

而非在 JSP 散落移除代碼,應集中在 **Listener** 管理生命週期:

@WebListener
public class BeanLifecycleListener implements HttpSessionListener, ServletContextListener {
    @Override public void sessionDestroyed(HttpSessionEvent se) {
        // Session 銷毀時自動清理 (容器會自動移除所有屬性)
        // 此處可執行額外資源釋放:關閉連接、釋放鎖、發送事件
    }
    @Override public void contextDestroyed(ServletContextEvent sce) {
        // 應用關閉:關閉線程池、資料庫連接池、緩存客戶端
    }
}

現代框架自動管理機制

框架機制開發者責任
SpringScope 代理 + DestructionCallback + @PreDestroy正確聲明 @RequestScope 等,容器自動銷毀
CDIContext 生命週期事件 + @PreDestroy實現 Serializable (Session/Application),容器自動處理
Jakarta FacesView/Flash/Flow/Session/Application Scope 自動管理使用 @ViewScoped 等註解,無需手工移除

避坑清單

  • 手工 removeAttribute 後仍持有引用:局部變數/集合仍引用 Bean,阻礙 GC。移除後置 null。
  • Application Scope 移除競態:多線程並發移除/寫入。用 ConcurrentHashMap.computeIfAbsent 或鎖保護。
  • Session 移除 vs 失效:session.invalidate() 會銷毀整個 Session (含所有屬性);removeAttribute 僅移除單一屬性。**登出請用 invalidate**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved