什么是域对象?
那些能放数据并存储传递数据作为数据存放区域的对象。
Servlet三大域对象
Request域(HttpServletRequest):一次请求/请求转发
Session域 (HttpSession): 一次会话(跨请求)
Application域(ServletContext ):任意一次请求和会话(跨会话)
三大域对象公共方法:
setAttribute(name,value); 设置修改数据
getAttribute(name);获得数据的方法
removeAttribute(name);移除数据的方法
Request域
有效范围
一次请求内有效,请求转发时数据可以传递,除此之外该域没有办法实现数据共享
生命周期
- 创建:每发生一次请求创建一个独立的请求域
- 使用service方法中或者请求转发有效
- 销毁:请求结束,已经向浏览器响应数据
案例: 向request域中放入数据
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@WebServlet(urlPatterns = "/addToRequest.do")
public class Servlet1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 向request域中添加数据
List<String> x=new ArrayList<>();
Collections.addAll(x, "a","b","c");
req.setAttribute("list", x);
req.setAttribute("gender","boy");
req.setAttribute("gender","girl");
req.setAttribute("name","晓明");
// 请求转发
req.getRequestDispatcher("/readFromRequest.do").forward(req,resp);
// 重定向后,失效,因为重定向是让浏览器重新向新的servlet发送请求
//resp.sendRedirect("readFromRequest.do");
}
}
案例: request域中读取数据
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet(urlPatterns="/readFromRequest.do")
public class Servlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 移除域中的互数据
req.removeAttribute("gender");
// 从request域中读取数据
List<String> list =(List<String>) req.getAttribute("list");
System.out.println(list);
System.out.println(req.getAttribute("gender"));
System.out.println(req.getAttribute("name"));
//获取Request中的请求参数
System.out.println(req.getParameter("username"));
System.out.println(req.getParameter("password"));
}
}
Session域
有效范围
单次会话内有效,可以跨多个请求
生命周期
- 创建 会话的产生,第一次发生请求,会话的开始
- 使用 本次会话之内,浏览器和服务器之间发生多次请求和响应有效
- 销毁 会话结束,如:浏览器失去JSESSIONID、到达最大不活动时间、手动清除
案例: Session域中放入数据
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@WebServlet(urlPatterns = "/addToSession.do")
public class Servlet1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 向Session域中添加数据
HttpSession session = req.getSession();
List<String> x=new ArrayList<>();
Collections.addAll(x, "a","b","c");
session.setAttribute("list", x);
session.setAttribute("gender","boy");
session.setAttribute("gender","girl");
session.setAttribute("name","晓明");
// 重定向
resp.sendRedirect("readFromSession.do");
}
}
案例: 从Session域中读取数据
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
@WebServlet(urlPatterns="/readFromSession.do")
public class Servlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
// 移除域中的互数据
//session.removeAttribute("gender");
// 从request域中读取数据
List<String> list =(List<String>) session.getAttribute("list");
System.out.println(list);
System.out.println(session.getAttribute("gender"));
System.out.println(session.getAttribute("name"));
//获取Request中的请求参数
System.out.println(req.getParameter("username"));
System.out.println(req.getParameter("password"));
}
}
Application域
有效范围
当前web服务内,跨请求,跨会话
生命周期
- 创建 项目启动
- 使用 项目运行任何时间有效
- 销毁 项目关闭
案例: Application域中放入数据
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@WebServlet(urlPatterns = "/addToApplication.do")
public class Servlet1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 向Application域中添加数据
ServletContext application = req.getServletContext();
List<String> x=new ArrayList<>();
Collections.addAll(x, "a","b","c");
application.setAttribute("list", x);
application.setAttribute("gender","girl");
application.setAttribute("name","晓明");
}
}
案例: Application域中读取数据
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
@WebServlet(urlPatterns="/readFromApplication.do")
public class Servlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext application = this.getServletContext();
// 从application域中读取数据
List<String> list =(List<String>) application.getAttribute("list");
System.out.println(list);
System.out.println(application.getAttribute("gender"));
System.out.println(application.getAttribute("name"));
}
}