过滤器(Filter )
过滤器 ,用来过滤网站的数据例如:处理中文乱码 或者 登录验证….
当前情况我们可以用过滤器处理字符编码问题
先去编写一个filter类去实现Filter,重写三个方法(初始化,过程,销毁)
package com.hz.util;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/***
* @title CharacterEncodingFilter
* @author 44326
* @version 1.0.0
* @create 2023/8/25 9:01
*过滤器,用来解决字符编码问题
**/
public class CharacterEncodingFilter implements Filter {
//初始化:web服务器启动,就已经初始化了,随时等待过滤对象出现
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter初始化");
}
/*
* 1. 过滤中的所有代码,在过滤特定请求的时候都会执行
2. 必须要让过滤器继续同行( chain.doFilter(request,response); )
* */
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
System.out.println("CharacterEncodingFilter执行前....");
filterChain.doFilter(servletRequest,servletResponse); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!
System.out.println("CharacterEncodingFilter执行后....");
}
@Override
public void destroy() {
System.out.println("CharacterEncodingFilter销毁");
}
}
然后去web.xml里映射一下这个类,同时配置
<!--过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name><!--名字-->
<filter-class>com.hz.util.CharacterEncodingFilter</filter-class><!--映射路径-->
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--访问/login的请求,会经过这个过滤器-->
<url-pattern>/login</url-pattern><!--这里路径是自带项目名的-->
<!--<url-pattern>/*</url-pattern>-->
<!-- 别偷懒写个 /* -->
</filter-mapping>
这样就好了
监听器(Listener)
监听器这里以session举例子
首先创建一个监听器类去实现HttpSessionListener类,里面有俩方法,一个是创建session时执行,session销毁时执行
package com.hz.util;
import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/***
* @title OnlineCountListener
* @author 44326
* @version 1.0.0
* @create 2023/8/25 9:25
*在线人数session监听
**/
public class OnlineCountListener implements HttpSessionListener {
//创建session监听: 看你的一举一动
//一旦创建Session就会触发一次这个事件!
public void sessionCreated(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
//看看sessionid
System.out.println(se.getSession().getId());
// 获取当前的值
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
// 第一次进来给个1,第二次以后加一
if (onlineCount==null){
onlineCount = new Integer(1);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count+1);
}
System.out.println("监听了"+onlineCount);
// 存入ServletContext里
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);
}
System.out.println("销毁了"+onlineCount);
ctx.setAttribute("OnlineCount",onlineCount);
}
}
然后去web.xml配置一下监听器
<!--session监听器-->
<listener>
<listener-class>com.hz.util.OnlineCountListener</listener-class>
</listener>
//jsp页面调用
//小脚本里
Integer onlineCount = (Integer) session.getServletContext().getAttribute("OnlineCount");
//外
<h1>当前在线人数:<%=onlineCount%></h1>