16_域对象

gong_yz大约 4 分钟Servlet

概念引入

什么是域对象?

那些能放数据并存储传递数据作为数据存放区域的对象。

能够存储数据,获取数据,传递数据的对象

Servlet三大域对象

Request域HTTPServletRequest一次请求/请求转发
Session域HTTPSession一次会话(跨请求)
Application域ServletContext任意一次请求和会话(跨会话)

setAttribute(name,value); 设置修改数据

getAttribute(name);获得数据的方法

removeAttribute(name);移除数据的方法

JSP四大域对象

Page域、Request域、Session域、Application域


Request域

有效范围

一次请求内有效,请求转发时数据可以传递,除此之外该域没有办法实现数据共享

生命周期

创建 每发生一次请求创建一个独立的请求域;

使用service方法中或者请求转发有效;

销毁 请求结束,已经向浏览器响应数据;

测试代码

向request域中放入数据:

package com.gyz.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;

/**
 * @author: gongyuzhuo
 * @since: 2024-02-04 13:54
 * @description:
 */
@WebServlet(urlPatterns = "/addToRequest.do")
public class Servlet1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "a", "b", "c");
        req.setAttribute("gender", "女");
        req.setAttribute("age", "10");
        req.setAttribute("list", list);

        //请求转发
        req.getRequestDispatcher("/readFromRequest.do").forward(req, resp);
        
        // 重定向。当测试重定向时,发现request域中读取数据都为null,原因是因为用户重新发起了一个request请求,注意请求转发和重定向的区别
        //resp.sendRedirect("readFromRequest.do");
    }
}

request域中读取数据:

package com.gyz.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;

/**
 * @author: gongyuzhuo
 * @since: 2024-02-04 14:28
 * @description:
 */
@WebServlet(urlPatterns = "/readFromRequest.do")
public class Servlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 从request域中读取数据
        List<String> list = (List<String>) req.getAttribute("list");
        System.out.println(list);
        System.out.println(req.getAttribute("gender"));
        System.out.println(req.getAttribute("age"));
        //获取Request中的请求参数
        System.out.println(req.getParameter("userName"));
        System.out.println(req.getParameter("passWord"));
    }
}

测试:

请求接口:http://localhost:8089/requestTest_war_exploded/addToRequest.do?userName="zhangsan"&passWord="123456"open in new window

读取的数据打印如下:

image
image

Session域

有效范围

单次会话内有效,可以跨多个请求。

生命周期

创建:会话的产生,第一次发生请求,会话的开始

使用:本次会话之内,浏览器和服务器之间发生多次请求和响应有效

销毁:会话结束,如:浏览器失去JSESSIONID、到达最大不活动时间、手动清除

测试代码

Session域中放入数据:

package com.gyz.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;

/**
 * @author: gongyuzhuo
 * @since: 2024-02-04 14:46
 * @description:
 */
@WebServlet(urlPatterns = "/addToSession.do")
public class Servlet3 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        List<String> x = new ArrayList<>();
        Collections.addAll(x, "a", "b", "c");
        session.setAttribute("gender", "女");
        session.setAttribute("name", "lisi");
        session.setAttribute("list", x);

        //重定向
        resp.sendRedirect("readFromSession.do");
    }
}

从Session域中读取数据:

package com.gyz.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;

/**
 * @author: gongyuzhuo
 * @since: 2024-02-04 14:50
 * @description:
 */
@WebServlet(urlPatterns = "/readFromSession.do")
public class Servlet4 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        // 从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"));
    }
}

访问如下接口:

http://localhost:8089/sessionTest_war_exploded/readFromSession.do?userName="zhangsan"&passWord="123456"open in new window

读取Session中的数据如下:

image
image

Application域

有效范围

当前web服务内,跨请求,跨会话

生命周期

创建:项目启动

使用:项目运行任何时间有效

销毁:项目关闭

测试代码

Application域中放入数据:

package com.gyz.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 java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author: gongyuzhuo
 * @since: 2024-02-04 15:00
 * @description:
 */
@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域中读取数据:

package com.gyz.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 java.io.IOException;
import java.util.List;

/**
 * @author: gongyuzhuo
 * @since: 2024-02-04 15:00
 * @description:
 */
@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"));
    }
}