【问题标题】:Java Servlets session.getAttribute and setAttributeJava Servlets session.getAttribute 和 setAttribute
【发布时间】:2014-11-01 18:06:37
【问题描述】:

我试图为每个会话的获取请求创建一个计数器,但我终于成功了,但是,我有一个问题要深入了解它的工作原理。这是我的代码:

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 我将无法看到新的增值。为什么我必须再次设置才能获得正确的值?当我按下刷新时,我正在发出一个新的获取请求,它采用 COUNTER 的旧值(例如 2),然后我们检查它是否不为空并将其增加 1。我不明白为什么我必须使用session.setAttribute 再次...

谢谢!

【问题讨论】:

    标签: java session servlets


    【解决方案1】:

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

    第二: 这种行为与不变性 的概念和理解Java 的references 的概念有关。

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

    【讨论】:

      猜你喜欢
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 2011-03-23
      • 2015-06-23
      相关资源
      最近更新 更多