# 保存作用域
###### tags: `Java Web-Servlet`
## request:一次請求響應範圍

demo01使用sendRedirect(客戶端重定向),響應1回到客戶端,請客戶端再發請求2到demo02
由於不是同一次響應,因此request(一次請求響應範圍)無法取得資料

======================

demo01使用getRequestDispatcher(服務器端轉發),demo01直接在服務器內部轉發給demo02,因此回傳給客戶端的還是響應1,因此能取得數據

```java=
//演示request保存作用域(demo01和demo02)
@WebServlet("/demo01")
public class Demo01Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.向request保存作用域保存數據
req.setAttribute("uname","lili");
//2.客戶端重定向
// resp.sendRedirect("demo02");
//3.服務器端轉發
req.getRequestDispatcher("demo02").forward(req,resp);
}
}
```
```java=
@WebServlet("/demo02")
public class Demo02Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.獲取request保存作用域保存的數據,key為uname
Object unameObj = req.getAttribute("uname");
System.out.println("unameObj = " + unameObj);
}
}
```
## Session:一次會話範圍有效
只要一次會話中,不管是sendRedirect還是getRequestDispatcher,都能取得保存域中的資料

```java=
//演示session保存作用域(demo03和demo04)
@WebServlet("/demo03")
public class Demo03Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.向session保存作用域保存數據
req.getSession().setAttribute("uname","lili");
//2.客戶端重定向
resp.sendRedirect("demo04");
//3.服務器端轉發
// req.getRequestDispatcher("demo04").forward(req,resp);
}
}
```
```java=
@WebServlet("/demo04")
public class Demo04Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.獲取request保存作用域保存的數據,key為uname
Object unameObj = req.getSession().getAttribute("uname");
System.out.println("unameObj = " + unameObj);
}
}
```

客戶端二因為已經是不同會話,因此無法取得客戶端一保存在保存域中的資料
=============
## application:一次應用程序範圍有效

當前應用程序執行下,所有客戶端都能取得保存作用域的資料,直到應用程序關閉

```java=
//演示application保存作用域(demo05和demo06)
@WebServlet("/demo05")
public class Demo05Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.向request保存作用域保存數據
//ServletContext:Servlet上下文,tomcat啟動後,直到關閉前都能讀取到保存域的數據
ServletContext application = req.getServletContext();
application.setAttribute("uname","lili");
//2.客戶端重定向
resp.sendRedirect("demo06");
//3.服務器端轉發
// req.getRequestDispatcher("demo04").forward(req,resp);
}
}
```
```java=
@WebServlet("/demo06")
public class Demo06Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.獲取application保存作用域保存的數據,key為uname
ServletContext application = req.getServletContext();
Object unameObj = application.getAttribute("uname");
System.out.println("unameObj = " + unameObj);
}
}
```