如果要在Action中啟用依賴注入功能(或其他任何由攔截器提供的功能),就必須要對Action進行配置。和其他元素一樣,許多攔截器都已經提供了預設的配置項。你只需要確認一下Action所在的Package繼承了“struts-default”package。
在配置一個新的攔截器之前,首先要對它進行定義。<interceptors … />和<interceptor … />標籤都要直接放到<package>標籤裡面。像我們上面提到的那些攔截器,它們的配置項就是這樣的:
<interceptors> … <interceptor name="autowiring" class="…xwork2.spring.interceptor.ActionAutowiringInterceptor"/> </interceptors> |
我們同時還要確保Action中應用了所需的攔截器。這可以通過兩種方式來實現。第一種是把攔截器獨立的分配給每一個Action:
<action name="my" class="MyAction" > <result>view.jsp</result> <interceptor-ref name="autowiring"/> </action> |
在這種情況下,Action所應用的攔截器是沒有數量限制的。但是攔截器的配置順序必須要和執行的順序一樣。
第二種方式是在當前的Package下面配置一個預設的攔截器:
<default-interceptor-ref name="autowiring"/>
這個聲明也是直接放在<package … /> 標籤裡面,但是只能有一個攔截器被配置為預設值。
現在攔截器已經被配置好了,每一次Action所映射的URL接到請求時,這個攔截器就會被執行。但是這個功能還是很有限的,因為在大多數情況下,一個Action都要對應有多個攔截器。實際上,由於Struts2的很多功能都是基於攔截器完成的,所以一個Action對應有7、8個攔截器也並不稀奇。可以想象的到,如果要為每一個Action都逐一配置各個攔截器的話,那麼我們很快就會變得焦頭爛額。因此一般我們都用攔截器棧(interceptor stack)來管理攔截器。下面是struts-default.xml檔案中的一個例子:
<interceptor-stack name="basicStack"> <interceptor-ref name="exception"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="params"/> <interceptor-ref name="conversionError"/> </interceptor-stack> |
這個配置節點是放在<package … /> 節點中的。每一個 <interceptor-ref … />標籤都引用了在此之前配置的攔截器或者是攔截器棧。
我們已經看到了如何在Action中應用攔截器,而攔截器棧的用法也是一模一樣的,而且還是同一個標籤:
<action name="my" class="MyAction" > <result>view.jsp</result> <interceptor-ref name="basicStack"/> </action> |
預設攔截器的情況也是一樣的——只需要把單個攔截器的名字換成攔截器棧的名字就可以了。
<default-interceptor-ref name="basicStack"/>
由上面的種種情況可以得出,當配置初始的攔截器與攔截器棧時,必須要確保它們的名字是唯一的。