今天又重新学习了 java web 的基础 监听器技术, 用 sessionListener 简单的实现了网页统计在线人数 (有一个 bug 就是当关闭网页的时候 session 不会关闭依旧存在, 除非关闭服务器), 代码如下 (前端网页代码就不显示了):
- LoginServlet.java:
- 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;
- @WebServlet(name = "LoginServlet",urlPatterns = "/login")
- public class LoginServlet extends HttpServlet {
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- String username=request.getParameter("username");
- HttpSession session=request.getSession();
- session.setAttribute("username",username);
- // 重新定向到 index.jsp
- response.sendRedirect("index.jsp");
- }
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- }
- }
- ExitServlet.java:
- package servlet;
- 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;
- @WebServlet(name = "ExitServlet",urlPatterns = "/exit")
- public class ExitServlet extends HttpServlet {
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // 从 session 中移除 loginName 参数
- response.getWriter().write("2222");
- HttpSession session=request.getSession();
- session.removeAttribute("username");
- // 重新定向到 login.jsp
- response.sendRedirect("login.jsp");
- }
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- doPost(request, response);
- }
- }
- OnlineListener.java:
- package listener;
- import bean.User;
- import javax.servlet.ServletContextEvent;
- import javax.servlet.ServletContextListener;
- import javax.servlet.http.HttpSessionAttributeListener;
- import javax.servlet.http.HttpSessionEvent;
- import javax.servlet.http.HttpSessionListener;
- import javax.servlet.http.HttpSessionBindingEvent;
- @javax.servlet.annotation.WebListener()
- public class OnlineListener implements ServletContextListener,
- HttpSessionListener, HttpSessionAttributeListener {
- public OnlineListener() {
- }
- @Override
- public void contextInitialized(ServletContextEvent sce) {
- }
- @Override
- public void contextDestroyed(ServletContextEvent sce) {
- }
- @Override
- public void sessionCreated(HttpSessionEvent se) {
- System.out.println("会话已创建");
- }
- @Override
- public void sessionDestroyed(HttpSessionEvent se) {
- System.out.println("会话已销毁");
- }
- @Override
- public void attributeAdded(HttpSessionBindingEvent sbe) {
- // 向 session 范围中添加一个用户
- User.addUser(String.valueOf(sbe.getValue()));
- System.out.println("session 增加属性为"+sbe.getName()+"值为:"+sbe.getValue());
- }
- @Override
- public void attributeRemoved(HttpSessionBindingEvent sbe) {
- // 将 session 会话中的用户移除
- User.removeUser(String.valueOf(sbe.getValue()));
- System.out.println(sbe.getValue()+"属性已被移除");
- }
- @Override
- public void attributeReplaced(HttpSessionBindingEvent sbe) {
- // 获取旧的属性值
- String oldValue=String.valueOf(sbe.getValue());
- // 获取新的属性值
- String newValue=String.valueOf(sbe.getSession().getAttribute(sbe.getName()));
- // 移除旧的属性, 添加新的属性
- User.removeUser(oldValue);
- User.addUser(newValue);
- }
- }
用两个不同的浏览器运行结果如下图所示:
项目工程目录如下图:
(坚持学习! 努力加油! 勉励自己)
来源: http://www.bubuko.com/infodetail-2532518.html