本节讲解过滤器、监听器的创建以及监听事件配置示例。

01、过滤器的创建与配置

【例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) throwschain. 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中编写下面的配置语句:

 TestFilter </filter - name› com. test. filter. TestFilter  TestFilter /TestServlet </filter - mapping ›

注意,在标签体内部还可以通过和两个标签来设置初始化参数,也可以通过上面创建Filter的第(3)步中的选项卡里的initialization parameters来设置。

事实上,在url-pattern过滤规则中可以非常灵活地指定需要过滤的资源,一般有以下3种。

(1) 过滤一个或多个Servlet或者JSP文件。

① 注解的形式如下:

@WebFilter(! "path/Serwlet1","path/Serwlet2""path/xxx. jsp"...})

② 在web.xml中编写语句如下:

过滤器多称过滤器的类名过滤器名称/ path/Servlet1 过滤器名称/ path/Servlet2 /filter - mapping >过滤器名称/ path/xxX. jsp 

该方式一般针对特定的Servlet或者JSP文件进行过滤处理。

(2) 过滤一个或者多个目录下的资源。

① 注解的形式如下:

@WebFilter({ "path/ *"})

② 在web.xml中编写语句如下:

过滤器名称过滤器的类名过滤器名称/ path/ x 

注意,此时使用了通配符*,表示路径下的所有文件。

(3) 过滤所有文件。

① 注解的形式如下:

@WebFilter({"/*})

② 在web.xml中编写语句如下:

过滤器名称过滤器的类名过滤器名称/ * 

注意,url-pattern内部以“/”开头,“/”表示的是应用系统的根目录。

另外,在内部还可以通过标签更加细化地指定过滤的URL的请求方式,该元素的值有以下4种。

(1) request:直接由客户端输入对应URL的访问请求。

(2) forward:通过request转发中的forward方式跳转的访问请求。

(3) include:通过request转发中的include方式跳转的访问请求。

(4) error:通过跳转的访问请求。

请求方式的配置也可以在图9-4中的Select dispatchers部分进行设置,设置后会直接在注解中生成对应的配置语句。如果没有在配置文件中指定标签元素,也没有在注解中指定,就默认只过滤request方式。

02、监听器的创建与配置

【例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;@WebListenerpublic 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中编写了如下配置。

 com.test,listener,Testlistener 

如果想实现具体的监听功能,就必须实现接口中定义的相关方法。

03、文末送书

送书活动参与方式:

文章三连并评论:“人生苦短,我爱Java”,48小时后程序自动抽奖,送出6本技术图书【如上图】,版本可选(例如选卷1或卷2),欢迎大家积极参与,早点中奖!

再次感谢机械工业出版社对本次活动的大力支持!