昨天和大家介绍了一下JSON的用法,其实JSON中主要是用来和数据库交互数据的。今天给大家讲解的是Filter和Listener的用法。

一、Listenner监听器

1.1、定义

Javaweb中的监听器是用于监听web常见对象HttpServletRequest,HttpSession,ServletContext。

1.2、监听器的作用

监听web对象创建与销毁.

监听web对象的属性变化

监听session绑定javaBean操作.

1.3、监听机制中的概念

事件----一件事情

事件源---产生这件事情的源头

注册监听---将监听器与事件绑定,当事件产生时,监听器可以知道,并进行处理。

监听器---对某件事情进行处理监听的一个对象

二、JavaWeb中常见的监听器

2.1、创建一个监听器的步骤

创建一个类,实现需要监听器的接口

重写接口中的方法

在web.xml中配置注册该监听器

2.2、监听域对象的创建与销毁

监听ServletContext创建与销毁 ServletContextListener

监听HttpSession创建与销毁 HttpSessionListener

监听HttpServletRequest创建与销毁 ServletRequestListener

下面为大家展示的实例,首先我们的实例在jsp中进行的话,我们要明确这三个域对象什么时候被jsp创建什么时候又被销毁呢。

在ServletContext中是服务器开启的时候就被创建,当服务器关闭的时候就被销毁

在session中,jsp里的page指令中可以配置默认是ture的,所以当你加载这个jsp页面的时候session就被创建了,而销毁的话就有

四种方法:默认超时30分钟、关闭服务器、invalidate()方法、setMaxInactiveInterval(int interval) 可以设置超时时间,在servlet中

需要通过request.getSseeion()来创建session。

在request中,发送请求服务器就会创建它,当响应产生时,request对象就会销毁。在jsp页面的话,你加载开始创建,加载完就销毁了。

2.2.1、实例:监听域对象的创建与销毁

这里只演示一个,其他的两个同理都是这样子操作的。

HttpServletListener监听器

a.创建类,实现HttpServletListener接口,并重写方法

packagetest;importjavax.servlet.http.HttpSessionEvent;importjavax.servlet.http.HttpSessionListener;public class MyHttpSessionListener implementsHttpSessionListener {

@Overridepublic voidsessionCreated(HttpSessionEvent arg0) {

System.out.println("session被创建了");

}

@Overridepublic voidsessionDestroyed(HttpSessionEvent arg0) {

System.out.println("session被销毁了");

}

}

View Code

b.在web.xml中的配置

c.在newFile.jsp中测试

注:在jsp中我添加了invalidate方法来测试销毁

d.结果

2.3、监听域对象的属性变化

监听ServletContext属性变化 ServletContextAttributeListener

监听HttpSession属性变化 HttpSessionAttributeListener

监听HttpServletRequest属性变化 ServletRequestAttributeListener

2.3.1、实例:监听域对象的实例变化

a.创建一个MyServletRequest类继承ServletRequestAttributeListener接口,并实现改接口方法

packagetest;importjavax.servlet.ServletRequestAttributeEvent;importjavax.servlet.ServletRequestAttributeListener;public class MyServletRequest implementsServletRequestAttributeListener{

@Overridepublic voidattributeAdded(ServletRequestAttributeEvent arg0) {

System.out.println("requestAttribute添加了属性");

}

@Overridepublic voidattributeRemoved(ServletRequestAttributeEvent arg0) {//TODO Auto-generated method stub

System.out.println("requestAttribute被移除了");

}

@Overridepublic voidattributeReplaced(ServletRequestAttributeEvent arg0) {//TODO Auto-generated method stub

System.out.println("requestAttribute被替换了");

System.out.println(arg0.getName()+arg0.getValue());

}

}

View Code

b.在web.xml中注册该监听器

test.MyServletRequest

c.在jsp测试一下

结果:

当我们在添加一个removeAttribute()方法时

2.4、监听session绑定javabean

2.4.1、HttpSessionBindingListener(这个是用javabean去实现的,所以不需要去注册)

用于监听javaBean对象是否绑定到了session域

创建一个User去实现HttpSessionBindingListener接口

packagetest;importjavax.servlet.http.HttpSessionBindingEvent;importjavax.servlet.http.HttpSessionBindingListener;public class User implementsHttpSessionBindingListener {privateString name;private intage;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

@Overridepublic voidvalueBound(HttpSessionBindingEvent arg0) {

System.out.println("User对象被session绑定了!");

}

@Overridepublic voidvalueUnbound(HttpSessionBindingEvent arg0) {

System.out.println("User对象解除session绑定了!");

}

}

View Code

在jsp页面中测试

结果:

注意:不需要再web.xml中去配置该监听器,在执行setAttrubute()方法的时候自动去识别该监听器

2.4.2.HttpSessionActivationListener

用于监听javaBean对象的活化与钝化。

HttpSessionActivationListener如果javaBean实现了这个接口,那么当我们正常关闭服务器时,session中的javaBean对象就会被钝化到我们指定的文件中。

当下一次在启动服务器,因为我们已经将对象写入到文件中,这时就会自动将javaBean对象活化到session中。

首先我们要明白什么是活化与钝化等下单独写一篇文章介绍活化与钝化

我们还需要个context.xml文件来配置钝化时存储的文件

三、Filter

接下来为大家讲解的是Filter,这个相对于Listener来说就重要的多了,它的应用非常的广泛,主要是起到一个过滤、拦截的作用。

3.1、Filter的定义

Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。执行过滤任务的对象,这些任务是针对对某一资源(servlet 或静态内容)的请求或来自某一资源的响应执行的,抑或同时针对这两者执行。

3.2、怎么创建一个过滤器

创建一个类实现Filter接口

重写接口中方法 doFilter方法是真正过滤的

在web.xml文件中配置

注意:在Filter的doFilter方法内如果没有执行chain.doFilter(request,response)那么资源是不会被访问到的。

3.3、实例

首先我创建了一个MyFilter.java实现Filter接口

packagecom.jxlg.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;public class MyFilter implementsFilter{

@Overridepublic voiddestroy() {

}

@Overridepublic voiddoFilter(ServletRequest req, ServletResponse res,

FilterChain chain)throwsIOException, ServletException {

System.out.println("doFilter执行了");

chain.doFilter(req, res);//放行

System.out.println("执行完返回到客户端");

}

@Overridepublic void init(FilterConfig arg0) throwsServletException {

}

}

View Code

在web.xml中配置过滤器

MyFilter

com.jxlg.filter.MyFilter

MyFilter

/demo1

View Code

写一个servlet让MyFilter进行过滤

结果

3.4、FilterChain

FilterChain 是 servlet 容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。

问题:怎样可以形成一个Filter链?

只要多个Filter对同一个资源进行拦截就可以形成Filter链

问题:怎样确定Filter的执行顺序?

由来确定,在web.xml文件中哪一个过滤器的放到了前面谁就先执行。

3.5、Filter的生命周期

Servlet生命周期:

实例化 --》 初始化--》 服务--》 销毁

当服务器启动,会创建Filter对象,并调用init方法,只调用一次.

当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.

当服务器关闭时,会调用Filter的destroy方法来进行销毁操作.

3.6、FilterConfig

在Filter的init方法上有一个参数,类型就是FilterConfig.

FilterConfig它是Filter的配置对象,它可以完成下列功能

1.获取Filtr名称

2.获取Filter初始化参数

3.获取ServletContext对象。

怎么获取到一个filterConfig对象

fiterConfig中的方法

实例:获取web.xml文件中的字符编码,用来过滤,告知服务器请求用的是什么编码。

packagecom.jxlg.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;public class MyFilterConfig implementsFilter {privateFilterConfig filterConfig;

@Overridepublic voiddestroy() {

}

@Overridepublic voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throwsIOException, ServletException {//通过filterConfig来获取配置信息中的初始化参数

String encoding = filterConfig.getInitParameter("encoding");

request.setCharacterEncoding(encoding);

chain.doFilter(request, response);//放行

}

@Overridepublic void init(FilterConfig filterConfig) throwsServletException {this.filterConfig =filterConfig;

}

}

View Code

web.xml中的配置信息

MyFilterConfig

com.jxlg.filter.MyFilterConfig

encoding

UTF-8

MyFilterConfig

/*

View Code

3.7、Filter配置

基本配置

filter名称

Filter类的包名.类名

filter名称

路径

关于其它配置

1.

完全匹配 以”/demo1”开始,不包含通配符*

目录匹配 以”/”开始 以*结束

扩展名匹配 *.xxx 不能写成/*.xxx

2.

它是对指定的servlet名称的servlet进行拦截的。

3.

可以取的值有 REQUEST FORWARD ERROR INCLUDE

它的作用是:当以什么方式去访问web资源时,进行拦截操作.

1.REQUEST 当是从浏览器直接访问资源,或是重定向到某个资源时进行拦截方式配置的 它也是默认值

2.FORWARD 它描述的是请求转发的拦截方式配置

3.ERROR 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

4.INCLUDE 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

四、使用Fliter实现自动登录

这个例子就是一个简单的登录验证与数据库交互,我们使用Fliter来实现自动登录。

思路分析:

login.jsp

${msg}

用户名:密码:

自动登陆

View Code

FindUserServlet.java

这里获取了表单提交的数据,然后如果按了自动登录,我们就会把用户名和密码保存到cooki中去

packagecom.jxlg.web.servlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.jxlg.web.domain.User;importcom.jxlg.web.service.UserService;public class FindUserServlet extendsHttpServlet {public voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {//获取表单数据

String username = request.getParameter("username");

String password= request.getParameter("password");//处理业务逻辑

UserService us = newUserService();

User user=us.findUser(username,password);if(user!=null){

String autoLogin= request.getParameter("autoLogin");

Cookie cookie= new Cookie("user",user.getUsername()+"&"+user.getPassword());

cookie.setPath("/");if(autoLogin!=null){//将用户名和密码保存到cookie中

cookie.setMaxAge(60*60*24*7);

}else{//清除cookie

cookie.setMaxAge(0);

}

response.addCookie(cookie);//把cookie保存到客户端

request.getSession().setAttribute("u", user);

request.getRequestDispatcher("/home.jsp").forward(request, response);

}else{

request.setAttribute("msg", "用户名或密码输入错误,请重新登陆");

request.getRequestDispatcher("/login.jsp").forward(request, response);

}

}public voiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

doGet(request, response);

}

}

View Code

UserService

这里是service业务层代码

ackage com.jxlg.web.service;importjava.sql.SQLException;importcom.jxlg.Dao.UserDao;importcom.jxlg.web.domain.User;public classUserService {

UserDao ud= newUserDao();publicUser findUser(String username, String password) {try{returnud.findUser(username,password);

}catch(SQLException e) {

e.printStackTrace();

}return null;

}

}

View Code

UserDao

这里是DAO实现类,与数据库交互,我这里是用的是C3P0连接池,和dbUtils与数据库交互

packagecom.jxlg.Dao;importjava.sql.SQLException;importorg.apache.commons.dbutils.QueryRunner;importorg.apache.commons.dbutils.handlers.BeanHandler;importcom.jxlg.util.C3P0Util;importcom.jxlg.web.domain.User;public classUserDao {public User findUser(String username, String password) throwsSQLException {

QueryRunner qr= newQueryRunner(C3P0Util.getDateSource());return qr.query("select * from user where username=? and password=?", new BeanHandler(User.class),username,password);

}

}

View Code

home.jsp

登录成功跳转的界面

View Code

MyFilter

这是一个过滤器,记住一定要去web.xml配置,如果我们在longin.jsp中选择了自动登录的话,我们可以直接访问home.jsp实现自动登录。

packagecom.jxlg.web.domain;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.jxlg.web.service.UserService;public class MyFilter implementsFilter{

@Overridepublic voiddestroy() {

}

@Overridepublic voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain Chain)throwsIOException, ServletException {//转化两个对象

HttpServletRequest req =(HttpServletRequest)request;

HttpServletResponse res=(HttpServletResponse) response;

String uri=req.getRequestURI();//System.out.println(uri);///StudentLogin/login.jsp

String path =req.getContextPath();

path=uri.substring(path.length());//System.out.println(path);///login.jsp

if("/login.jsp".equals(path)||"/servlet/findUserServlet".equals(path)){

User user= (User) req.getSession().getAttribute("u");//如果用户没有登录过,我们就执行登录操作。

if(user==null){//得到cookies数组

Cookie[] cookies =req.getCookies();

String username="";

String password="";//从cookie中找到想要的user对象

for(int i=0;cookies!=null&&i

String value= cookies[i].getValue(); //tom&123

String[] values = value.split("&");

username= values[0];

password= values[1];

}

}//执行登录操作

UserService us = newUserService();

User u=us.findUser(username, password);//如果登录成功,把user保存到session中

if(user!=null){

req.getSession().setAttribute("u", u);

}

}

}//放行

Chain.doFilter(request, response);

}

View Code

开发中遇到的问题

1.在写MyFilter中,在遍历保存在客户端的cookie的时候,我没有家伙写cookies!=null,这样会导致空指针异常

2.在使用HttpServletRequest时,记住在Filter中一定要记住,进行转化,因为在Filter中是ServletRequest对象。

3.因为我在Filter中web.xml文件中配置的url-pattern是当前应用的所有url,所以当我们请求的每一个资源都会调用Filter进行过滤,但是我们并不需要在login.jsp等也自动登录,所以就记得要排除掉这些。

提供源码,收好不谢:

链接:http://pan.baidu.com/s/1c1K6UJ2 密码:mewe

五、全局编码的过滤器

前言:

使用过滤器对post请求的乱码进行过滤,测试之后是没有问题的,但是当我们是get请求的时候,我们该怎么去处理呢?

怎样可以做成一个通用的,可以处理post,get所有的请求的?

在java中怎样可以对一个方法进行功能增强?

1.继承

2.装饰设计模式

1.创建一个类让它与被装饰类实现同一个接口或继承同一个父类

2.在装饰类中持有一个被装饰类的引用

3.重写要增强的方法

分析:我们获取请求参数无非就三种方式:getParameter、getParameterValues、getParameterMap.

我们知道getParameter与getParameterValue方法可以依赖于getParamterMap方法来实现。

login.jsp

username:
username:

View Code

LoginServlet

public voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

String name1= request.getParameter("username1");

String name= request.getParameterValues("username")[0];

System.out.println(name);

System.out.println(name1);

}

View Code

MyFilter

packagecom.itheima.filter;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.util.Map;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletRequestWrapper;public class MyFilter implementsFilter {public void init(FilterConfig filterConfig) throwsServletException {

}public voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throwsIOException, ServletException {

HttpServletRequest req=(HttpServletRequest) request;//解决post方式//req.setCharacterEncoding("UTF-8");

req = newMyRequest(req);

chain.doFilter(req, response);

}public voiddestroy() {

}

}//实现与被包装对象相同的接口//定义一个与被包装类相对象的引用//定义一个构造方法,把被包装对象传过来//对于不需要改写方法,直接调用//对于无需要改写方法,写自己的方法体

class MyRequest extendsHttpServletRequestWrapper {

HttpServletRequest request;//是用于接收外部传递的原始的request

publicMyRequest(HttpServletRequest request) {super(request);//是因为父类没有无参数构造

this.request =request;

}/** @Override public String getParameter(String name) { name =

* request.getParameter(name);//乱码 try { return new

* String(name.getBytes("iso-8859-1"),"UTF-8"); } catch

* (UnsupportedEncodingException e) { e.printStackTrace(); } return null; }*/@OverridepublicString getParameter(String name) {

Map map =getParameterMap();return map.get(name)[0];

}

@OverridepublicString[] getParameterValues(String name) {

Map map =getParameterMap();returnmap.get(name);

}private boolean flag = true;

@Overridepublic MapgetParameterMap() {

Map map = request.getParameterMap();//乱码

if(flag) {for (Map.Entrym : map.entrySet()) {

String[] values=m.getValue();for (int i = 0; i < values.length; i++) {try{

values[i]= newString(

values[i].getBytes("iso-8859-1"), "UTF-8");

}catch(UnsupportedEncodingException e) {

e.printStackTrace();

}

}

}

flag= false;

}returnmap;

}

}

View Code

java listen_JavaWeb之Filter、Listener相关推荐

  1. servlet/filter/listener/interceptor区别与联系

    2019独角兽企业重金招聘Python工程师标准>>> servlet/filter/listener/interceptor区别与联系 博客分类: java 由于最近两个月工作比较 ...

  2. JavaWeb笔记:第07章 MVC |EL |JST |Filter |Listener |JQuery |AJAX |Maven |JSON |Redis |Linux |Nginx

    JavaWeb笔记:第07章 MVC |EL |JST |Filter |Listener |JQuery |AJAX |Maven |JSON |Redis |Linux |Nginx 1. MVC ...

  3. servlet,filter,listener区别

    时间的朋友 随笔 - 2314, 文章 - 3, 评论 - 101, 引用 - 0 servlet/filter/listener/interceptor区别与联系 一.概念: 1.servlet:s ...

  4. JavaWeb-Servlet+Filter+Listener+Session

    JavaWeb 一.Servlet Servlet 是 JavaEE 规范之一.规范就是接口. Servlet 是 JavaWeb三大组件之一.三大组件分别是:Servlet程序.Filter过滤器. ...

  5. SpringBoot的Web开发入门案例5—注册Servlets, Filter, Listener

    SpringBoot的Web开发入门案例5-注册Servlets, Filter, Listener 注册Servlet 创建MyServlet类 package com.blu.conf;impor ...

  6. Java Web idea Filter配置(过滤器配置)

    一.过滤器的概述 1.1过滤器的概念及作用 概念 过滤器是一个能够拦截客户端与服务端请求和响应的web组件(Servlet.Filter.Listener). 2.画图分析 拦截请求:在请求到达客户端 ...

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

    JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference 转载于:https://www.cnblogs.com/Jeremy2001 ...

  8. 【Scala】Scala Java Error: value filter is not a member of *

    1.概述 有时在Scala中调用Java的库,Java库会返回某些Java的集合或类型,必须经过一些转换才能正常使用. 否则有可能在编译的过程遇到这个错误. 错误字符串 下面是错误的主要信息. Sca ...

  9. JAVA中解决Filter过滤掉css,js,图片文件等问题

    JAVA中解决Filter过滤掉css,js,图片文件等问题 参考文章: (1)JAVA中解决Filter过滤掉css,js,图片文件等问题 (2)https://www.cnblogs.com/er ...

最新文章

  1. Linux文件读写机制及优化方式
  2. spring-boot入门之二——验证、AOP日志、异常处理
  3. 随机采样方法整理与讲解(MCMC、Gibbs Sampling等)
  4. Exp3 免杀原理与实践 20154320 李超
  5. 数据结构和算法之单链表
  6. python 结构数组_Python数组
  7. SQL高级查询——50句查询(含答案) ---参考别人的,感觉很好就记录下来留着自己看。...
  8. DataTable 更改在有数据列的类型方法
  9. Error attempting to get column ‘hiredate‘ from result set. Cause: java.sql.SQLFeatureNotSupportedEx
  10. 中国.NET:各地微软技术俱乐部汇总(更新中...)
  11. decode,encode的用法
  12. qt代码着呢么换行_离我睡觉还早着呢...
  13. 【noi.ac #596】road
  14. 优粮生活炒菜机器人_【O2O案例】优粮生活:一个餐饮人该有的产品精神
  15. jmeter---Throughput(吞吐量)系列
  16. Db2 SQL PL中的控制语句
  17. Excel 拆分 分割 数据 (对数据进行分列)
  18. 阿里开源自研工业级稀疏模型高性能训练框架 PAI-HybridBackend
  19. 移动端REM响应式模板及相应规范
  20. (附3D大屏模板)详解FineVis如何打造智慧医院BIM方案!

热门文章

  1. C语言(CED)与long long相关的知识
  2. Android Studio------------重要提醒
  3. php访问网页post获取源码,第一次抓别人网站数据,用postman直接请求可以获取到返回数据,通过代码的方式就一直报错,php...
  4. linux下drcom无法上网,drcom为什么还是不能上网啊!
  5. DVWA Cross Site Request Forgery (CSRF) -------WP
  6. js上拉加载ajax数据,原生ajax写的上拉加载实例
  7. tms320c2000 c语言伪指令,TMS320F240XDSP汇编及C语言多功能控制应用(附光盘)
  8. linux访问网站出现443,Linux访问网站一直出现超时
  9. python 成员函数 泛型函数_【一点资讯】白学这么多年 Python?连泛型函数都不会写? www.yidianzixun.com...
  10. 合作开发过程产生的专利_被起诉专利侵权怎么办?专利律师给你出招!