好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

详细了解java监听器和过滤器

1、介绍:

1)一组来自于servlet规范下的接口,共有 8个接口 。在tomcat中存在于 servlet-api.jar 包

2)监听器接口需要由 开发人员亲自实现 ,http服务器提供的jar中并没有对应的实现类

3)监听器接口用于监控 【作用域对象生命周期的变化时刻】 以及 【作用域对象共享数据的变化时刻】

2、作用域对象:

1)在servlet规范中,认为在服务端内存中可以在某些条件下为两个servlet之间提供数据共享方案的对象,被称为【作用域对象】

2)在servlet规范下的作用域对象:

servletcontext :全局作用域对象

httpsession :会话作用域对象

httpservletrequest :请求作用域对象

3、监听器接口实现类开发规范:三步

1)根据监听的实际情况,选择对应的监听器接口进行实现

2)重写监听器接口中声明的【监听事件处理方法】

3)在web.xml文件中将监听器接口实现类注册到http服务器中

4、 servletcontextlistener

1)作用:通过这个接口合法的检测全局作用域对象的两个时刻

被初始化时刻 被销毁时刻

2)监听事件处理方法

public void contextinitialized(): 在全局作用域对象被http服务器初始化是调用

public void contextdestroyed(): 在全局作用域对象被http服务器销毁时调用

5、s ervletcontextattributelistener 接口:

1)作用:通过这个接口合法的检测全局作用域对象共享数据变化的时刻

2)监听事件处理方法:

public void contextadded(): 在全局作用域对象添加共享数据时调用

public void contextreplaced(): 在全局作用域对象更新共享数据时调用

public void contextremoved(): 在全局作用域对象删除共享数据时调用

6、全局作用域对象共享数据变化时刻

servletcontext application=request.getservletcontext();

application.setattribute("key1",100); //新增共享数据

application.setattribute("key1",200); //更新共享数据

application.removeattribute("key1"); //删除共享数据

代码实现

以下就以servletcontextlistener接口和servletcontextattributelistener接口

第一步:选择servletcontextlistener接口进行实现

第二步:重写监听器接口声明的【监听事件处理方法】

?

1

2

3

4

5

6

7

8

9

10

public class onelistener implements servletcontextlistener {

     @override

     public void contextinitialized(servletcontextevent sce) {

         system.out.println( "initialized............" );

     }

     @override

     public void contextdestroyed(servletcontextevent sce) {

         system.out.println( "destroyed............." );

     }

}

第三步:在web.xml中将监听器接口实现类注册到http服务器中

?

1

2

3

<listener>

     <listener- class >school.xauat.listener.onelistener</listener- class >

</listener>

由于servletcontext【全局作用对象的生命周期】贯穿网站的整个运行期间

servlet之间数据共享中有具体的servletcontext生命周期

因此在tomcat服务器启动过程时,执行contextinitialize()方法

initialized............

在tomcat服务器准备关闭时,执行contextdestroyed()方法

destroyed.............

第一步:选择servletcontextattributelistener接口进行实现

第二步:重写监听器接口声明的【监听事件处理方法】

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public class onelistener implements servletcontextattributelistener {

     @override

     public void attributeadded(servletcontextattributeevent scae) {

         system.out.println( "servletcontextattribute is added......" );

     }

     @override

     public void attributeremoved(servletcontextattributeevent scae){

         system.out.println( "servletcontextattribute is removed......" );

     }

     @override

     public void attributereplaced(servletcontextattributeevent scae){

         system.out.println( "servletcontextattribute is replaced......" );

     }

}

第三步:在web.xml文件中将监听器接口实现类注册到tomcat服务器中

?

1

2

3

4

5

6

7

8

9

10

11

<servlet>

     <servlet-name>oneservlet</servlet-name>

     <servlet- class >school.xauat.controller.oneservlet</servlet- class >

</servlet>

<servlet-mapping>

     <servlet-name>oneservlet</servlet-name>

     <url-pattern>/one</url-pattern>

</servlet-mapping>

<listener>

     <listener- class >school.xauat.listener.onelistener</listener- class >

</listener>

监听事件

?

1

2

3

4

5

6

7

8

9

10

11

12

public class oneservlet extends httpservlet {

     protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception {

         //通过请求对象获取全局作用域对象

         servletcontext application=request.getservletcontext();

         //向全局作用域对象中添加共享数据

         application.setattribute( "key" , 100 );

         //更改全局作用域对象中的共享数据

         application.setattribute( "key" , 500 );

         //删除全局作用域对象中的共享数据

         application.removeattribute( "key" );

     }

}

运行结果

servt规范扩展-----------过滤器接口

1、介绍:

1)来自于servlet规范下的接口,在tomcat中存在于 servlet-api.jar 包中

2)filter接口实现类 由开发人员负责提供的 ,http服务器不负责提供

3) filter接口会在http服务器调用资源文件之前,对http服务器进行拦截

2、具体作用:

1)拦截http服务器,帮助http服务器去 检测当前请求的合法性

2)拦截http服务器,对当前请求进行增强操作

3、filter接口实现类的开发步骤:三步

1)创建一个java类实现filter接口

2)重写filter接口中的dofilter方法

3)在web.xml文件中将过滤器接口实现类注册到http服务器

过滤器检测请求合法性

第一步:创建一个java类实现filter接口

第二步:重写dofilter接口中的dofilter()方法

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

/**

  * http://localhost:8080/myweb/mm.jpg?age=89

  */

public class onefilter implements filter {

     @override

     public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {

         //通过拦截的请求对象来得到请求包中的参数信息,从而得到来访用户的真实年龄

         string age=servletrequest.getparameter( "age" );

         //根据这个年龄帮助我们的http服务器判断本次请求的合法性

         if (integer.valueof(age)< 70 ){

             //将拦截请求对象和相应对象交换给tomcat,由tomcat继续调用资源文件

             filterchain.dofilter(servletrequest,servletresponse);

         } else {

             //过滤器代替http服务器拒绝本次请求

             servletresponse.setcontenttype( "text/html;charset=utf-8" );

             printwriter out=servletresponse.getwriter();

             out.print( "<center><font style='color:red;font-size:40px'>不合适!!!!</font></center>" );

         }

     }

}

第三步:在web.xml文件中将过滤器接口实现类注册到http服务器

?

1

2

3

4

5

6

7

8

9

10

<!--将过滤器类文件交给tomcat-->

<filter>

     <filter-name>onefilter</filter-name>

     <filter- class >school.xauat.filter.onefilter</filter- class >

</filter>

<!--通知tomcat在调用何种资源文件是需要被当前过滤器拦截-->

<filter-mapping>

     <filter-name>onefilter</filter-name>

     <url-pattern>/mm.jpg</url-pattern>

</filter-mapping>

过滤器对请求对象进行增强服务

当有多个以post的请求访问服务器时,需要对每个servlet接口实现类中dopost()方法进行以下操作,增加的开发的难度。

response. setcharacterencoding("utf-8")

以下展示过滤器的作用:

第一步:创建java实现filter接口

第二步:重写filter接口下的dofilter()方法

?

1

2

3

4

5

6

7

public class onefilter implements filter {

     @override

     public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {

         servletrequest.setcharacterencoding( "utf-8" );

         filterchain.dofilter(servletrequest,servletresponse);

     }

}

第三步:在web.xml文件中将过滤器接口实现类注册到http服务器

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<servlet>

         <servlet-name>oneservlet</servlet-name>

         <servlet- class >school.xauat.controller.oneservlet</servlet- class >

     </servlet>

     <servlet-mapping>

         <servlet-name>oneservlet</servlet-name>

         <url-pattern>/one</url-pattern>

     </servlet-mapping>

     <servlet>

         <servlet-name>twoservlet</servlet-name>

         <servlet- class >school.xauat.controller.twoservlet</servlet- class >

     </servlet>

     <servlet-mapping>

         <servlet-name>twoservlet</servlet-name>

         <url-pattern>/two</url-pattern>

     </servlet-mapping>

     <!--注册filter类-->

     <filter>

         <filter-name>onefilter</filter-name>

         <filter- class >school.xauat.filter.onefilter</filter- class >

     </filter>

     <filter-mapping>

         <filter-name>onefilter</filter-name>

         <!--通知tomcat在调用所有资源文件之前都需要调用onefilter进行拦截-->

         <url-pattern>/*</url-pattern>

     </filter-mapping>

oneservlet

?

1

2

3

4

5

6

7

public class oneservlet extends httpservlet {

     protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception {

         //通过请求对象获取请求体中的请求参数

         string username=request.getparameter( "username" );

         system.out.println( "oneservlet----->" +username);

     }

}

twoservlet

?

1

2

3

4

5

6

7

public class twoservlet extends httpservlet {

     protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception {

         //通过请求对象获取请求体中的请求参数

         string username=request.getparameter( "username" );

         system.out.println( "twoservlet---->" +username);

     }

}

4、filter拦截地址的格式

1) 命令格式:

<filter-mapping>

<filter-name><onefilter/filter-name>

<url-pattern>拦截地址</url-pattern>

</filter-mapping>

2) 命令作用:

拦截地址通知tomcat在调用和何种资源文件之前需要调用onefilter过滤进行拦截

3) 要求tomcat在调用某一个具体文件之前,来调用onefilter进行拦截

<url-pattern>/目录/文件名</url-pattern>

4) 要求tomcat在调用某一个文件夹下所有的资源文件之前,来调用onefilter进行拦截

<url-pattern>/目录/*</url-pattern>

5) 要求tomcat在调用任意文件夹下的某种类型文件之前,来调用onefilter拦截

<url-pattern>*.jpg</url-pattern>

6) 要求tomcat在调用网站中任意文件时,来调用onefilter拦截

<url-pattern>/*</url-pattern>

总结

本篇文章就到这里了,希望能给你带来帮助,也希望你能够多多关注的更多内容!

原文链接:https://blog.csdn.net/qq_45796208/article/details/108791641

查看更多关于详细了解java监听器和过滤器的详细内容...

  阅读:18次