IDE(Integrated Development Environment),全称是集成开发环境 ,是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。常见的IDE工具有Pycharm,Visual Studio Code等等。
文件:url80.ctfile.com/f/25127180-734988233-1655c3?p=551685 (访问密码: 551685)
Listener监听器
1.Listener监听器介绍
Listener监听器是JavaWeb三大组件之一。JavaWeb三大组件分别是:Servlet程序,Listener监听器,Filter过滤器。
Listener是JavaEE的规范,即接口。
监听器的作用是,监听某种变化(一般就是对象的创建/销毁,属性变化),触发对象方法完成相应的任务。
JavaWeb中的监听器共八个,目前最常用的是ServletContextListener,ServletContextAttributeListener,HttpSessionListener和ServletRequestListener。
2.JavaWeb的监听器
2.1ServletContextListener监听器
作用:监听ServletContext创建或者销毁(当我们web应用启动时,Tomcat就会创建ServletContext对象),即生命周期监听
应用场景:
加载初始化的配置文件;比如spring的配置文件
任务调度(配合定时器Timer/TimerTask)
相关方法:
void contextInitialized(ServletContextEvent sce):创建ServletContext对象时触发
void contextDestroyed(ServletContextEven sce):销毁ServletContext对象时触发
应用实例
首先创建一个项目,添加web支持,因为listener监听器是Servlet规范,要使用就要引入Servlet.jar包
image-20221127165358783
创建一个普通类,如果该类实现了某个监听接口,那么此类就是一个监听器。该类可以监听的事件由该类实现的监听接口决定:
package com.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
-
1.当一个类实现了 ServletContextListener 接口时
-
2.该类就是一个监听器
-
3.该类可以监听的事件由该类实现的监听接口决定 ,比如实现ServletContextListener接口,
-
那么该类就可以监听ServletContext对象的创建和销毁,以此类推
-
4.下面的MyServletContextListener就是一个监听者
-
5.当web应用启动时,就会产生ServletContextEvent事件,会调用监听器的对应事件处理方法
-
如:contextInitialized(),同时会传递 事件对象
-
6.程序员可以通过 ServletContextEvent 事件对象,来获取需要的信息,然后再进行业务处理
-
7.Tomcat怎么知道这个监听器存在呢? 因为我们需要在web.xml文件中进行配置,
-
一旦配置后,tomcat启动后就会反射实例化该监听器,放到容器里面去管理
*/
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
System.out.println(“MyServletContextListener监听到=” +
servletContext + “被创建…”);
//如果我们获取到ServletContext对象…可以进行业务处理
}@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
System.out.println(“MyServletContextListener监听到=” +
servletContext + “被销毁…”);
//比如可以对ServletContext 数据进行处理,或者日志的管理…
System.out.println(“进行处理工作…”);
}
}
配置web.xml
com.listener.MyServletContextListener
配置Tomcat
点击启动tomcat时,我们可以看到监听器被触发了:
image-20221127172929861
点击停止tomcat时,可以看到监听器再一次被触发:
image-20221127172702514
2.2ServletContextAttributeListener监听器
作用:监听ServletContext属性的变化
相关方法:
void attributeAdded(ServletContextAttributeEvent event):添加属性时调用
void attributeReplaced(ServletContextAttributeEvent event):替换属性时调用
void attributeRemoved(ServletContextAttributeEvent event):移除属性时调用
应用实例
创建监听器:MyServletContextAttributeListener
package com.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(“MyServletContextAttributeListener 监听到添加属性…” +
servletContextAttributeEvent.getName() + “=” +
servletContextAttributeEvent.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("MyServletContextAttributeListener 监听到删除属性.." +
servletContextAttributeEvent.getName() + "=" +
servletContextAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("MyServletContextAttributeListener 监听到修改属性.." +
servletContextAttributeEvent.getName() + "=" +
servletContextAttributeEvent.getValue());
}
}
创建servlet:HiServlet
package com.servlet;
import javax.servlet.;
import javax.servlet.http.;
import java.io.IOException;
public class HiServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//给ServletContext对象操作属性
ServletContext servletContext = getServletContext();
//添加属性
servletContext.setAttribute("name", "杰克");
//修改属性
servletContext.setAttribute("name", "托马斯");
//删除属性
servletContext.removeAttribute("name");
System.out.println("HiServlet 处理完毕...");
}
}
web.xml:配置监听器和servlet
image-20221127175211190
2.3HttpSessionListener监听器
作用:监听Session创建或销毁,即生命周期监听
相关方法:
void sessionCreated(HttpSessionEvent se):创建session时调用
void sessionDestroyed(HttpSessionEvent se):销毁session时调用
使用方法和前面一样,可以用于监听用户上线,离线
应用实例
创建监听器:MyHttpSessionListener
package com.listener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
//当session被创建时,设置一个生命周期10s
session.setMaxInactiveInterval(10);
System.out.println("MyHttpSessionListener 监听到session创建= " + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
System.out.println("MyHttpSessionListener 监听到session销毁= " + session.getId());
}
}
修改HiServlet代码:
package com.servlet;
import javax.servlet.;
import javax.servlet.http.;
import java.io.IOException;
public class HiServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session对象
request.getSession();
System.out.println("HiServlet 处理完毕...");
}
}
配置监听器:
com.listener.MyHttpSessionListener
现在我们重启Tomcat,可以看到还没有访问HiServlet,就已经创建了两个session。这是因为启动Tomcat时,会默认访问项目首页面,tomcat会自动创建两个session,这里忽略即可。
image-20221127181720060
在浏览器访问HiServlet,可以看到后台首先创建了一个session,在设置的生命周期内不访问该session,显示该session被销毁。
image-20221127182810302
HttpSessionListener监听器可以用于监听用户上线离线
注意:这里的session不是浏览器一关闭就销毁,session的销毁是服务器端去轮询决定的,因此如果想要用户浏览器一关闭就销毁session,可以通过前端在用户浏览器关闭之前,向服务器发送一个通知,服务器收到通知后销毁该session即可。