<filter>
<display-name>Stripes Filter</display-name>
<filter-name>StripesFilter</filter-name>
<filter-class>
net.sourceforge.stripes.controller.StripesFilter
</filter-class>
<init-param>
<param-name>ActionResolver.UrlFilters</param-name>
<param-value>/WEB-INF/classes</param-value>
</init-param>
</filter>
當(dāng)Servlet容器啟動的時候,StripesFilter對其init-param元素執(zhí)行初始化。其中最重要的init-param元素就是ActionResolver.UrlFilters參數(shù)。這個參數(shù)告訴Stripes到哪里查找跟Stripes有關(guān)的類。這個例子里面,Stripes將查找/WEB-INF/classes目錄下的所有實現(xiàn)ActionBean接口的類。每一個被找到的類和其綁定的URL都將被加入一個Map中。
讓我們來看看Stripes是如何處理我們的HelloWorldAction動作為例子吧。因為HelloWorldAction類位于/WEB-INF/classes目錄下,所以會被認為是一個Stripes servlet。在我們的例子當(dāng)中,其完整類名是com.myco.web.stripes.action.example.HelloWorldAction。隨后,其完整類名將按照如下法則被翻譯成一個URL綁定。
1. 將含有www、web、stripes、和action的部分及其以前的內(nèi)容刪掉。在我們的例子有三個上述單詞,所以我們得到了example.HelloWorldAction。
2. 如果類名中包涵帶Action或Bean的尾巴,刪掉。因為我們的類名以Action結(jié)尾,我們得到了example.HelloWorld。
3. 將.替換為/,我們得到了example/HelloWorld。
4. 最后,添加上一個尾綴(默認是.action)從而完成了URL綁定。最后的結(jié)果是example/HelloWorld.action。
現(xiàn)在Stripes找到了ActionBean類并為其創(chuàng)建了一個URL綁定,然后存放在一個java.util.Map<String, Class<? extends ActionBean>>之中。其中key參數(shù)是URL綁定,value參數(shù)是實現(xiàn)ActionBean的類名。下面是我們的例子中的Map:
URL綁定:/example/HelloWorld.action
ActionBean類:com.myco.web.stripes.action.example.HelloWorldAction
我們要看的第二個組件是Stripes如何把URL綁定翻譯成你正在做的這個ActionBean類。這是Stripes調(diào)度servlet的職責(zé),在web.xml中的配置如下:
<servlet>
<servlet-name>StripesDispatcher</servlet-name>
<servlet-class>
net.sourceforge.stripes.controller.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>StripesDispatcher</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
StripesDispatcher的一個職責(zé)就是將URL解析為Stripes的ActionBean類。當(dāng)用戶激活URL http://host/uri/example/HelloWorld.action的時候,Stripes調(diào)度servlet將在URL映射表中查詢并找到com.myco.web.stripes.action.example.HelloWorldAction類,并實例化產(chǎn)生該類的一個實例。最后,index方法被激活,因為在annotation中它被定義為默認局柄而在該URL中并沒有指定一個事件。
如果我們想要直接執(zhí)行HelloWorldAction中的hello方法怎么辦?應(yīng)該象下面這個URL這樣把事件的名字放在request的參數(shù)中:
http://host/uri/example/HelloWorld.action?hello=&firstName=Mark&age=13
請注意我們沒有給hello這個request參數(shù)名指定任何值。在這個情況下,StripesDispatcher會把hello這個這個request參數(shù)名和HelloWorldAction類中個一個帶有public Resolution hello()簽名的函數(shù)識別并映射。該方法名城在初始化的時候為了性能而緩存在另一個Map中。
我們已經(jīng)看到Stripes的基礎(chǔ)以及如果創(chuàng)建簡單的動作和一些該框架是如何運作的細節(jié)。通過在web.xml中的初始化,我們能夠避免用多個單獨的XML配置文件來把我們的顯示層組建寫在一起。這很重要,原因如下:首先,如果你需要任何改動,你可以看到一個URL就立即知道你該查看哪一個類。其次,我們不需要任何單獨的工具來在你的配置文件過大而且不可管理的時候幫助你。通過消除掉配置文件,我們不再需要給框架一大堆的metadata。最后,我們不再需要為一個獨立的用來描述我們的組件是如果相互關(guān)聯(lián)的文件來一刻不停維護了。