繁体   English   中英

Java Servlet session.getAttribute和setAttribute

[英]Java Servlets session.getAttribute and setAttribute

我试图对每个会话的获取请求进行计数,但最终还是成功了,但是,我有一个问题,目的是要弄清逻辑如何工作。 这是我的代码:

public class FirstServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       final String COUNTER = "Counter";
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FirstServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            HttpSession session = req.getSession();
            PrintWriter out = resp.getWriter();
            int count = 1;
            Integer i = (Integer) session.getAttribute(COUNTER);
            if(i != null){
                count = i.intValue() +1;
            }
            session.setAttribute(COUNTER, new Integer(count));
             out.println("<html>");
                out.println("<head>");
                out.println("<title>Session Counter</title>");
                out.println("</head>");
                out.println("<body>");
                out.println("Your session ID is <b>" + session.getId());
                out.println("</b> and you have hit this page <b>" + count
                    + "</b> time(s) during this browser session");
        }

这里是问题:

Integer i = (Integer) session.getAttribute(COUNTER);
                if(i != null){
                    count = i.intValue() +1;
                }

由于我要创建Integer i,然后将其转换为整数,这是否意味着无论String值如何,它的int值始终为0? (因为COUNTER是String类型的)

我的第二个问题是:为什么要在获取新值后必须使用session.setAttribute()。 我的逻辑如下。 我们知道每个servlet仅实例化一次-我获得属性(session.getAttribute(COUNTER)),检查i是否不同于null,然后对其进行递增,如果我注释了setAttribute,则将看不到新的增值。 为什么必须再次设置才能获得正确的值? 当我按“刷新”时,我正在发出一个新的get请求,它采用了COUNTER的旧值(例如2),然后我们检查它是否不为null并将其递增1。我不明白为什么我必须使用session.setAttribute再次...

谢谢!

第一个问题:否。如果该属性不在会话中, i将为null

第二:此行为与不变性的概念有关,并理解Java的引用概念。

由于会话存储对象,因此您的counter将通过自动装箱成为对Integer对象的引用(因此无需手动创建Integer )。 它是JDK中不变的类之一,要更改其值,您将需要创建一个新的对象reference ,这就是为什么需要更新存储在session中的对象的原因-因为session仍然将引用地址存储为旧的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM