【发布时间】: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 再次...
谢谢!
【问题讨论】: