| # web.xml |
| <context-param> |
| <param-name>url</param-name> |
| <param-value>https: |
| </context-param> |
| |
| <context-param> |
| <param-name>topic</param-name> |
| <param-value>java课堂</param-value> |
| </context-param> |
| |
| # 实体类 |
| public class Config { |
| |
| private String url; |
| |
| private String topic; |
| |
| public String getUrl() { |
| return url; |
| } |
| |
| public void setUrl(String url) { |
| this.url = url; |
| } |
| |
| public String getTopic() { |
| return topic; |
| } |
| |
| public void setTopic(String topic) { |
| this.topic = topic; |
| } |
| |
| } |
| |
| # 监听器 |
| @WebListener |
| public class ContextListener implements ServletContextListener { |
| |
| |
| |
| |
| |
| @Override |
| public void contextInitialized(ServletContextEvent sce) { |
| System.out.println("ContextListener contextInitialized"); |
| |
| ServletContext servletContext = sce.getServletContext(); |
| String url = servletContext.getInitParameter("url"); |
| String topic = servletContext.getInitParameter("topic"); |
| |
| Config config = new Config(); |
| config.setTopic(topic); |
| config.setUrl(url); |
| |
| servletContext.setAttribute("config",config); |
| } |
| |
| |
| |
| |
| |
| @Override |
| public void contextDestroyed(ServletContextEvent sce) { |
| System.out.println("ContextListener contextDestroyed"); |
| } |
| |
| } |
| |
| # 编写用于测试的servlet,获取领域对象中的数据 |
| @WebServlet("/forward") |
| public class DispatchServlet extends HttpServlet { |
| |
| @Override |
| protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { |
| |
| Config config = (Config) req.getServletContext().getAttribute("config"); |
| System.out.println(config.getTopic()); |
| |
| System.out.println("DispatchServlet doGet"); |
| req.getRequestDispatcher("/index.jsp").forward(req,response); |
| } |
| |
| } |
| http://localhost:8081/forward |
| |
| |
| java���� |
| DispatchServlet doGet |
| # ContextListener中设置初始值 |
| servletContext.setAttribute("onlineNum",0); |
| |
| # 编写SessionListener |
| @WebListener |
| public class SessionListener implements HttpSessionListener { |
| |
| |
| |
| |
| |
| @Override |
| public void sessionCreated(HttpSessionEvent se) { |
| System.out.println("SessionListener sessionCreated"); |
| ServletContext servletContext = se.getSession().getServletContext(); |
| |
| Integer onlineNum = (Integer)servletContext.getAttribute("onlineNum"); |
| |
| servletContext.setAttribute("onlineNum",++onlineNum); |
| } |
| |
| |
| |
| |
| |
| @Override |
| public void sessionDestroyed(HttpSessionEvent se) { |
| System.out.println("SessionListener sessionDestroyed"); |
| ServletContext servletContext = se.getSession().getServletContext(); |
| |
| Integer onlineNum = (Integer)servletContext.getAttribute("onlineNum"); |
| |
| servletContext.setAttribute("onlineNum",--onlineNum); |
| } |
| |
| } |
| |
| # 编写add.jsp |
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
| <html> |
| <head> |
| <title>javaweb统计在线人数</title> |
| </head> |
| <body> |
| |
| 近30分钟在线人数: ${applicationScope.onlineNum} |
| |
| </body> |
| </html> |
-
取消勾选

-
启动测试

-
使用RequestListener统计访问量
| # ContextListener中设置初始访问值 |
| servletContext.setAttribute("totalVisit",0); |
| |
| # 编写RequestListener |
| @WebListener |
| public class RequestListener implements ServletRequestListener { |
| |
| |
| |
| |
| |
| @Override |
| public void requestDestroyed(ServletRequestEvent sre) { |
| System.out.println(" RequestListener requestDestroyed"); |
| } |
| |
| |
| |
| |
| |
| @Override |
| public void requestInitialized(ServletRequestEvent sre) { |
| System.out.println(" RequestListener requestInitialized"); |
| Integer totalVisit = (Integer)sre.getServletContext().getAttribute("totalVisit"); |
| System.out.println("历史总访问次数:"+totalVisit); |
| totalVisit++; |
| sre.getServletContext().setAttribute("totalVisit",totalVisit); |
| } |
| |
| } |
| |
| # jsp中获取访问量 |
| 应用服务器启动后总访问次数:${totalVisit} |
- 测试

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术