java监听器和过滤器的区别_JavaWeb之过滤器与监听器

十一、过滤器与监听器

目录:Filter(重点)、监听器、过滤器 监听器的常见应用

1.Filter(重点)

Filter:过滤器,用来过滤网站的数据,如处理中文乱码、登录验证…

fd3f03db2718

过滤器的使用

Filter开发步骤:

①导报

注意:Filter使用的是Filter(javax.servlet)。

②编写过滤器

实现Filter接口,重写对应的方法接口。

以防中文乱码为例

package com.ping.filter

import javax.servlet.*;

import java.io.IOException;

public class CharacterEncodingFilter implements Filter {

//初始化:web服务器启动就初始化了,随时等待过滤对象出现

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("CharacterEncodingFilter初始化");

}

//Chain : 链

/*

Ⅰ过滤中的所有代码,在过滤特定请求的时候都会执行。

Ⅱ必须要让过滤器继续同行。

chain.doFilter(request,response);

*/

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

request.setCharacterEncoding("utf-8");

response.setCharacterEncoding("utf-8");

response.setContentType("text/html;charset=UTF-8");

System.out.println("CharacterEncodingFilter执行前...");

chain.doFilter(request,response); //如果不写,程序到这里就被拦截停止

System.out.println("CharacterEncodingFilter执行后...");

}

//销毁:web服务器关闭的时候,过滤会销毁

public void destroy() {

System.out.println("CharacterEncodingFilter销毁");

}

}

③在web.xml中配置Filter

CharacterEncodingFilter

com.kuang.filter.CharacterEncodingFilter

CharacterEncodingFilter

/servlet/*

2.监听器

编写一个监听器:

①实现监听器的接口。

package com.ping.listener;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

//统计网站在线人数 : 统计session

public class OnlineCountListener implements HttpSessionListener {

//创建session监听,一旦创建Session就会触发一次这个事件

public void sessionCreated(HttpSessionEvent se) {

ServletContext ctx = se.getSession().getServletContext();

System.out.println(se.getSession().getId());

Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

if (onlineCount==null){

onlineCount = new Integer(1);

}else {

int count = onlineCount.intValue();

onlineCount = new Integer(count+1);

}

ctx.setAttribute("OnlineCount",onlineCount);

}

//销毁session监听,一旦销毁Session就会触发一次这个事件

public void sessionDestroyed(HttpSessionEvent se) {

ServletContext ctx = se.getSession().getServletContext();

Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

if (onlineCount==null){

onlineCount = new Integer(0);

}else {

int count = onlineCount.intValue();

onlineCount = new Integer(count-1);

}

ctx.setAttribute("OnlineCount",onlineCount);

}

}

②在前端取出实现

当前有人在线

③在web.xml中注册监听器

com.ping.listener.OnlineCountListener

Session销毁:

①手动销毁

getSession().invalidate();

②自动销毁

1

3.过滤器、监听器常见应用

1)监听器在GUI编程中经常使用

package com.ping.listener;

import java.awt.*;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.awt.event.WindowListener;

public class TestPanel {

public static void main(String[] args) {

Frame frame = new Frame("Hello World"); //新建一个窗体

Panel panel = new Panel(null); //面板

frame.setLayout(null); //设置窗体的布局

frame.setBounds(300,300,500,500);

frame.setBackground(new Color(0,0,255)); //设置背景颜色

panel.setBounds(50,50,300,300);

panel.setBackground(new Color(0,255,0)); //设置背景颜色

frame.add(panel);

frame.setVisible(true);

//监听事件,监听关闭事件

frame.addWindowListener(new WindowAdapter() {

@Override

public void windowClosing(WindowEvent e) {

super.windowClosing(e);

}

});

}

}

2)用户登录之后才能进入主页,用户注销后就不能进入主页了。

①用户登录之后,向Sesison中放入用户的数据。

②进入主页的时候要判断用户是否已经登录,要求在过滤器中实现。

package com.ping.filter;

import javax.servlet.*;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

public class CharacterEncodingFilter implements Filter {

public void init(FilterConfig filterConfig) throws ServletException { }

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;

HttpServletResponse response = (HttpServletResponse) resp;

if (request.getSession().getAttribute(Constant.USER_SESSION)==null){

response.sendRedirect("/error.jsp");

}

chain.doFilter(request,response);

}

public void destroy() { }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值