session域对象中存储引用数据类型的引用,和使用技巧

1. 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;

/**
 * @author Zuoyueer
 * Date: 2019/10/26
 * Time: 20:52
 * @projectName HomeWork
 * @description: 证明session存储引用数据类型是存储的引用, 修改集合中的内容会改变session的数据
 */
@WebServlet(urlPatterns = "/TestSession", name = "TestSession")
public class TestSession extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        HttpSession session = request.getSession();
        session.setAttribute("list", list);
        //直接修改list集合中的数据
        list.add("ccc");
        list.remove("aaa");
        //session中数据同步改变了,说明存储的是引用
        ArrayList<String> list1 = (ArrayList<String>) session.getAttribute("list");
        for (String s : list1) {
            System.out.println(s); //输出的是: bbb  ccc  
        }
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

2. 上面的servlet类,如果多次访问,那么输出结果会改变吗?

答案是不会,因为每次请求访问,都会重新创建一个Arraylist集合,每次都执行session.setAttribute("list", list);,就会覆盖原来的数据,所以每次请求输出的结构都一样

3. 显然我们不希望看到每次请求,session域中原来的数据都被覆盖了,不仅造成数据的丢失,每次创建新的集合都是对资源的浪费.那么我们如何解决呢?

第一种解决方案很简单,就是把创建ArrayList对象的语句提取到外面,作为类的成员变量,这样多次请求共享同一个集合,只会在第一次访问的时候创建集合,可以解决上面的问题.
这种做法虽然解决了问题, 但是很low . 无关紧要的东西是不建议设置成类的成员变量,而且是servlet的共享资源,更加需要多加思考.

第二种解决方案正是我写这篇博客的最大诱因.希望分享给大家,也使得自己能记住.

//多余的代码我就不写了,直接展示精华
        List list =  session.getAttribute("list");//第一次访问,list为null,其他时候直接获取原来的数据
        if (list == null) {
            //只有第一次访问的时候才创建list集合,其他的时候直接session域中获取
            list = new ArrayList<Book>();
            //因为session存储集合是引用数据类型,所以第一次请求的时候添加list的引用就可以,避免了每次请求都覆盖原来的
            session.setAttribute("list", list);
        }
        list.add("aaa");
        list.add("bbb");

完!


如果对你有帮助,请点赞收藏,转载请写原地址,如果有错误还请务必告知鄙人.多谢

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以通过将实体类对象存储在HttpSession,实现向session共享实体类对象的目的。具体实现方式可以是使用setAttribute方法将实体类对象存储session,然后在其它页面或请求通过getAttribute方法获取该实体类对象,以实现数据共享的目的。以下是示例代码: ``` // 将实体类对象存储session HttpSession session = request.getSession(); EntityObject entityObj = new EntityObject(); session.setAttribute("entityObj", entityObj); // 在其它页面或请求获取实体类对象 HttpSession session = request.getSession(); EntityObject entityObj = (EntityObject) session.getAttribute("entityObj"); ``` 注意:需要保证实体类实现了序列化接口,否则可能会导致存储或读取失败。 ### 回答2: 要将实体类对象共享到Session,可以通过以下步骤实现。 首先,需要在Servlet获取当前的HttpSession对象。可以通过HttpServletRequest的`getSession()`方法来实现,代码如下: ```java HttpSession session = request.getSession(); ``` 然后,将实体类对象存储Session。可以通过使用`setAttribute()`方法将实体类对象作为属性存储Session,代码如下: ```java session.setAttribute("实体类对象的名称", 实体类对象); ``` 其,将"实体类对象的名称"替换为实际的名称,将"实体类对象"替换为需要共享的实体类对象。 接下来,在需要获取实体类对象的地方,可以使用`getAttribute()`方法从Session获取实体类对象,代码如下: ```java 实体类类型 实体类对象 = (实体类类型) session.getAttribute("实体类对象的名称"); ``` 其,将"实体类类型"替换为实际的实体类类型,将"实体类对象的名称"替换为之前存储时的名称。 最后,如果需要从Session移除实体类对象,可以使用`removeAttribute()`方法,代码如下: ```java session.removeAttribute("实体类对象的名称"); ``` 这样就可以实现将实体类对象共享到Session,并在需要的地方获取和移除它了。 ### 回答3: 在Java web开发,我们可以通过使用Session来共享实体类对象。下面是一种实现方式: 1. 首先,在Servlet获取Session对象: HttpSession session = request.getSession(); 2. 然后,创建一个实体类对象并设置其属性: Entity entity = new Entity(); entity.setName("John"); entity.setAge(20); 3. 将实体类对象添加到Sessionsession.setAttribute("entity", entity); 4. 之后,在其他Servlet或JSP页面可以通过以下方式获取和使用共享的实体类对象: Entity entity = (Entity) session.getAttribute("entity"); String name = entity.getName(); int age = entity.getAge(); // 进行其他操作... 通过这种方式,我们就可以在Session共享实体类对象。需要注意的是,在使用Session时,要确保实体类对象是可序列化的,即实体类需要实现Serializable接口,这样才能在Session之间进行传输和共享。另外,还要注意在合适的时机从Session移除对象,避免造成过多的内占用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值