说一下 jsp 的 4 种作用域?
在 JSP(JavaServer Pages)中,有四种作用域,它们决定了对象的可见性和生命周期。这四种作用域分别是:
-
页面作用域(Page Scope):
- 页面作用域表示对象的生命周期与当前 JSP 页面的请求处理周期相同。
- 页面作用域中的对象只能在当前页面的多个地方访问。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Page Scope Example</title> </head> <body> <%@ page import="java.util.ArrayList" %> <% // 在页面作用域中创建一个 ArrayList 对象 ArrayList<String> pageList = new ArrayList<>(); pageList.add("Item 1"); pageContext.setAttribute("pageList", pageList); %> <h1>Page Scope Example</h1> <p>Items in pageList:</p> <ul> <% // 在页面作用域中获取并显示 ArrayList 对象 ArrayList<String> retrievedList = (ArrayList<String>) pageContext.getAttribute("pageList"); for (String item : retrievedList) { out.println("<li>" + item + "</li>"); } %> </ul> </body> </html>
-
请求作用域(Request Scope):
- 请求作用域表示对象在同一个 HTTP 请求内是可见的。
- 请求作用域中的对象可以在一个 JSP 页面和它所转发请求的下一个页面之间共享。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Request Scope Example</title> </head> <body> <%@ page import="java.util.HashMap" %> <% // 在请求作用域中创建一个 HashMap 对象 HashMap<String, String> requestMap = new HashMap<>(); requestMap.put("key1", "Value 1"); request.setAttribute("requestMap", requestMap); %> <h1>Request Scope Example</h1> <p>Value for key1: <%= request.getAttribute("requestMap").get("key1") %></p> </body> </html>
-
会话作用域(Session Scope):
- 会话作用域表示对象在用户的整个会话期间是可见的,即用户打开浏览器到关闭浏览器。
- 会话作用域中的对象可以在一个 Web 应用程序的不同页面之间共享。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Session Scope Example</title> </head> <body> <%@ page import="java.util.HashSet" %> <% // 在会话作用域中创建一个 HashSet 对象 HashSet<String> sessionSet = new HashSet<>(); sessionSet.add("Item A"); session.setAttribute("sessionSet", sessionSet); %> <h1>Session Scope Example</h1> <p>Items in sessionSet:</p> <ul> <% // 在会话作用域中获取并显示 HashSet 对象 HashSet<String> retrievedSet = (HashSet<String>) session.getAttribute("sessionSet"); for (String item : retrievedSet) { out.println("<li>" + item + "</li>"); } %> </ul> </body> </html>
-
应用程序作用域(Application Scope):
- 应用程序作用域表示对象在整个 Web 应用程序的生命周期内是可见的,即从应用程序启动到关闭。
- 应用程序作用域中的对象可以在一个 Web 应用程序的所有页面之间共享。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Application Scope Example</title> </head> <body> <%@ page import="java.util.LinkedHashMap" %> <% // 在应用程序作用域中创建一个 LinkedHashMap 对象 LinkedHashMap<String, String> appMap = new LinkedHashMap<>(); appMap.put("keyX", "Value X"); application.setAttribute("appMap", appMap); %> <h1>Application Scope Example</h1> <p>Value for keyX: <%= application.getAttribute("appMap").get("keyX") %></p> </body> </html>
这些示例演示了如何在不同的作用域中存储和获取数据,以及数据在不同页面之间的共享。作用域的选择应该基于数据的生命周期和可见性的需求。