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、servletcontextattributelistener接口:
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