监听器与过滤器
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);
}
%>