在JavaWeb中,Servlet中三大作用域对象分别是request,session,application,其主要目的是用来共享数据的。
三大作用域的使用,其本质是根据作用域的范围,生命周期决定其使用的方式.:
对象名称 |
对象的类型 |
request |
HttpServletRequest |
session |
HttpSession |
application |
ServletContext |
作用域对象如何共享数据:
1.设置作用域中的共享数据。
作用域对象名.setAttribute(String name,Object value);
2.获取作用域中的共享数据。
Object value=作用域对象名.getAttribute(String name);
3.获取作用域中的共享数据。
作用域对象.removeAttribute(String name);
注意:在哪一个作用域中设置共享数据,就只能从该作用域中取出数据。
三大作用域:
request:每一次请求都是一个新的request对象,如果在Web组件之间需要共享同一个请求中的数据,只能使用请求转发。
session:每一次会话都是一个新的session对象,如果需要在一次会话中的多个请求之间需要共享数据,只能使用session。
application:应用对象,Tomcat 启动到关闭,表示一个应用,在一个应用中有且只有一个applic-ation对象,作用于整个Web应用,可以实现多次会话之间的数据共享。
代码演示:
我们新建两个类:ScopeServlet ResultServlet
package com.ape.view;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ScopeServlet
*/
@WebServlet("/scope.do")
public class ScopeServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.request
Integer numInRequest=(Integer)req.getAttribute("NUM_IN_REQUEST") ;
if (numInRequest == null) {
req.setAttribute("NUM_IN_REQUEST",1);
}
else {
req.setAttribute("NUM_IN_REQUEST",numInRequest+1);
}
//2.Session
Integer numInSession=(Integer)req.getSession().getAttribute("NUM_IN_SESSION") ;
if (numInSession == null) {
req.getSession().setAttribute("NUM_IN_SESSION",1);
}
else {
req.getSession().setAttribute("NUM_IN_SESSION",numInSession+1);
}
//3.application
Integer numInApplication=(Integer) req.getServletContext().getAttribute("NUM_IN_APPLICATION");
if (numInApplication == null) {
req.getServletContext().setAttribute("NUM_IN_APPLICATION",1);
}
else {
req.getServletContext().setAttribute("NUM_IN_APPLICATION",numInApplication+1);
}
req.getRequestDispatcher("/result").forward(req,resp);
}
}
package com.ape.view;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ResultServlet
*/
@WebServlet("/result.do")
public class ResultServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
Integer numInRequest=(Integer) req.getAttribute("NUM_IN_REQUEST");
Integer numInSession=(Integer) req.getSession().getAttribute("NUM_IN_SESSION");
Integer numInApplication=(Integer) req.getServletContext().getAttribute("NUM_IN_APPLICATION");
out.println("Request="+numInRequest);
out.println("Session="+numInSession);
out.println("Application="+numInApplication);
}
}
然后我们运行一下
第一次访问 三个作用域都是1

刷新了5次 会看到 request一次 session与Application都是6次

接下来我们换一个浏览器 会发现 session 是1了 而 Appplication又增加了一次

又刷新了几次,发现session从0开始重新计数

返回我们的第一个Google浏览器 Google里面的session自己又加1了

因此 我们会发现
Request是一次请求
Session是一个会话
Application是多次会话(Tomcat开启到关闭)
常用方法:
1. Request:
request.setAttribute(); //向request域里设置数据
request.getAttribute(); //向request域里取出数据
request.removeAttribute(); //向request域里移除数据
request.getParameter(). //从request域里获取传递的数据
2.Session:
session.setAttribute(); //向session域里存放共享数据
session.getAttribute(); //从session域里取出共享数据
session.removeAttribute();//从session域里移除共享数据
3. Application(ServletContext):
1. 设置作用域中的共享数据
作用域对象.setAttribute(String name,Object value);
2. 获取作用域中的共享数据
Object value = 作用域对象.getAttribute(String name);
3. 移除作用域中的指定的共享数据
作用域对象.removeAttribute(String name);
完事。