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:
Scope | Phạm vi sử dụng | Tồn tại trong |
---|---|---|
request | Một request | Trong forward/include |
session | Người dùng hiện tại | Đến khi timeout/logout |
application | Toàn ứng dụng | Đến khi server dừng |
page | Trang JSP hiện tại | Trong cùng file JSP |
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ộ).