1.声明拦截器
通常拦截器声明包含声明可用的拦截器并把它们与应该触发的动作关联起来。唯一复杂的地方是栈的创建,栈允许你一次引用一组拦截器。像所有框架组建的声明一样,拦截器的声明必须在package元素内部。
<interceptors>
<interceptorname="MyInterceptor" class="interceptors.MyInterceptor"></interceptor>
……
<interceptor-stackname="MyInterceptorStack"> //声明拦截器栈
<interceptor-refname="MyInterceptor"/> //引用拦截器
<interceptor-refname="defaultStack"/>
<interceptor-refname="params">
<paramname="excludeParams">dojo\...*</param> //参数
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-refname="MyInterceptorStack"/> //默认引用拦截器
interceptors元素:声明这个包内所有interceptor和interceptor-stack
interceptor元素:声明一个可以在这个包内使用的拦截器,只是将一个拦截器实现类映射到一个逻辑名。声明实际上没有创建一个拦截器或者把这个拦截器与任何动作关联,它们只是把一个名字映射到一个类。
拦截器栈:通过名字引用一系列有序的拦截器的一种方便的方法。interceptor-stack元素的内容是一系列interceptor-ref元素。这些引用必须都指向interceptor元素创建的某个逻辑名。interceptor-ref元素也可以传入参数来配置引用创建的拦截器实例。
一个包可以定义一组默认的拦截器。定义的拦截器组会与这个包内没有显式声明自己的拦截器的所有动作关联。default-interceptor-ref元素只指向一个逻辑名。当我们扩展struts-default包时,允许我们的动作继承默认的拦截器栈。
2.XML文档结构:(struts.xml/struts-default.xml)
声明性架构使用的XML文档中元素的顺序。这个XML文档必须遵守特定的顺序规则。例如每一个package元素只能包含一个interceptors元素,并且这个元素必须出现在XML文档中一个特定的位置。可以从Struts2官方网站找到完整的DTD文件struts-2.0.dtd(在struts2-core-2.x.x.jar文件下也有)。
<!ELEMENT struts(package|include|bean|constant)*>
<!ELEMENT package (result-types?, interceptors?,default-interceptor-ref?,
default-action-ref?, default-class-ref?,global-results?, global-exception-mappings?, action*)>
第一个元素指定了struts元素的内容。struts元素是用于声明性架构的XML文件的根元素,它能够包含4种不同的元素类型的0个或者多个实例。
第二个是package元素,与struts元素不同,package元素的内容必须遵照特定的顺序。所有包含在package元素中的元素,除了action元素之外,都只能出现一次。从这个代码片段中我们可以得到这样的重要信息——interceptors元素必须最多出现一次,并且必须出现在result-types元素之后,并且在default-interceptor-ref元素之前。
<action name=”MyAction” class=”actions.MyAction”>
<interceptor-refname=”timer”/>
<interceptor-refname=”logger”/>
<interceptor-refname=”defaultStack”/>
<result>Success.jsp</result>
</action>
上面的Action命名了拦截器,但是没有提及在struts-default包中声明的defaultStack。因此,这个Action必须在一个扩展了struts-default的包中。
其次,虽然没有定义任何interceptor-ref的Action会继承默认的拦截器,但是只要Action声明了自己的拦截器,就会失去自动的默认值。因此为了使用defaultStack就必须显式的将其指出。
如果一个Action没有声明自己的拦截器,它就会继承所在包的默认拦截器引用。在struts-default.xml中,其默认拦截器引用为:
<default-interceptor-refname=”defaultStack”/>
设置与覆盖拦截器的参数:
很多拦截器可以被参数化。如果一个拦截器接收参数,那么interceptor-ref元素是向它们传入参数的地方。workflow拦截器被参数化以忽略对action的某些方法名的访问,在excludeMethods参数元素中指定:
<interceptor-refname="workflow">
<paramname="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
如果我们想要重用包含这个引用的defaultStack,但是我们想改变excludeMethods参数的值:
<action name="YourAction"class="actions.YourAction">
<interceptor-refname="defaultStack">
<paramname="workflow.excludeMethods">doSomething</param>
</interceptor-ref>
<result>Success.jsp</result>
</action>
可以假设某个action属于继承了defaultStack的某个包,这个Action指定了defaultStack作为它的拦截器引用,但是覆盖了workflow拦截器的excludeMethods参数。这允许使用者方便地重用已经存在的拦截器栈并且仍然能够自定义参数。
excludeMethods 指定排除方法的拦截,includeMethods 把要拦截的方法包含进来,二者都可以排除多个方法,和包含多个方法,方法名用逗号”,”隔开。
<interceptor-ref name="intercept">
<param name="excludeMethods"></param>
<param name="includeMethods">execute</param>
</interceptor-ref>
如上例,如果action执行的是自定义的非execute()方法,则intercept这个拦截器不会对其执行。如果不指定拦截器的参数,则默认会拦截全部方法。
3.Thinking...
Talking引出的问题:post提交与get提交,两者的区别有哪些?各有哪些优劣?分别适用于哪些情况下?
以上-> ->感谢rainy的贡献。