Java登陆第三十天——域对象
什么是域
域特指范围
什么是域对象
对象的范围。而对象的功能一般都是用于保存数据的,所以传递对象就可以传递数据。
而根据传递数据范围的不同,把域对象分为三块。也就是三大域对象。
三大域对象
它们分别是:
域对象 | 描述 |
---|---|
HttpServletRequest | 请求域 |
HttpSession | 会话域 |
ServletContext | 应用域 |
域对象共有的方法
方法名 | 描述 |
---|---|
void setAttribute(String var1, Object var2) | 设置数据(键值对形式) |
void removeAttribute(String var1) | 根据键删除值 |
Object getAttribute(String var1) | 根据键获取值 |
请求域
顾名思义,该对象传递数据的范围是在相同的请求之中。
请求域栗子
TestServlet6
@WebServlet("/Test6")
public class TestServlet6 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("name","张三");
System.out.println(req.getAttribute("name"));
}
}
客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test6
//控制台输出
张三
TestServlet6B
@WebServlet("/Test6B")
public class TestServlet6B extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getAttribute("name"));
}
}
客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test6B
//控制台输出
null
这是因为请求域的作用范围,仅在相同的请求之中。
那么,根据这个定义,测试请求转发的效果。
请求转发栗子
TestServlet6
@WebServlet("/Test6")
public class TestServlet6 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("name","张三");
//相对路径
req.getRequestDispatcher("Test6B").forward(req,resp);
}
}
TestServlet6B
@WebServlet("/Test6B")
public class TestServlet6B extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getAttribute("name"));
}
}
客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test6
//控制台输出
张三
这是因为请求转发,根本上还是同一个请求对象。请求转发与响应重定向
会话域
顾名思义,该对象传递数据的范围是在相同的会话之中。
会话域栗子
TestServlet6
@WebServlet("/Test6")
public class TestServlet6 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setAttribute("name","张三");
}
}
TestServlet6B
@WebServlet("/Test6B")
public class TestServlet6B extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getSession().getAttribute("name"));
}
}
客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test6
客户端再请求URL:http://localhost:8080/JavaWeb_war_exploded/Test6B
//控制台输出
张三
关闭客户端(或者使用不同的浏览器),再请求URL:http://localhost:8080/JavaWeb_war_exploded/Test6B
//控制台输出
null
这是因为HTTP是无状态协议,连接关闭后,客户端重新访问,服务端总是会视作新的客户端请求HTTP会话管理
应用域
顾名思义,该对象传递数据的范围是在相同的应用之中。
(这里的应用指的是服务器应用,也就是Web容器,也就是Tomcat)
应用域栗子
TestServlet6
@WebServlet("/Test6")
public class TestServlet6 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
getServletContext().setAttribute("name","张三");
}
}
TestServlet6B
@WebServlet("/Test6B")
public class TestServlet6B extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(getServletContext().getAttribute("name"));
}
}
客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test6
客户端再请求URL:http://localhost:8080/JavaWeb_war_exploded/Test6B
//控制台输出
张三
关闭客户端(或者使用不同的浏览器),再请求URL:http://localhost:8080/JavaWeb_war_exploded/Test6B
//控制台输出
张三
这是因为应用域针对的是整个项目,除非重启本项目,否则还是可以访问到name:张三这个数据认识Tomcat
域对象使用情况举例
-
请求域
- 一般放本次请求业务有关的数据,如:查询到的所有的部门信息
-
会话域
- 一般放本次会话的客户端有关的数据,如:当前客户端登录的用户
-
应用域
- 一般放本程序应用有关的数据 如:Spring框架的IOC容器