﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-无标题</title><link>http://www.blogjava.net/rebeidian/</link><description>敲敲敲</description><language>zh-cn</language><lastBuildDate>Wed, 06 May 2026 23:15:56 GMT</lastBuildDate><pubDate>Wed, 06 May 2026 23:15:56 GMT</pubDate><ttl>60</ttl><item><title>拦截器,拦截器栈总结 .</title><link>http://www.blogjava.net/rebeidian/archive/2012/08/08/385081.html</link><dc:creator>迪罢咯</dc:creator><author>迪罢咯</author><pubDate>Wed, 08 Aug 2012 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/rebeidian/archive/2012/08/08/385081.html</guid><wfw:comment>http://www.blogjava.net/rebeidian/comments/385081.html</wfw:comment><comments>http://www.blogjava.net/rebeidian/archive/2012/08/08/385081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rebeidian/comments/commentRss/385081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rebeidian/services/trackbacks/385081.html</trackback:ping><description><![CDATA[<p>拦截器（Interceptor）：拦截器是Struts2的核心，Struts2的众多功能都是通过拦截器来实现的。<br /></p>
<p>拦截器跟filter的概念是非常类似的,<span style="color: #ff0000">拦截器只能拦截Action的,</span>而filter是可以过滤所有的东西的.An interceptor is a stateless class that follows the interceptor pattern, as found in<a title="class or interface in javax.servlet" href="http://java.sun.com/javaee/5/docs/api/javax/servlet/Filter.html?is-external=true"><code><font color="#336699">Filter</font></code></a> and in AOP languages.</p>
<p><br /></p>
<p>Interceptors must be stateless(无状态的) and not assume that a new instance will be created for each request or Action是单实例的,</p>
<p>拦截器的编写有两步,一个是编写代码,第二个是编写配置文件.<br /></p>
<p><strong>自定义的拦截器要实现Interceptor接口</strong>ActionInvocation的invoke方法就类似于filter的dofilter<br /></p>
<p>配置文件中用&lt;interceptors&gt;中进行配置.注意拦截器的init方法也是在服务器一启动的时候就调用的,跟filter一样的.整个struts都是靠这些拦截器所串联起来的.<span style="color: #ff0000">我们并没有在action里面配置也没问题啊,因为他有个默认的拦截器栈嘛.是通过&nbsp;&lt;default-interceptor-ref name="defaultStack"/&gt;来指定的.</span><br /></p>
<p><span style="color: #ff0000">注意:</span>一旦定义了自己的拦截器，将其配置到action上后，我们需要在action的最后加上默认的拦截器栈：defaultStack。因为自己的会覆盖默认的.<br /></p>
<p>拦截器也可以跟filter一样配置param,然后在程序里面可以把它读出来.在程序中它用setter方法set进去的.<br /></p>
<p>如:</p>
<blockquote style="border-bottom: medium none; border-left: medium none; padding-bottom: 0px; margin: 0px 0px 0px 40px; padding-left: 0px; padding-right: 0px; border-top: medium none; border-right: medium none; padding-top: 0px">
<p>&lt;interceptor name="theInterceptor1" class="cn.wenping.interceptor.TheInterceptor1"&gt;</p></blockquote>
<p><span style="white-space: pre"></span>&lt;param name="test"&gt;wenp&lt;/param&gt;<br /><span style="white-space: pre"></span>&nbsp; &nbsp; &nbsp;&nbsp;&lt;/interceptor&gt;<br /></p>
<p>拦截器定义如下:</p>
<p>public class TheInterceptor1 implements Interceptor {<br /><span style="white-space: pre"></span><br /><span style="white-space: pre"></span>private String test;<br /><br /><br /><span style="white-space: pre"></span>public String getTest() {<br /><span style="white-space: pre"></span>return test;<br /><span style="white-space: pre"></span>}<br /><br /><br /><span style="white-space: pre"></span>public void setTest(String test) {<br /><span style="white-space: pre"></span>this.test = test;<br /><span style="white-space: pre"></span>}<br /></p>
<p>.............</p>
<p>..............</p>
<p>}</p>
<p>定义拦截器时可以<span style="color: #ff0000">直接继承AbstractInterceptor抽象类</span>（该类实现了Interceptor接口，并且对init和destroy方法进行了空实现），然后实现其抽象方法intercept即可,实际上就是一个适配器<br /></p>
<p>注意:以上说的过滤Action实际上是过滤他的execute方法,如果要对指定的方法进行拦截用:<span style="color: #ff0000">MethodFilterInterceptor</span>,此即方法过滤拦截器（可以对指定方法进行拦截的拦截器）。</p>
<p>采用的是下面两种param进行配置</p>
<p>&nbsp;</p>
<ul><li>excludeMethods - method names to be excluded from interceptor processing </li><li>includeMethods - method names to be included in interceptor processing &nbsp;</li></ul>
<div>配置如下:如果用如下配置,那么myExecute方法在Action中要进行method方法的配置<br /></div>
<p>&nbsp;</p>
<p>&lt;interceptor-ref name="theInterceptor3"&gt;<br /><span style="white-space: pre"></span>&lt;param name="includeMethods"&gt;myExecute&lt;/param&gt;<br />&lt;/interceptor-ref&gt;<br /></p>
<p>注意:在方法过滤拦截器中，如果既没有指定includeMethods参数，也没有指定execludeMethods参数，那么所有的方法都会被拦截，也就是说所有的方法都被认为是includeMethods的；如果仅仅指定了includeMethods，那么只会拦截includeMethods中的方法，没有包含在includeMethods中的方法就不会被拦截。</p>
<p><br /></p>
<p>关于拦截器中的监听器:</p>
<p>ActionInvocation中的方法:addPreResultListener<br /></p>
<p><span style="color: #ff0000">PreResultListeners </span>may be registered with an<a title="interface in com.opensymphony.xwork2" href=""><code><font color="#336699">ActionInvocation</font></code></a> to get a callback after the<a title="interface in com.opensymphony.xwork2" href=""><code><font color="#336699">Action</font></code></a> has been executed but before the<a title="interface in com.opensymphony.xwork2" href=""><code><font color="#336699">Result</font></code></a> is executed.<br /></p>
<p>他起的作用就是:如果你想在Action的方法执行完毕之后在结果返回之前想要做点东西的话就可以用它们.</p><img src ="http://www.blogjava.net/rebeidian/aggbug/385081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rebeidian/" target="_blank">迪罢咯</a> 2012-08-08 16:54 <a href="http://www.blogjava.net/rebeidian/archive/2012/08/08/385081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>