1. 过滤器 【filter】

作用:

  对单个获取多个servlet起到增强【advice】的作用。

  用于在所有的servlet执行前,做一些预处理。例如:做编码处理,

    访问量统计【servletContext = application】,request.getServletContext()

    获取user 的ip:request.getRemoteAddr();

特性:

  单例,线程不安全

创建:

  实现javax.servlet.Filter接口:

package cn.getword.filter;

import javax.servlet.*;
import java.io.IOException; public class EncodingFilter implements Filter {
private String charset;
/**
* 初始化方法,只执行一次
* 配置过滤器参数
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init encoding filter...");
charset = filterConfig.getInitParameter("charset");
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding(charset);
System.out.println("before");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("after");
} /**
* 销毁方法,只执行一次
*/
@Override
public void destroy() {
System.out.println("destroy encoding filter");
}
}

  设置编码:ServletRequest是一个接口,setCharacterEncoding方法, servletRequest参数是HTTPServletRequest类的实例,可以不用强转

  配置:

    <filter>
<filter-name>encoding</filter-name>
<filter-class>cn.getword.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>

  不仅能过滤servlet,而且还能过滤jsp文件,还有静态资源文件.

  过滤所有servlet:*.do  ,过滤所有.do的servlet

生命周期:

  在服务器启动时,进行实例化。单例

  每次过滤,执行一次doFilter方法

多个过滤器共同生效:

  /index.do

  *.do

  执行顺序:注册的顺序【web.xml】,注解也有顺序。过滤器链,最后一个过滤器调用servlet的方法

   转发:不会被过滤器过滤。

  重定向:再次请求,会被过滤。

2. 监听器  Listener

  含义:用来监听其他对象的状态变或者触发的事件。

  特性:单例,线程不安全

  分类:针对servlet域对象。

  • ServletRequest
  • HttpSession
  • ServletContext  = application【jsp】 = applicationScope【EL】

  针对域对象,有8个监听接口,监听6个事件。

对象  监听接口 监听事件 说明
针对ServletContext ServletContextListener
ServletContextEvent
监听创建和销毁事件
ServletContextAttributeListener
ServletContextAttributeEvent
监听属性变化
针对HttpServletRequest ServletRequestListener 省略  
ServletRequestAttributeListener 省略  
HttpSession HttpSessionListener HttpSessionEvent  
HttpSessionAttributeListener HttpSessionBindingEvent  
HttpSessionBindingListener 绑定特定对象【实现该接口的对象】,触发事件  
HttpSessionActivationListener 了解  

  监听创建和销毁:ServletContextListener, ServletRequestListener, HttpSessionListener

  创建:

实现接口

  ServletContextListener:监听创建、销毁

package cn.getword.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class AServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("application 对象被创建了...");
} @Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("application 对象被销毁了...");
}
}

  ServletContextAttributeListener:监听属性变化【增删改查】,

e.g application.setAttribute(key, value);【jsp】

   request.getServletContext().setAttribute(key, value); 【servlet】

package cn.getword.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener; public class AServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) { } @Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) { } @Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) { }
}

HttpSessionActivation: 不需要再web.xml中配置。【了解】

  作用:监听session的钝化、活化

  钝化:session序列化到硬盘中

  活化:session反序列化到内存中

  如果该类实现HttpSessionActivation和Serializable接口,就会和session一起写入硬盘中

  如果没有实现Serilizable接口,钝化时就会被剔除

HttpSessionBindingListener:【不需要配置】

  作用:实现该接口的对象,一旦被绑定【setAttribute】或者移除【removeAttribute】session对象中,就会触发事件。

e.g session.setAttribute(key, new HttpSessionBindingListener())

  配置:

    <listener>
<listener-class>cn.getword.listener.AServletContextListener</listener-class>
</listener>

多个监听器加载顺序也是和配置顺序一样

3.三大组件的启动顺序

listener>filter>Servlet

  应用:统计在线人数

设置session过期时间:

    <!--设置session过期时间-->
<session-config> <!--分钟为单位-->
<session-timeout>1</session-timeout>
</session-config>

  当session过期后,不会立刻被清理掉,而是需要等待垃圾回收机制【GC】自动回收,才能触发session销毁事件。

package cn.getword.model;

import java.util.Date;

public class OnlineUser {
private Integer id;
private String username;
private String ip;
private String area;
private String time; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getIp() {
return ip;
} public void setIp(String ip) {
this.ip = ip;
} public String getTime() {
return time;
} public void setTime(String time) {
this.time = time;
} public String getArea() {
return area;
} public void setArea(String area) {
this.area = area;
} @Override
public String toString() {
return "OnlineUser{" +
"id=" + id +
", username='" + username + '\'' +
", ip='" + ip + '\'' +
", area='" + area + '\'' +
", time=" + time +
'}';
}
}

OnlineUser.java

package cn.getword.listener;

import cn.getword.domain.User;
import cn.getword.model.OnlineUser; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;
import java.util.ArrayList;
import java.util.List; /**
* 在线user信息,保存
* 使用application对象保存user信息
*/
@WebListener()
public class OnlineSessionListener implements ServletContextListener,
HttpSessionListener, HttpSessionAttributeListener {
public static List<OnlineUser> onlineUsers = new ArrayList<OnlineUser>(); // Public constructor is required by servlet spec
public OnlineSessionListener() {
} // -------------------------------------------------------
// ServletContextListener implementation
// -------------------------------------------------------
public void contextInitialized(ServletContextEvent sce) {
/* This method is called when the servlet context is
initialized(when the Web application is deployed).
You can initialize servlet context related data here.
*/
} public void contextDestroyed(ServletContextEvent sce) {
/* This method is invoked when the Servlet Context
(the Web application) is undeployed or
Application Server shuts down.
*/
} // -------------------------------------------------------
// HttpSessionListener implementation
// -------------------------------------------------------
public void sessionCreated(HttpSessionEvent se) {
/* Session is created. */
} /**
* session注销事件,如果session注销前,用户登录了,则清除该用户
*
* @param se
*/
public void sessionDestroyed(HttpSessionEvent se) {
se.getSession().invalidate();
OnlineUser user = (OnlineUser) se.getSession().getAttribute("user");
if (user != null) {
System.out.println(user.getUsername() + "被注销了");
}
} // -------------------------------------------------------
// session属性添加事件:如果添加了user属性,则将该用户添加到在线名单中
// ------------------------------------------------------- public void attributeAdded(HttpSessionBindingEvent sbe) {
/* This method is called when an attribute
is added to a session.
*/
if ("user".equals(sbe.getName())) { //session添加了属性user
System.out.println("add a user" + sbe.getValue());
onlineUsers.add((OnlineUser) sbe.getValue());
} } /**
* 属性移除事件:如果移除了user属性,则将该user从在线列表中删除
*
* @param sbe
*/
public void attributeRemoved(HttpSessionBindingEvent sbe) {
/* This method is called when an attribute
is removed from a session.
*/
if ("user".equals(sbe.getName())) { //session添加了属性user
System.out.println("remove a user" + sbe.getValue());
onlineUsers.remove((OnlineUser) sbe.getValue());
}
} public void attributeReplaced(HttpSessionBindingEvent sbe) {
/* This method is invoked when an attibute
is replaced in a session.
*/
}
}

OnlineSessionListener.java

注意:

end

Javaweb三大组件-过滤器、监听器的更多相关文章

  1. JavaWeb三大组件—过滤器filter

    JavaWeb三大组件 1. 都需要在web.xml中进行配置ServletListener(2个感知监听器不需要配置)Filter 2. 过滤器 它会在一组资源(jsp.servlet..css.. ...

  2. JavaWeb三大组件——过滤器的运行机制理解

    过滤器Filter 文章前言:本文侧重实用和理解. 一.过滤器的概念. lFilter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 ...

  3. 学习笔记_过滤器概述(过滤器JavaWeb三大组件之一)

    过滤器Filter Filter和Lister是Servlet规范里的两个高级特性.不同于Servlet,它们不用于处理客户端请求,只用于对request.response进行修改或者对context ...

  4. 转-JavaWeb三大组件之Listener监听器

    JavaWeb三大组件之Listener监听器一.概述1,它是一个接口,内容由我们来实现 2,它需要注册,例如注册在按钮上 3,监听器中的方法,会在特殊事件发生时被调用 二.JavaWeb中的监听器1 ...

  5. JavaWeb三大组件

    一.JavaWeb三大组件 Servlet,Listener,Filter.它们在JavaWeb开发中分别提供不同的功能. JavaWeb三大组件都必须在Web.xml中配置 二.三大组件 1.Ser ...

  6. JavaWeb三大组件(Servlet、Filter、Listener)

    JavaWeb三大组件指的是:Servlet.Filter.Listener,这三个组件在JavaWeb开发中分别提供不同的功能,然而很多人可能只用过其中一个或者两个(Servlet.Filter,比 ...

  7. JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)

    JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference

  8. Filter过滤器-JavaWeb三大组件之一

    Servlet.Filter.Listener是JavaWeb的三大组件,给Web开发提供了很大的便利. 什么是Filter? Filter,过滤器.类似与生活中的净水器.空气净化器. JavaWeb ...

  9. JavaWeb笔记——三大组件之监听器

    1 JavaWeb监听器概述 在JavaWeb被监听的事件源为:ServletContext.HttpSession.ServletRequest,即三大域对象. l  监听域对象“创建”与“销毁”的 ...

随机推荐

  1. postgresql删除活动链接的数据库

    当我们在使用drop database testdb命令删除数据库时,会提示该数据库正在被使用,这样我们就无法删除,此时我们可以通过如下语句断开该数据库的所有链接: SELECT pg_termina ...

  2. linux防火墙(二)—— iptables语法之选项和控制类型

    一.语法: iptables [-t 表名] 选项 [链名] [匹配条件] [-j 控制类型] 未指定表名时,默认用filter表:链名,控制类型要大写:除非设置默认策略,否则必须指定匹配条件:不指定 ...

  3. 【智能算法】迭代局部搜索(Iterated Local Search, ILS)详解

    迭代局部搜索(Iterated Local Search, ILS) 源代码下载请关注微信公众号[程序猿声],在后台回复:[ILS],不包括[]即可下载. 00 目录 局部搜索算法 简单局部搜索 迭代 ...

  4. Leetcode 8. String to Integer (atoi) atoi函数实现 (字符串)

    Leetcode 8. String to Integer (atoi) atoi函数实现 (字符串) 题目描述 实现atoi函数,将一个字符串转化为数字 测试样例 Input: "42&q ...

  5. redis原理及实现

    1 什么是redis redis是nosql(也是个巨大的map) 单线程,但是可处理1秒10w的并发(数据都在内存中) 使用java对redis进行操作类似jdbc接口标准对mysql,有各类实现他 ...

  6. [Microsoft] 微软技术平台的Cloud Building平台AppVeyor

    Link: http://www.tuicool.com/articles/uMBZba http://www.appveyor.com/ 随着云技术的不断完善,基于云的应用越发丰富起来.AppVey ...

  7. docker 使用save和load命令来转移image

    ——假设一个image叫ubuntu—— 在本机执行sudo docker save -o ubuntu.tar ubuntu 由此得到了 ubuntu.tar 文件,将其拷贝到远程机器,执行 sud ...

  8. CF248E Piglet's Birthday(概率dp)

    题面 luogu CodeForces 题解 \(orz\) yyb 转移蜜罐其实是吓唬人的...... 转移的蜜罐都是尝试过的,所有只关心当前架子上的蜜罐数 设\(f[i][j]\)表示第i个货架有 ...

  9. 洛谷 P2482 loj #2885 [SDOI2010]猪国杀 题解【模拟】【贪心】【搜索】

    好玩的模拟题. 以后要经常写模拟题鸭 题目描述 游戏背景 <猪国杀>是一种多猪牌类回合制游戏,一共有\(3\)种角色:主猪,忠猪,反猪.每局游戏主猪有且只有\(1\)只,忠猪和反猪可以有多 ...

  10. P2387 [NOI2014]魔法森林

    传送门 如果一条边只要考虑 $a$ 的限制,那么显然最小生成树 但是现在有 $a,b$ 两个限制,所以考虑按 $a$ 从小到大枚举边,动态维护 $b$ 的最小生成树 考虑新加入的一条边 $x,y$ , ...