Java登陆第三十天——域对象

发布时间 2024-01-02 19:15:28作者: ocraft

什么是域

域特指范围

什么是域对象

对象的范围。而对象的功能一般都是用于保存数据的,所以传递对象就可以传递数据。

而根据传递数据范围的不同,把域对象分为三块。也就是三大域对象。

三大域对象

它们分别是:

域对象 描述
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容器