一.关于监听器
- 监听器:监听某个对象的的状态变化的组件
- 事件源:被监听的对象
- 监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器
- 注册监听器:将监听器与事件源进行绑定
- 响应行为:监听器监听到事件源的状态变化时所涉及的功能代码
二、监听器的编写步骤(重点):
- 编写一个监听器类去实现监听器接口
- 复写监听器的方法
- 需要在
web.xml
中进行配置
三、监听器有哪些?
ServletContext域中:
ServletContextListener
ServletContextAttributeListener
HttpSession域中:
HttpSessionListener
HttpSessionAttributeListener
ServletRequest域中:
ServletRequestListener
ServletRequestAttributeListener
对象感知监听器:(主体是针对一个对象且不需要在web.xml中配置)
HttpSessionBindingListener
HttpSessionActivationListener
四、监听器使用原理
1. Servlet域的生命周期
- 何时创建:服务器启动创建
- 何时销毁:服务器关闭销毁
2.监听的方法
public class MyServletContextListener implements ServletContextListener {
@Override
//监听context域对象的创建
public void contextInitialized(ServletContextEvent sce) {
//就是被监听的对象---ServletContext
ServletContext servletContext = sce.getServletContext();
//getSource就是被监听的对象的通用的方法
ServletContext source = (ServletContext) sce.getSource();
System.out.println("Servletcontext已创建");
}
//监听Servletcontext域对象的销毁
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Servletcontext已销毁");
}
}
3.配置xml文件
<listener>
<listener-class>com.listener.create.MyServletContextListener</listener-class>
</listener>
4.小demo
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//开启一个计息任务调度----每天晚上12点 计息一次
Timer timer = new Timer();
//task:任务 firstTime:第一次执行时间 period:间隔执行时间
//timer.scheduleAtFixedRate(task, firstTime, period);
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("嗨起来");
}
} , new Date(), 5000);
//修改成每晚十二点必嗨
//1、起始时间: 定义成晚上12点
//2、间隔时间:24小时
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String currentTime = "2020-10-22 00:00:00";
Date parse = null;
try {
parse = format.parse(currentTime);
} catch (ParseException e) {
e.printStackTrace();
}
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("嗨起来");
}
} , parse, 24*60*60*1000);
}
//监听context域对象的销毁
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("context销毁了....");
}
}
五、什么是过滤器
Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是Servlet 程序、Listener 监听器、Filter 过滤器。
Filter 过滤器它是 JavaEE 的规范,也就是一个接口。
Filter 过滤器它的作用是拦截请求和过滤响应。拦截请求常见的应用场景有权限检查、日记操作、事务管理等等。
六、Filter过滤器的使用
1、编写一个类去实现 Filter接口,并实现过滤方法 doFilter()
public class AdminFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
Object user = session.getAttribute("user");
// 如果等于 null,说明还没有登录
if (user == null) {
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
return;
}else {
// 让程序继续往下访问用户的目标资源
filterChain.doFilter(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
}
2、web.xml 中配置 Filter 的拦截路径
<filter>
<filter-name>AdminFilter</filter-name>
<filter-class>filter.AdminFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AdminFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
3、编写LoginServlet
程序
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("asd".equals(username) && "111".equals(password)){
request.getSession().setAttribute("user",username);
response.getWriter().write("登录成功");
}else {
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
七、Filter的生命周期
构造器方法
和init()
方法在web工程启动时就会被执行,此时filter
过滤器已经被创建。- 每次拦截到请求时,就会执行
doFilter()
方法。 - 在停止web工程时,就会执行
destroy()
方法,此时会销毁filter过滤器。
public class AdminFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
Object user = session.getAttribute("user");
// 如果等于 null,说明还没有登录
if (user == null) {
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
return;
}else {
// 让程序继续往下访问用户的目标资源
filterChain.doFilter(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
}
八、Filter的拦截路径
1、精确匹配
<url-pattern>/index.jsp</url-pattern>
2、目录匹配
<url-pattern>/admin/*</url-pattern>
3、后缀名匹配
<url-pattern>*.html</url-pattern>