Scope

Trong ứng dụng Java Web, dữ liệu có thể được lưu và chia sẻ qua nhiều phạm vi (scope) tùy vào mục đích sử dụng:

ScopePhạm vi sử dụngTồn tại trong
requestMột requestTrong forward/include
sessionNgười dùng hiện tạiĐến khi timeout/logout
applicationToàn ứng dụngĐến khi server dừng
pageTrang JSP hiện tạiTrong cùng file JSP

JSP Scopes

Request Scope

  • Phạm vi tồn tại trong một request duy nhất.
  • Phù hợp để truyền dữ liệu từ Servlet → JSP (hoặc giữa các filter/servlet).

Lấy dữ liệu từ request trước:

String password = request.getParameter("password");

Truyền dữ liệu từ Servlet → JSP:

request.setAttribute("message", "Xin chào!");
request.getRequestDispatcher("hello.jsp").forward(request, response);

Lấy dữ liệu trong JSP:

Scriptlet:

<%
  String message = (String) request.getAttribute("message");
%>
<%= message %>

EL:

${requestScope.message}
${requestScope['message']}
${message}

Session Scope

  • Dữ liệu tồn tại trong suốt phiên làm việc của người dùng (có thể kéo dài qua nhiều request).
  • Dùng để lưu thông tin người dùng sau khi đăng nhập, giỏ hàng, v.v.

Đặt dữ liệu vào session:

HttpSession session = request.getSession();
session.setAttribute("username", "admin");

Lấy dữ liệu trong JSP:

Scriptlet:

<%
  String username = (String) session.getAttribute("username");
%>
<%= username %>

EL:

${sessionScope.username}
${sessionScope['username']}
${username} <!-- dễ bị ghi đè -->

✅ Có thể cấu hình thời gian timeout trong web.xml:

<session-config>
  <session-timeout>30</session-timeout> <!-- phút -->
</session-config>

Application Scope

  • Dữ liệu dùng chung cho toàn bộ ứng dụng web, tồn tại cho đến khi server dừng hoặc ứng dụng bị gỡ.
  • Dùng cho các cấu hình hoặc tài nguyên chia sẻ giữa nhiều người dùng.
getServletContext().setAttribute("appName", "Hệ thống quản lý sinh viên");

Lấy dữ liệu trong JSP:

${applicationScope.appName}

Page Scope (chỉ trong JSP)

  • Biến chỉ tồn tại trong một trang JSP (biến cục bộ).