首先,這要用到兩個(gè)軟件包,,一個(gè)是SmartUrls(Struts2的插件,下載地址:http://code.google.com/p/smarturls-s2/downloads/list),,還有就是urlrewritefilter(下載地址:http:///urlrewrite/dist/urlrewritefilter-2.6.zip).
要想去掉struts2的后綴,,就要這樣配置filter:
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.texturemedia.smarturls.SmartURLsFilter</filter-class>
- </filter>
用這個(gè)代替struts2的核心過(guò)濾器,FilterDispatcher。不必?fù)?dān)心struts2不起作用了,,因?yàn)檫@個(gè)過(guò)濾器是繼承自FilterDispatcher的,。同時(shí)在struts.properties中加入struts.action.extension= ,不設(shè)任何值,。
然后就是配置UrlRewriteFilter,如下
- <filter>
- <filter-name>UrlRewriteFilter</filter-name>
- <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
- </filter>
在配置filter-mapping的時(shí)候,,注意urlrewritefilter的應(yīng)該在前面。然后urlrewritefilter的重寫該怎么用大家可以參看文檔,,這里就不再贅述,。
當(dāng)使用時(shí)發(fā)現(xiàn)重寫后,filterChain上只有一個(gè)urlrewritefilter,,而沒(méi)有經(jīng)過(guò)smartUrls就發(fā)到了請(qǐng)求的資源,,得到的自然是一個(gè)404錯(cuò)誤。于是我參看urlrewritefilter的源代碼發(fā)現(xiàn),,如果重寫url成功的話,,將會(huì)調(diào)用RequestDispatcher的forward方法轉(zhuǎn)發(fā)到資源,而重寫不成功或者是沒(méi)有重寫才會(huì)調(diào)用filterChain.dofilter,。所以struts2的filter-mapping應(yīng)該這樣配置
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- <dispatcher>FORWARD</dispatcher>
- </filter-mapping>
然后就 OK 了
最后說(shuō)明一點(diǎn),,這要在支持servlet2.4以上規(guī)范的容器中才氣作用,因?yàn)閟ervlet2.3規(guī)范里面,,過(guò)濾器只支持request過(guò)濾,,不支持轉(zhuǎn)發(fā)之類的過(guò)濾