WebWork 2.2 Filter,Url Rewrite,Servlet規(guī)范

          在WebWork 2.2中,默認(rèn)已經(jīng)使用Filter的方式來(lái)進(jìn)行對(duì)action的處理,這樣做固然帶來(lái)了很多好處,但是也有很多弊端.

          當(dāng)然,事情總是不斷進(jìn)步的,我們就要揚(yáng)長(zhǎng)避短了.

          使用Filter方式帶來(lái)的優(yōu)點(diǎn)有:

          • 可以服務(wù)靜態(tài)內(nèi)容(當(dāng)然后來(lái)webwork也提供了方式來(lái)避免服務(wù)靜態(tài)內(nèi)容,因?yàn)閷?duì)于普通文件應(yīng)用服務(wù)器一般不比普通web服務(wù)器性能好)
          • 可以處理多種請(qǐng)求,當(dāng)然目前也沒(méi)有更多的請(qǐng)求處理

          缺點(diǎn)有:

          • 在Servlet 2.3中,不能使用jsp:include或者ww:include包含action輸出的結(jié)果了(當(dāng)然可以使用ww:action)
          • 一個(gè)請(qǐng)求如果發(fā)生了Forward,一般不會(huì)再經(jīng)過(guò)Filter了(include同理,這是前面一條的原因)
          • 由于Servlet和Filter的不同,還會(huì)有很多其他問(wèn)題--不過(guò)目前還沒(méi)有注意到

          首先我們來(lái)看看如何配置Filter

          ?

          配置WebWork的Filter

          在最簡(jiǎn)單的情況下,webwork 2.2.的web.xml是這樣的:

          ??? <filter>
          ??????? <filter-name>webwork</filter-name>
          ??????? <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
          ??? </filter>

          ??? <filter-mapping>
          ??????? <filter-name>webwork</filter-name>
          ??????? <url-pattern>/*</url-pattern>
          ??? </filter-mapping>


          如果使用了SiteMesh,那么是這樣配置的:

          ?<filter>
          ???? <filter-name>webwork-cleanup</filter-name>
          ???? <filter-class>com.opensymphony.webwork.dispatcher.ActionContextCleanUp</filter-class>
          ?</filter>
          ??? <filter>
          ??????? <filter-name>sitemesh</filter-name>
          ??????? <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
          ??? </filter>
          ?<filter>
          ???? <filter-name>webwork</filter-name>
          ???? <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
          ?</filter>

          ?<filter-mapping>
          ???? <filter-name>webwork-cleanup</filter-name>
          ???? <url-pattern>/*</url-pattern>
          ?</filter-mapping>
          ?<filter-mapping>
          ???? <filter-name>sitemesh</filter-name>
          ???? <url-pattern>/*</url-pattern>
          ?</filter-mapping>
          ?<filter-mapping>
          ???? <filter-name>webwork</filter-name>
          ???? <url-pattern>/*</url-pattern>
          ?</filter-mapping>


          注意中間是使用jsp時(shí)的配置,如果使用FreeMarker,要換成對(duì)應(yīng)的PageFilter. (WebWork提供了FreeMarkerPageFilter和VelocityPageFilter)

          ?

          分析Servlet 規(guī)范

          Filter在Servlet 2.3規(guī)范中出現(xiàn),配置方式就和最簡(jiǎn)單的webwork的配置相同,在Servlet 2.4中,對(duì)mapping做了改進(jìn),可以設(shè)置Filter服務(wù)于何種請(qǐng)求.舉例如下:

          ??? <filter-mapping>
          ??????? <filter-name>webwork</filter-name>
          ??????? <url-pattern>/*</url-pattern>
          ??<dispatcher>FORWARD</dispatcher>
          ??<dispatcher>REQUEST</dispatcher>
          ??<dispatcher>INCLUDE</dispatcher>
          ??? </filter-mapping>

          也就是說(shuō),Filter通過(guò)配置可以服務(wù)FORWARD和INCLUDE(以及ERROR)方式的請(qǐng)求了,而在Servlet 2.3中,是沒(méi)有規(guī)定的.而在Servlet 2.4中,如果沒(méi)有設(shè)置dispatcher,默認(rèn)情況下是僅服務(wù)REQUEST類(lèi)型的請(qǐng)求. 我覺(jué)得在Servlet 2.3的情況下,Filter也應(yīng)該僅服務(wù)于REQUEST請(qǐng)求.(在Tomcat 下,本人測(cè)試確實(shí)如此,其他環(huán)境沒(méi)有測(cè)試)

          通過(guò)上述分析,我們可以看到,如果應(yīng)用服務(wù)器支持Servlet 2.4,通過(guò)設(shè)置我們的web.xml為2.4的格式,然后設(shè)置Filter的服務(wù)類(lèi)型,則可以對(duì)FORWARD,INCLUDE,ERROR類(lèi)型的請(qǐng)求進(jìn)行服務(wù).

          通過(guò)Servlet 2.4規(guī)范我們可以避免一些使用Filter的缺點(diǎn),當(dāng)然如果設(shè)置不當(dāng),可能也會(huì)帶來(lái)一些毛病:

          • 如果sitemesh映射處理不好,可能一個(gè)頁(yè)面被多次裝飾,所以要注意裝飾設(shè)置和Filter設(shè)置的合理搭配
          • 多次經(jīng)過(guò)Filter,可能會(huì)造成混亂,以及性能問(wèn)題

          Include 一個(gè)Action

          前面我們說(shuō)過(guò),升級(jí)到webwork 2.2后,文檔上已經(jīng)說(shuō)使用ww:action的調(diào)用來(lái)替換ww:include和jsp:include對(duì)一個(gè)action的包含,當(dāng)然我也是推薦ww:action來(lái)替換老的方式的. 但是這不等于說(shuō)ww:include,jsp:include不能包含一個(gè)action了.

          通過(guò)對(duì)filter-mapping的dispatcher的設(shè)置,可以完全使用包含action.

          ?<filter-mapping>
          ???? <filter-name>webwork</filter-name>
          ???? <url-pattern>/*</url-pattern>
          ??????? <dispatcher>REQUEST</dispatcher>
          ??????? <dispatcher>FORWARD</dispatcher>
          ??????? <dispatcher>INCLUDE</dispatcher>
          ?</filter-mapping>

          注意如果有其他相關(guān)的Filter,也要進(jìn)行類(lèi)似配置,例如webwork-cleanup.

          警告:我們不推薦使用這種方式!

          URL Rewrite Filter的使用

          url rewrite filter是一個(gè)java編寫(xiě)的優(yōu)秀的重寫(xiě)url引擎.用于在java應(yīng)用中重寫(xiě)URL. 當(dāng)然如果你有web服務(wù)器的重寫(xiě)權(quán)限(例如apache),最好使用web服務(wù)器的ReWrite引擎,它們的效率會(huì)高于Url Rewrite Filter.

          在WebWork 2.1.7的時(shí)候,因?yàn)閃ebWork使用Servlet處理請(qǐng)求,所以不對(duì)Filter造成不良影響,在WebWork 2.1.7中使用的配置如下:

          ??? <filter>
          ??????? <filter-name>UrlRewriteFilter</filter-name>
          ??????? <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
          ??????? <init-param>
          ??????????? <param-name>logLevel</param-name>
          ??????????? <param-value>WARN</param-value>
          ??????? </init-param>
          ??? </filter>

          ??? <filter>
          ??????? <filter-name>sitemesh</filter-name>
          ??????? <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
          ??? </filter>


          ??? <filter-mapping>
          ??????? <filter-name>UrlRewriteFilter</filter-name>
          ??????? <url-pattern>/someurl/*</url-pattern>
          ??? </filter-mapping>

          ??? <filter-mapping>
          ??????? <filter-name>sitemesh</filter-name>
          ??????? <url-pattern>/*</url-pattern>
          ??? </filter-mapping>


          ?<servlet>
          ??<servlet-name>webwork</servlet-name>
          ??<servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
          ?</servlet>
          ?
          ?<servlet-mapping>
          ??<servlet-name>webwork</servlet-name>
          ??<url-pattern>*.action</url-pattern>
          ?</servlet-mapping>


          而升級(jí)到webwork 2.2.2中時(shí),由于webwork的配置改變了,對(duì)webwork的action的forward方式的重寫(xiě)就會(huì)無(wú)法生效了.? ---如果你的rewrite全部都是redirect,則無(wú)須修改

          (如果使用了forward重寫(xiě)方式,會(huì)發(fā)生404錯(cuò)誤)

          在Servlet 2.3規(guī)范的應(yīng)用服務(wù)器中,這可能是個(gè)無(wú)法解決的問(wèn)題!(也許能通過(guò)修改某些程序的代碼可以做到)

          如果你的應(yīng)用服務(wù)器支持Servlet 2.4,則可以按照上面的說(shuō)明修改web.xml,就可以繼續(xù)使用了. (但是要避免前面說(shuō)的多次filter的問(wèn)題)

          配置示例如下:

          <web-app version="2.4"
          ?xmlns="http://java.sun.com/xml/ns/j2ee"
          ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          ?xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
          ?http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

          ??? <filter>
          ??????? <filter-name>UrlRewriteFilter</filter-name>
          ??????? <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
          ??????? <init-param>
          ??????????? <param-name>logLevel</param-name>
          ??????????? <param-value>WARN</param-value>
          ??????? </init-param>
          ??? </filter>

          ?<filter>
          ???? <filter-name>webwork-cleanup</filter-name>
          ???? <filter-class>com.opensymphony.webwork.dispatcher.ActionContextCleanUp</filter-class>
          ?</filter>
          ??? <filter>
          ??????? <filter-name>sitemesh</filter-name>
          ??????? <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
          ??? </filter>
          ?<filter>
          ???? <filter-name>webwork</filter-name>
          ???? <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
          ?</filter>

          ??? <filter-mapping>
          ??????? <filter-name>UrlRewriteFilter</filter-name>
          ??????? <url-pattern>/srun/*</url-pattern>
          ??????? <dispatcher>REQUEST</dispatcher>
          ??????? <dispatcher>FORWARD</dispatcher>
          ??? </filter-mapping>

          ?<filter-mapping>
          ???? <filter-name>webwork-cleanup</filter-name>
          ???? <url-pattern>/*</url-pattern>
          ??????? <dispatcher>REQUEST</dispatcher>
          ??????? <dispatcher>FORWARD</dispatcher>
          ?</filter-mapping>
          ?<filter-mapping>
          ???? <filter-name>sitemesh</filter-name>
          ???? <url-pattern>/*</url-pattern>
          ?</filter-mapping>
          ?<filter-mapping>
          ???? <filter-name>webwork</filter-name>
          ???? <url-pattern>/*</url-pattern>
          ??????? <dispatcher>REQUEST</dispatcher>
          ??????? <dispatcher>FORWARD</dispatcher>
          ?</filter-mapping>


          注意sitemesh的filter的配置,你的可能和此處不同,因?yàn)槲乙苊忭?yè)面多次被裝飾.當(dāng)然可以通過(guò)sitemesh的配置文件,設(shè)置只裝飾某個(gè)處理中的url即可. 也就是說(shuō),某種情況下,有可能你的sitemesh的filter-mapping中也要包括dispatcher的配置.

          總之,要根據(jù)實(shí)際情況編寫(xiě)自己的web.xml.

          ?

          沒(méi)有好好組織,說(shuō)的比較亂,請(qǐng)多見(jiàn)諒.

          _____________________________________________
          JavaScud 免費(fèi)開(kāi)源平臺(tái) http://www.javascud.org

          posted on 2006-04-11 10:26 Scud(飛云小俠) 閱讀(2911) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): WEB

          評(píng)論

          # re: WebWork 2.2 Filter,Url Rewrite,Servlet規(guī)范 2006-05-11 09:44 wsk

          不錯(cuò),感謝  回復(fù)  更多評(píng)論   

          <2006年4月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          文章發(fā)布許可
          創(chuàng)造共用協(xié)議:署名,非商業(yè),保持一致

          我的郵件
          cnscud # gmail


          常用鏈接

          留言簿(15)

          隨筆分類(lèi)(113)

          隨筆檔案(103)

          相冊(cè)

          友情鏈接

          技術(shù)網(wǎng)站

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 牡丹江市| 黔东| 广东省| 安阳市| 三都| 民乐县| 华蓥市| 长寿区| 柳州市| 湟源县| 曲周县| 沙洋县| 安图县| 庐江县| 大邑县| 黄平县| 定日县| 广德县| 溧水县| 吕梁市| 图木舒克市| 牡丹江市| 隆化县| 井陉县| 曲阜市| 平阴县| 定南县| 南江县| 松滋市| 柳河县| 车险| 平南县| 古交市| 永德县| 建瓯市| 和政县| 凌源市| 湘阴县| 金平| 松溪县| 张家港市|