import javax.servlet.*;
import javax.servlet.http.*;
//统计在线人数:用session最方便
public class Listener implements HttpSessionListener {
public Listener() {
}
@Override
//一旦创建Session就会触发一次这个事件
public void sessionCreated(HttpSessionEvent se) {
/* Session is created. */
ServletContext ctx = se.getSession().getServletContext();
System.out.println(se.getSession().getId());
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount == null) {
onlineCount = new Integer(1);
} else {
int count = onlineCount.intValue();
onlineCount = new Integer(count + 1);
}
//装箱拆箱的操作务必细看,Integer是int的封装类,后面会附上两者的区别
ctx.setAttribute("OnlineCount", onlineCount);
}
//一旦销毁Session就会触发一次这个事件
@Override
public void sessionDestroyed(HttpSessionEvent se) {
/* Session is destroyed. */
}
}
Integer和int区别
监听器只需要注册无需映射:
<listener>
<listener-class>com.sunsplanter.listener.Listener</listener-class>
</listener>
index.jsp页面简单编辑输出:
<h1>当前有 <span><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%></span> 在线</h1>
运行后发现控制台输出3个sessionid,页面显示3个人在线,视频解释说Tomcat启动的时候会连接,连接有可能失败但session已经存在了所以会显示3个,重新部署即可解决,但问题是每次重启服务器都是3个,巧合得让人迷惑,此处未能理解.
因为GUI和Listener关联度比较高,练习以下GUI的使用,新建一个类名为TestPanel,内容如下:
import java.awt.*;
public class TestPanel {
public static void main(String[] args) {
Frame frame = new Frame("Hello");//新建一个窗体
Panel panel = new Panel(null);//新建一个面板
frame.setLayout(null);//设置窗体的布局
frame.setBounds(300,300,500,500);
frame.setBackground(new Color(0,0,255));//s设置背景颜色
panel.setBounds(50,300,300,300);
panel.setBackground(new Color(0,255,0));
frame.add(panel);
frame.setVisible(true);
}
}
运行后发现无法关闭,因为没有设置监听事件,我们增加以下代码:
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);//0代表正常终止,1代表异常终止
System.out.println("Closing");
}
});
就可以正常关闭.