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