当前位置: 首页> 游戏> 网游 > 南京seo关键词优化服务_去施工网_网络推广方案_电话号码宣传广告

南京seo关键词优化服务_去施工网_网络推广方案_电话号码宣传广告

时间:2025/7/9 12:15:18来源:https://blog.csdn.net/m0_67226963/article/details/143273694 浏览次数:1次
南京seo关键词优化服务_去施工网_网络推广方案_电话号码宣传广告

一、概念

监听器就是一个实现了特定接口的 Java 类,主要用于监听某个对象的状态变化的组件。

1、原理

1. 事件源:被监听的对象,即: request 、 session 、 servletContext 三大域对象。
2. 监听器:监听事件源对象,事件源对象状态的变化都会触发监听器。
3. 注册监听器:将监听器与事件源进行绑定,有两种注册方式: web.xml 或 @WebListener 注解
4. 事件:域对象发生改变


2、应用场景

1. 统计网站在线人数
2. 实现任务调度,启动定时程序

创建监听器的步骤:
1. 定义一个普通类实现监听器接口;
2. 重写监听器接口方法;
3. 注册监听器:配置 web.xml 或 @WebListener 注解

这个项目所用到的本地依赖jia包

二、监听域对象的创建与销毁


1. ServletContextListener

        用来监听 ServletContext 域对象的创建和销毁。
ServletContext 对象代表全局唯一对象,每个 web 工程会产生一个 ServletContext 对象。服务器启动时创建,服务器关闭时销毁。

package com.jn.listener;import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener{@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("Create ServletContext");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("Destory ServletContext");}
}


2.HttpSessionListener

        用来监听 HttpSession 域对象的创建和销毁。
Session 何时创建: Servlet 中是 request.getSession() , JSP 页面中自带 Session 。
Session 何时销毁:非正常关闭服务器, Session 过期, session.invalidate() 。

        创建条件:session作为jsp的九大内置对象,所以在访问jsp页面时,启动该listener。此演示访问index.jsp 

package com.jn.listener;import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;@WebListener
// session作为jsp的九大内置对象,所以在访问jsp页面时,启动该listener。此演示访问index.jsp
public class MyHttpSessionListener implements HttpSessionListener {//session创建时被自动触发@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("Session Have Created.SessionId=" + se.getSession().getId());}//session销毁时被自动触发session过期(默认有效时间为30min)、或者服务器被非法关闭时、强制调用session.invalidate()方法时会触发销毁@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("Session Have Destoried.SessionId=" + se.getSession().getId());}
}

index.jsp代码,里面有销毁动作,如果不注释访问此页面就会直接销毁

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title></head><body>MyHttpSessionListener的测试</body>
<%//session.invalidate();// 访问该页面到这会销毁session
%>
</html>

 


3.ServletRequestListener

用来监听 ServletRequest 域对象的创建和销毁。
Request 何时创建:请求发起时创建。
Request 何时销毁:响应结束时销毁。

package com.jn.listener;import jakarta.servlet.ServletRequestEvent;
import jakarta.servlet.ServletRequestListener;
import jakarta.servlet.annotation.WebListener;@WebListener
// 通过web/request.jsp来测试
public class MyServletRequestListener implements ServletRequestListener {//销毁自动触发@Overridepublic void requestDestroyed(ServletRequestEvent sre) {//销毁时的控制台打印以及服务器名的输出System.out.println("Request Destory" + sre.getServletRequest().getServerName());}//创建自动触发@Overridepublic void requestInitialized(ServletRequestEvent sre) {//创建时的控制台打印以及服务器名的输出System.out.println("Request Create" + sre.getServletRequest().getServerName());}
}

request.jsp代码编写 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>测试request对象监听器</title>
</head>
<body>
测试request对象监听器
<%request.getRequestDispatcher("index.jsp").forward(request,response);
%>
</body>
</html>


二、监听域对象属性改变

1. HttpSessionAttributeListener

        监听绑定到 HttpSession 域中某个对象状态 此类监听器是 Servlet 中比较特殊的监听器, 主要用来监听绑定到 Session 域中特定对象的状态。

此类监听器对域中属性进行不同操作时所触发的方法:
1. attributeAdded 监听属性添加 — 当数据范围对象没有该属性,第一次添加时会自动触发调用执行
2. attributeRemoved 监听属性移除 — 从一个数据范围对象删除一个已经存在的属性时会自动触发执行。
3. attributeReplaced 监听属性替换 — 当一个数据范围已经存在一个属性,向数据范围添加相同名称属性时自动触发替换方法。

package com.jn.listener;import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.http.HttpSessionAttributeListener;
import jakarta.servlet.http.HttpSessionBindingEvent;@WebListener
// 通过访问session.jsp页面来测试该代码
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {System.out.println("AddName:" + se.getName() + "\tAddValue:" + se.getValue());}@Overridepublic void attributeRemoved(HttpSessionBindingEvent se) {System.out.println("RemoveName:" + se.getName() + "\tRemoveValue:" + se.getValue());}@Overridepublic void attributeReplaced(HttpSessionBindingEvent se) {//在控制台打印修改后的属性名和value值,为防止打印的是没修改的name和value,采用以下方法得到value。不行的话把浏览器访问过的session给删除再重新访问System.out.println("ReplaceName:" + se.getName() + "\tReplaceValue:" + se.getSession().getAttribute(se.getName()));}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Session属性变化的Listener</title>
</head>
<body>
Session属性变化的Listener
<%//向session里面添加属性。第一次添加name属性,触发attributeAddedsession.setAttribute("name","Tom");//修改session里面name属性的值。非首次添加name属性,修改name属性的值,触发attributeReplacesession.setAttribute("name","Bob");//移出session里面name属性以及属性值。触发attributeRemovedsession.removeAttribute("name");
%>
</body>
</html>

2. ServletContextAttributeListener

        监听 ServletContext 中属性的变化

3. ServletRequestAttributeListener

        监听 ServletRequest 中属性的变化。

4、HttpSessionBindingListener

绑定:将 Java 对象绑定到 session 中

解除绑定:将 Java 对象从 session 中解除绑定

实体类: 

package com.jn.bean;import jakarta.servlet.http.HttpSessionBindingEvent;
import jakarta.servlet.http.HttpSessionBindingListener;//此监听器不需要注解就能在方法属性名绑定到session时触发
public class Student implements HttpSessionBindingListener {public Student() {}private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("Student Class Bounded Session Scope");}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println("Student Class Unbounded Session Scope");}
}

jsp代码:

<%@ page import="com.jn.bean.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>测试HttpSessionBindingListener监听器</title>
</head>
<body>
测试HttpSessionBindingListener监听器
<%//创建学生对象Student s = new Student();s.setName("Tom");//将学生对象绑定到session域中session.setAttribute("s",s);//移除学生对象session.removeAttribute("s");
%>
</body>
</html>

5、HttpSessionActivationListener

钝化 :数据随 Session 对象序列化到一个存储设备中(硬盘)。

活化 :数据随 Session 对象从一个存储设备中(硬盘)恢复到内存。

实体类:

package com.jn.bean;import jakarta.servlet.http.HttpSessionActivationListener;
import jakarta.servlet.http.HttpSessionEvent;import java.io.Serializable;//通过访问teacher01.jsp来添加Teacher类到session中关闭服务器来实现钝化。然后启动服务器实现锐化后访问teacher02.jsp得到session中的数据
public class Teacher implements HttpSessionActivationListener, Serializable {private String name;public Teacher() {}public String getName() {return name;}public void setName(String name) {this.name = name;}//钝化。触发条件:在规定的时间内不处理自动钝化、或者在服务器被关闭时钝化。可以把数据存储到本地磁盘,在下一次启动服务器时活化,能把session里面的数据拿到@Overridepublic void sessionWillPassivate(HttpSessionEvent se) {System.out.println("Class Passivation" + se.getSession().getId());}//活化。触发条件:在服务器被启动时@Overridepublic void sessionDidActivate(HttpSessionEvent se) {System.out.println("Class Didpassivation" + se.getSession().getId());}
}

techer1.jsp

<%@ page import="com.jn.bean.Teacher" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>钝化sessionWillPassivate</title>
</head>
<body>
钝化sessionWillPassivate
<%//创建Teacher对象Teacher teacher = new Teacher();//将teacher的name属性赋值并传到session里面teacher.setName("Tom");session.setAttribute("teacher",teacher);
%>
</body>
</html>

techer2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>测试钝化与活化</title>
</head>
<body>
得到钝化后的session数据
${sessionScope.teacher.name}
</body>
</html>

三、统计网站在线人数案例 

        需求分析

        当用户登录到 web 应用时,将当前用户信息保存到全局域中,当用户注销退出时将当前用户
从全局域中移除,从而达到统计网站在线人数的目的。

实现思路

        通过 ServletContextListener 监听,当 Web 应用上下文启动时,在 ServletContext 中添加一个 List 集合,用来准备存放在线的用户名;
然后,可以通过 HttpSessionAttributeListener 监听器,当用户登录成功,把用户名设置到 Session 中时,同时将用户名存放到 ServletContext
中的 List 列表中;最后通过 HttpSessionListener 监听,当用户注销会话时,将用户名从应用上下文范围中的 List 列表中删除。


实现步骤

1. 创建监听器

 同时实现ServletContextListener 、 HttpSessionAttributeListener 、 HttpSessionListener 接口

 实现继承三个接口

创建ServletContext对象,创建集合保存在线用户名称

添加或者更新信息后触发SessionAttributeListener

用户退出时session被销毁,将注销的在线人员从集合里面移出

package com.jn.listener;import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.http.HttpSessionAttributeListener;
import jakarta.servlet.http.HttpSessionBindingEvent;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;import java.util.LinkedList;
import java.util.List;@WebListener
public class OnlineListener implements ServletContextListener, HttpSessionAttributeListener, HttpSessionListener {private ServletContext application = null;//服务器创建时产生ServletContext对象,同时,创建一个list集合保存在线用户名称@Overridepublic void contextInitialized(ServletContextEvent sce) {//初始化一个application对象application = sce.getServletContext();//创建一个list集合保存到application里面application.setAttribute("online",new LinkedList<String>());}private void updateOline(HttpSessionBindingEvent se){//将全局域里面的list集合取出List<String> online = (LinkedList<String>) application.getAttribute("online");if (se.getName().equals("username")){//获取session中的值String username = (String) se.getSession().getAttribute(se.getName());//将用户名添加到list集合里面online.add(username);}//将更新后的集合数据重新保存到全局域对象中】application.setAttribute("online",online);}//当用户登录成功后,会将用户信息保存到session里面,session对象的属性信息@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {updateOline(se);}//再次向session中存用户信息时,修改操作@Overridepublic void attributeReplaced(HttpSessionBindingEvent se) {updateOline(se);}//当用户退出网站,session销毁,将当前注销的用户从在线人员集合中移除@Overridepublic void sessionDestroyed(HttpSessionEvent se) {//将全局域里面的list集合取出List<String> online = (LinkedList<String>) application.getAttribute("online");//获取要移除的用户名String username = (String) se.getSession().getAttribute("username");//从集合中移除用户名online.remove(username);//将更新后的集合数据保存回全局域对象application.setAttribute("online",online);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {}@Overridepublic void attributeRemoved(HttpSessionBindingEvent se) {}@Overridepublic void sessionCreated(HttpSessionEvent se) {}}


    2. 用户登录Servlet

package com.jn.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取页面的数据String username = req.getParameter("username");//判断用户名的合法性if(username!=null && !username.equals("")){//将用户名保存到session里面,此时触发了监听器SessionAttributeListener,然后将数据保存到了全局域list集合里面HttpSession session = req.getSession();session.setAttribute("username",username);}//转发到统计在线人数页面req.getRequestDispatcher("online.jsp").forward(req,resp);}
}

  3. 用户注销Servlet

package com.jn.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;import java.io.IOException;@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//销毁sessionHttpSession session = req.getSession();session.invalidate();//跳转到online.jspresp.sendRedirect("online.jsp");}
}


  4. 登录页面 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>登录</title></head><body><center><form action="login" method="post"><table width="400px" cellspacing="0" cellpadding="20" border="1"><caption><h2>登录</h2></caption><tr><td>账号:</td><td><input type="text" name="username"></td></tr><tr align="center"><td colspan="2"><input type="submit" name="regist" value="登录">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="reset" name="ret" value="取消"></td></tr></table></form></center></body>
</html>

  5. 在线人数页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>在线人数显示</title>
</head>
<body><h2>当前用户是:${sessionScope.username}</h2><h2>在线人数${applicationScope.online.size()},用户列表如下:</h2><ul><c:forEach items="${applicationScope.online}" var="username"><li>${username}</li></c:forEach></ul><a href="logout">注销</a>
</body>
</html>

 6、中文乱码过滤器

package com.jn.servlet;import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;import java.io.IOException;@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//System.out.println("Set Charter Encoding");//统计一处理中文乱码问题request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");//放行chain.doFilter(request,response);}@Overridepublic void destroy() {}
}

7、结果演示

 

 

关键字:南京seo关键词优化服务_去施工网_网络推广方案_电话号码宣传广告

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: