监听器笔记

监听器与过滤器
1.Servlet
Servlet是一个在服务器运行的类,它于第一次访问时创建,一直驻扎在服务器的Serlvet容器中,直到应用程序线束或服务器关闭才释放。所以,它是一个单例模式。
配置可以用注解的方式进行配置,

@WebServlet(value= {"/student","/stu"})
public class StudentServlet extends HttpServlet {

可以在web.xml文件中进行配置。
<servlet>
   <servlet-name>student</servlet-name>   <servlet-class>com.bdqn.servlet.StudentServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>student</servlet-name>
   <url-pattern>/student</url-pattern>
  </servlet-mapping>

2.过滤器
概述:
过滤器是在客户端与服务器之间设置一个关卡,它可以对语法进行数据的处理过滤,对响应进行数据的处理过滤。请求会通过过滤器,响应也会通过过滤器。如果请求无法通过过滤器,则服务端接收不到客户端的请求。
过滤器的生命周期
在这里插入图片描述
过滤器的生命周期
它在程序运行时(部署时)就初始化了。然后就一直驻扎服务器,也要到应用程序结束或服务器关闭时才释放资源。
过滤器创建
过滤器的创建需要实现Filter接口。接口中的方法如下:
实现类

package com.bdqn.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharacterFilter implements Filter {
    //此方法是过滤销毁才调用的方法,在程序关闭或服务器关闭时执行
	@Override
	public void destroy() {
		System.out.println("过滤器被销毁..");		
	}
    //此方法是对数据进行处理的地方
	//
	@Override
	public void doFilter(ServletRequest request, 
			ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("请求通过过滤器......");
		//对请求与响应的数据进行编码设置.
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		
		//放行,否则请求会永远停留在此。
		chain.doFilter(request, response);
		
	}
    //在程序部署时就执行
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		System.out.println("过滤器被初始化..");		
	}
}

过滤器配置
过滤器可以用注解的方式配置,
// /* 表示所有的请求都进行过滤 /.html只过滤请求html页面
// /admin/
表示请求admin目录下的所有资源都会被过滤

@WebFilter("/*")
public class CharacterFilter implements Filter {
可以像Servlet一样在web.xml文件中进行配置。
<!-- 过滤器配置 -->
  <filter>
   <filter-name>char</filter-name>
   <filter-class>com.bdqn.filter.CharacterFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>char</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

过滤用户登录功能实现
创建过滤器类:

package com.bdqn.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
//后台资源全部在admin目录下,请求此目录下的资源都进行过滤
@WebFilter("/admin/*")
public class CheckUserFilter implements Filter {
	@Override
	public void destroy() {
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//判断Session中是否存储了用户信息。为空则表示没有登录。		
	if(((HttpServletRequest)request).getSession().
getAttribute("user")==null) {
System.out.println("你还没有登录..");			 
request.getRequestDispatcher("/login.jsp").
forward(request, response);
		}
		chain.doFilter(request, response);//放行		
	}
	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}
}

3.监听器
概述
它起到监听的作用,针对程序运行过程中的某事物发生做监听,如果事情发生,监听器则做出相关对应的响应。
常用的监听器在这里插入图片描述

监听器配置:
注解配置

@WebListener
public class CountUserListener implements HttpSessionListener 

Web.xml中配置:
<!-- 监听器配置 -->
<listener>
    <listener-class>com.bdqn.Listener.CountUserListener</listener-class>
 </listener>

实现网站在线人数

package com.bdqn.Listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import oracle.jrockit.jfr.tools.ConCatRepository;
/**
 * HttpSessionListener此监听器可以监听到Session的开启与销毁
 * @author Administrator
 */
@WebListener
public class CountUserListener implements HttpSessionListener {
    //当Session创建时,自动执行此方法
	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		System.out.println("创建了一个Session");
	    //一旦Session创建,则向application中的记数器加 1
//arg0.getSession()这是Session对象
		//arg0.getSession().getServletContext()这是访问到Application对象
		//判断是否有这个属性,如果没有,则是第一个人。
		if(arg0.getSession().getServletContext().getAttribute("count") == null)   
			arg0.getSession().getServletContext().setAttribute("count", 1);
		else {
			//取出记数器
			int count = Integer.parseInt( arg0.getSession().getServletContext().getAttribute("count")+"");
		    count++;  //记数器累加
		    //重新保存在线人数到application对象中
		    arg0.getSession().getServletContext().setAttribute("count", count);
		}
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		System.out.println("Ssession被销毁..");
		//一旦Session销毁,则向application中的记数器减 1
		int count = Integer.parseInt( arg0.getSession().getServletContext().getAttribute("count")+"");
	    count--;  //记数器减1
	    arg0.getSession().getServletContext().setAttribute("count", count);
	}
}

Jsp页面处理

<%
	    String count="0";
		if (application.getAttribute("count") != null) {
			count = application.getAttribute("count").toString();
			out.print("在线人数:"+count);
		}
	%>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值