本节讲解过滤器、监听器的创建以及监听事件配置示例。
【例1】创建过滤器及配置过滤规则。
(1) 在Eclipse中新建一个Web项目,取名为Chapt_09。在src目录下,新建一个名为com.test.filter的包。选中该包并按Ctrl+N组合键,在弹出的菜单中选择Web→Filter。选择创建过滤器,如图1所示,单击Next按钮。
■ 图1 选择创建过滤器
(2) 为创建的过滤器命名,如图2所示。在弹出的Create Filter对话框的Class name的文本框内输入TestFilter后,单击Next按钮。
■ 图2 为创建的过滤器命名
(3) 为过滤器添加过滤规则,如图3所示。在Filter mapping设置部分,单击Add按钮,在弹出的对话框中选中URL pattern单选框,并在Pattern下的文本框中填写/TestServlet,单击OK按钮,返回到Create Filter选项卡中并单击Finish按钮,即完成了对过滤器的设置。
(4) 根据以上配置,TestFilter.java源文件自动生成的代码如下:
package com. test. 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;
@WebFilter( {" /TestServlet" J)
public class TestFilter implements Filter {
public TestFilter() {
]
public void destroy() {
}
public void doFilter (ServletRequest request,
ServletResponse response, FilterChain chain) throws
chain. doFilter (request, response);
public void init(FilterConfig fConfig) throws ServletExcept{
}
}
以上操作步骤是对一个过滤器的创建和过滤规则的配置,即TestFilter过滤器对访问路径为/TestServlet的访问资源进行过滤。
(5) 在TestFilter类中的各方法中填写代码如下:
public TestFilter() {
System.out.print 1n("过滤器构造器两数运行");
public void destroy() {
System.out.print 1n("过滤器消亡两数运行");
public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain)
throws I0Exception, ServletException {
System,out. printin(“对请求进行过滤处理”);
chain, doFilter (request, response);
System.out. println(”执行 chain. dorilter 方法后面的代码”);
}
public void init( FilterConf ig fConf ig ) throws ServletExcept ion {
System. out. print 1n("过滤器初始化两数运行”);
(6) 在src目录下新建一个名为com.test.servlet的包,在该包下新建一个名为TestServlet的Servlet,匹配URL为/TestServlet,然后编写代码如下:
@WebServlet (" /TestServlet")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public TestServlet () {
System. out.print1n("servlet 构造两数运行”);
)
protected void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletExcept ion, IOException {
Systen. out. Drint In( "servlet 请求处理”);
protected void doPost (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet (request, response);
}
(7) 验证当访问/TestServlet时,过滤器TestFilter是否对其进行过滤。
首先启动Tomcat,运行项目Chapt_09,在浏览器中输入http://localhost:8080/Chapt_09。Tomcat服务器启动后的后台输出显示如图4所示。此时控制台输出了过滤器构造函数与初始函数中的输出语句,说明当Web容器启动时,先初始化过滤器TestFilter。
■ 图4 Tomcat服务器启动后的后台输出显示
其次,再访问TestServlet,在浏览器中输入http://localhost:8080/Chapt_09/TestServlet,此时匹配过滤规则,因此过滤器对该Servlet请求进行了过滤。进行过滤后的Tomcat服务器控制台输出如图5所示。
■ 图5 进行过滤后的Tomcat服务器控制台输出
通过以上结果可以得出以下结论。
(1) 过滤器在服务器启动时也随之初始化。
(2) 当符合过滤规则的URL请求访问时,首先调用Filter的doFilter()函数,对请求进行过滤,过滤完毕后,过滤器执行chain.doFilter(request, response)语句,将请求提交给过滤链中的下一个过滤器。
(3) 当所有过滤器都执行完对请求的过滤后,服务器执行Servlet处理请求的doGet()函数。
(4) 执行完Servlet的代码后,再执行chain.doFilter语句的后续代码。
注意,在上面的例子中,TestFilter类使用了以下注解语句:
@ WebFilter(["/TestServlet"})
该注解表示对访问URL为/TestServlet的请求进行过滤。和Servlet配置一样,也可以在web.xml文件中对Filter进行过滤规则的配置。上面的注解等价于在web.xml中编写下面的配置语句:
< filter >
< filter - name > TestFilter com. test. filter. TestFilter
< filter - mapping >
< filter - name > TestFilter
< url - pattern >/TestServlet
注意,在标签体内部还可以通过和两个标签来设置初始化参数,也可以通过上面创建Filter的第(3)步中的选项卡里的initialization parameters来设置。
事实上,在url-pattern过滤规则中可以非常灵活地指定需要过滤的资源,一般有以下3种。
(1) 过滤一个或多个Servlet或者JSP文件。
① 注解的形式如下:
@WebFilter(! "path/Serwlet1","path/Serwlet2"
"path/xxx. jsp"...})
② 在web.xml中编写语句如下:
< filter - name >过滤器多称
< filter - class >过滤器的类名
< filter - mapping >
< filter - name >过滤器名称< url - pattern >/ path/Servlet1
过滤器名称
< url - pattern >/ path/Servlet2 /filter - mapping >
过滤器名称 / path/xxX. jsp
该方式一般针对特定的Servlet或者JSP文件进行过滤处理。
(2) 过滤一个或者多个目录下的资源。
① 注解的形式如下:
@WebFilter({ "path/ *"})
② 在web.xml中编写语句如下:
< filter - name >过滤器名称
< filter - class >过滤器的类名
< filter - mapping >
< filter - name>过滤器名称/ path/ x
注意,此时使用了通配符*,表示路径下的所有文件。
(3) 过滤所有文件。
① 注解的形式如下:
@WebFilter({"/*})
② 在web.xml中编写语句如下:
< filter >
< filter - name>过滤器名称
< filter - class >过滤器的类名
< filter - name >过滤器名称 / *
注意,url-pattern内部以“/”开头,“/”表示的是应用系统的根目录。
另外,在内部还可以通过标签更加细化地指定过滤的URL的请求方式,该元素的值有以下4种。
(1) request:直接由客户端输入对应URL的访问请求。
(2) forward:通过request转发中的forward方式跳转的访问请求。
(3) include:通过request转发中的include方式跳转的访问请求。
(4) error:通过跳转的访问请求。
请求方式的配置也可以在图9-4中的Select dispatchers部分进行设置,设置后会直接在注解中生成对应的配置语句。如果没有在配置文件中指定标签元素,也没有在注解中指定,就默认只过滤request方式。
【例2】监听器的创建以及监听事件配置。
(1) 在src目录下创建一个名为com.test.listener的包,选中该包并按Ctrl+N组合键,在弹出的对话框中选择Web→Listener。选择创建监听器,如图6所示,然后单击Next按钮。
■ 图6 选择创建监听器
(2) 在弹出的Create Listerner对话框中对监听器进行命名,如图7所示。在Class name文本框内输入TestListener,单击Next按钮。
■ 图7在Create Listerner对话框中对监听器进行命名
(3) 在监听对象事件选项中,选中需要监听的对象事件,如图8所示。此处选择监听HttpSession对象,以及其属性的改变,然后单击Next按钮。
■ 图9 选中要监听的事件
(4) 确定监听器对象要实现的接口,如图10所示。单击Finish按钮即可完成对监听器的创建。
■ 图10 确定监听器要实现的接口
此时,IDE自动生成了TestListener.java需要实现的接口方法名称,代码如下:
import javax. servlet. annotation. WebListener;
import javax. servlet. http. HttpSessionAttributeListener;
import javax. servlet. http. HttpSessionBindingEvent;
import javax. servlet. http. HttpSessionEvent;
import javax. servlet. http. HttpSessionListener;
@WebListener
public class TestListener implements HttpSessionListener,
HttpSessionAttributeListener {
public TestListener ( ) |
public void sessionCreated (HttpSessionEvent se) {
}
}
public void sessionDestroyed(HttpSessionEvent se) {
public void attributeAdded (HttpSessionBindingEvent se){
public void attributeRemoved(HttpSessionBindingEvent se) {
public void attributeReplaced(HttpSessionBindingEvent se) {
}
}
注意,在TestListener类的上面一行出现了@WebListener的注解语句,表明这是一个Web监听器。这条注解等价于在web.xml中编写了如下配置。
< listener >
com.test,listener,Testlistener
如果想实现具体的监听功能,就必须实现接口中定义的相关方法。
送书活动参与方式:
文章三连并评论:“人生苦短,我爱Java”,48小时后程序自动抽奖,送出6本技术图书【如上图】,版本可选(例如选卷1或卷2),欢迎大家积极参与,早点中奖!
再次感谢机械工业出版社对本次活动的大力支持!