<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 60,comments - 71,trackbacks - 0

    1、 一個(gè)攔截器就是在xwork.xml文件中定義的一個(gè)無(wú)狀態(tài)Java類(lèi),它至少要實(shí)現(xiàn)XWorkcom.opensymphony.xwork.interceptor.Interceptor接口。代碼如下:

    public interface Interceptor extends Serializable {

        void destroy();

     

        void init();

     

        String intercept(ActionInvocation invocation) throws Exception;

    }

    2、 實(shí)現(xiàn)Interceptor接口的攔截器,代碼部分在intercept方法中實(shí)現(xiàn)。在intercept方法中,可以直接返回一個(gè)Result字符串,這樣整個(gè)執(zhí)行直接“短路”,這時(shí)Actionexecute方法也不會(huì)執(zhí)行(一般很少會(huì)這么用)。所以,一般都會(huì)在這個(gè)方法里調(diào)用參數(shù)對(duì)象invocationinvoke方法,并返回這個(gè)方法執(zhí)行的結(jié)果。這樣會(huì)持續(xù)執(zhí)行后面的攔截器方法以及Actionexecute方法等。

    3、 大部分的時(shí)候,攔截器直接繼承WebWork的抽象類(lèi)com.opensymphony.xwork.interceptor.AroundInterceptor就可以了。這時(shí),需要實(shí)現(xiàn)它的beforeafter方法。Before方法會(huì)在Action執(zhí)行之前調(diào)用,after方法在Action執(zhí)行之后調(diào)用。

    4、 攔截器的執(zhí)行順序。我們可將多個(gè)攔截器放一起組裝成一個(gè)攔截器棧。這樣攔截器會(huì)按照棧的順序由上而下執(zhí)行before方法,所有before方法執(zhí)行結(jié)束,再執(zhí)行Action的方法,執(zhí)行Result的方法,再返回執(zhí)行結(jié)果,最后再?gòu)南露蠄?zhí)行攔截器的after方法。

    5、 攔截器的過(guò)濾功能。我們通常會(huì)在應(yīng)用中使用一個(gè)通用的定義多個(gè)攔截器的攔截器棧。但有些Action方法在調(diào)用的時(shí)候,不需要要其中的部分?jǐn)r截器。這時(shí),我們就可以使用攔截器過(guò)濾功能。如果攔截器要擁有過(guò)濾功能,必須實(shí)現(xiàn)抽象類(lèi)com.opensymphony.xwork.interceptor.MethodFilterInterceptor。這樣,攔截器在定義的時(shí)候或者在Action引用攔截器棧的時(shí)候,我們就可以指定哪些Action方法是需要過(guò)濾的,哪些Action是不需要過(guò)濾的。

     

    WebWork提供的攔截器介紹

    1、 自動(dòng)為Action設(shè)置Http請(qǐng)求數(shù)據(jù)的攔截器(Parameters Interceptor)。這個(gè)攔截器非常方便實(shí)用,但完全自動(dòng)組裝對(duì)象數(shù)據(jù),很可能會(huì)帶來(lái)安全問(wèn)題。如果Action不需要設(shè)置數(shù)據(jù),那么這個(gè)Action只要實(shí)現(xiàn)com.opensymphony.xwork.interceptor.NoParameters接口即可。如果是Action中部分?jǐn)?shù)據(jù)需要自動(dòng)設(shè)置,部分?jǐn)?shù)據(jù)不允許設(shè)置,這樣可以實(shí)現(xiàn)接口com.opensymphony.xwork.interceptor.ParameterNameAware,可以在這個(gè)接口的acceptableParameterName(String parameterName)方法中,定義我們可以接受哪些方法,如果允許只要讓這個(gè)方法返回True就可以了。

    2、 過(guò)慮參數(shù)功能的攔截器(Parameter Filter Interceptor)。它可以全局阻止非法或不允許Action訪(fǎng)問(wèn)的參數(shù)。可以很好的和上面的組裝參數(shù)的攔截器一起使用。

    3、 Action設(shè)置靜態(tài)數(shù)據(jù)的攔截器(Static Parameters Interceptor)。它可以將Action定義的靜態(tài)<param/>參數(shù),設(shè)置到Action中。

    4、 數(shù)據(jù)驗(yàn)證攔截器(Validation Interceptor)。定義之后,會(huì)調(diào)用驗(yàn)證文件或?qū)崿F(xiàn)驗(yàn)證接口com.opensymphony.xwork.Validateable的所有驗(yàn)證。

    5、 驗(yàn)證流程處理攔截器(Workflow Interceptor)。它和上面的攔截器一起使用,處理驗(yàn)證的流程。如果驗(yàn)證通過(guò)則繼續(xù)前進(jìn),如果發(fā)現(xiàn)有驗(yàn)證錯(cuò)誤消息,直接轉(zhuǎn)到Action中定義的輸入結(jié)果(input)頁(yè)面。

    6、 類(lèi)型轉(zhuǎn)換錯(cuò)誤處理攔截器()。它首先去取得類(lèi)型轉(zhuǎn)換的錯(cuò)誤消息(主要是由設(shè)置Http請(qǐng)求參數(shù)的攔截器產(chǎn)生),如果取到錯(cuò)誤消息,它會(huì)將錯(cuò)誤消息傳遞給實(shí)現(xiàn)接口com.opensymphony.xwork.ValidationAwareAction,這樣我們可以將這些錯(cuò)誤消息暴露到頁(yè)面中。

    7、 Action鏈攔截器(Chaining Interceptor)。它是用來(lái)拷貝前一個(gè)Action的屬性數(shù)據(jù)到當(dāng)前Action中。它要求前一個(gè)Action必須是chain Result<result type="chain">),這樣才能進(jìn)行Action的數(shù)據(jù)拷貝。

    8、 防止頁(yè)面重復(fù)提交(或頁(yè)面重復(fù)刷新)攔截器。Token InterceptorToken Session Interceptor都是防止重復(fù)提交的攔截器。不同點(diǎn)是后者在Session存貯了最近一次請(qǐng)求的結(jié)果數(shù)據(jù)。

    9、 文件上傳的攔截器(File Upload Interceptor)。實(shí)現(xiàn)文件上傳的功能。如果有人曾經(jīng)手工寫(xiě)過(guò)文件上傳程序,那一定會(huì)驚嘆于這個(gè)攔截器。我們可以在這個(gè)攔截器中設(shè)定上傳文件的大小和類(lèi)型限制。記得需要第三方的文件上傳庫(kù)的支持,只要在webwork.properties中配置過(guò),并拷貝相應(yīng)的jar包就可以了。

    10、                      進(jìn)度條等待攔截器(Execute and Wait Interceptor)。當(dāng)Action的執(zhí)行需要很長(zhǎng)實(shí)際的時(shí)候,我們可以使用這個(gè)進(jìn)度條等待的攔截器。它會(huì)將Action放到后臺(tái)執(zhí)行,而在前端顯示進(jìn)度條或等待消息提示的頁(yè)面。

    11、                      還有一些其它不常用的攔截器,我們可以在WebWork文檔中找到,這里就不再做介紹。

    IoC 容器

    關(guān)于IoC容器的描述:

    1、 它是一個(gè)容器。用來(lái)處理不同對(duì)象之間的依賴(lài),組裝不同的程序元素。

    2、 IoC全名是Inversion of Control,即依賴(lài)反轉(zhuǎn)控制。它是一種設(shè)計(jì)模式,IoC容器就是基于這個(gè)模式的實(shí)現(xiàn)。

    3、 有一個(gè)比IoC更適合用來(lái)命名這一原理的名詞,它叫Dependency Injection,即依賴(lài)注入。

    4、 有了依賴(lài)注入,我們可以將IoC容器簡(jiǎn)單理解為:它是一個(gè)用來(lái)為對(duì)象組裝其依賴(lài)的對(duì)象的容器;也就是說(shuō)對(duì)象本身不用關(guān)心它依賴(lài)的對(duì)象(可以是組件或者服務(wù),反正就是提供業(yè)務(wù)方法的對(duì)象)的創(chuàng)建,初始化,生命周期等,而是由容器來(lái)控制。

    5、 關(guān)于IoC的更多信息可以查看Martin Fowler的經(jīng)典文章《IoC 容器和Dependency Injection 模式》

    WebWork框架本身就提供了一個(gè)基于接口的IoC容器。同時(shí)WebWork框架和提供了和第三方IoC容器的集成。在WebWork的項(xiàng)目中,我們可以直接使用Spring框架和Pico框架作為自己的IoC容器。而且SpringWebWork官方推薦的IoC容器。

    下面我們將介紹如何使用Spring作為WebWorkIoC容器。在討論如何集成Spring之前,我們要討論一個(gè)非常有意義的架構(gòu)問(wèn)題:

    WebWorkAction類(lèi)是否需要由Spring管理?

    1、 否。這樣Action類(lèi)還是象以前那樣在xwork文件中定義,我們可以通過(guò)標(biāo)簽<external-ref/>定義Action所依賴(lài)的Bean組件,或者根據(jù)Bean的名字或類(lèi)型進(jìn)行自動(dòng)注入。

    2、 是。Action類(lèi)本身也是有Spring來(lái)管理。在xwork定義文件中的Action class就是對(duì)Bean的引用,具體的類(lèi)在SpringBean配置文件中定義。這樣可以更好的使用Sping為我們提供的更多功能,例如:Spring的復(fù)雜AOP功能,基于Acegi的權(quán)限控制,等等。

    兩種方法,根據(jù)需要選擇一種,我個(gè)人更傾向后者。下面我們介紹一下Spring容器的安裝步驟:

    1、 拷貝Spring依賴(lài)的所有jar文件

    2、 web.xml文件定義和開(kāi)啟Spring的監(jiān)聽(tīng)器,代碼如下:

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

          </listener>

    3、 webwork.properties中設(shè)置WebWork對(duì)Spring的支持:webwork.objectFactory = spring

    4、 可以在webwork.properties中設(shè)置Bean組件的默認(rèn)組裝方式,默認(rèn)是按照Bean的名稱(chēng),可以選擇按照類(lèi)型、構(gòu)造函數(shù)、自動(dòng)選擇等方式。

     

    WebWork 原理


    webwork archit.png

    WebWork的網(wǎng)站上提供了一個(gè)完整的WebWork架構(gòu)圖。它描述了從客戶(hù)端的一次請(qǐng)求到最后服務(wù)器端響應(yīng)的的整個(gè)執(zhí)行過(guò)程。架構(gòu)圖如下:

     

    此架構(gòu)圖一個(gè)分為五個(gè)部分,其中五個(gè)部分分別有五中不同顏色表示。

    1、 淺灰色方框。分別代表了客戶(hù)端的一次Http請(qǐng)求,和服務(wù)器端運(yùn)算結(jié)束之后的一次響應(yīng)。

    2、 淺紅色方框。表示一次Action請(qǐng)求所要經(jīng)過(guò)的Servlet filtersServlet 過(guò)濾器)。我們可以看到最后一個(gè)filter就是我們前面介紹的WebWork的前端控制器。

    3、 藍(lán)色方框。這是WebWork框架的核心部分。

    1) 一次請(qǐng)求到了WebWork的前端控制器,它首先會(huì)根據(jù)請(qǐng)求的URL解析出對(duì)應(yīng)的action 名稱(chēng),然后去咨詢(xún)ActionMapper這個(gè)action是否需要被執(zhí)行。

    2) 如果ActionMapper決定這個(gè)action需要被執(zhí)行,前端控制器就把工作委派給ActionProxy。接著她們會(huì)咨詢(xún)WebWork的配置管理器,并讀取在web.xml文件中定義的配置信息。接下來(lái)ActionProxy會(huì)創(chuàng)建ActionInvocation對(duì)象。

    3) ActionInvocationXwork原理的(Command模式)實(shí)現(xiàn)部分。它會(huì)調(diào)用這個(gè)Action已定義的攔截器(before方法)Action方法,Result方法。

    4) 最后,看上面流程的圖的方向,它會(huì)再執(zhí)行攔截器(after方法),再回到Servlet Filter部分,最后結(jié)束并傳給用戶(hù)一個(gè)結(jié)果響應(yīng)。

    4、 靛色方框。這是攔截器部分,在上面的攔截器章節(jié)我們已經(jīng)有了詳細(xì)的介紹。

    5、 黃色方框。這是我們?cè)陂_(kāi)發(fā)Web應(yīng)用時(shí),需要自己開(kāi)發(fā)的程序。其中包括:Action類(lèi),頁(yè)面模板,配置文件xwork.xml

         

    WebWork 實(shí)戰(zhàn)和技巧

    限于篇幅,我們無(wú)法在本章節(jié)給出很多詳盡的具體實(shí)例。其實(shí),在WebWork的代碼包中,有一個(gè)非常好的演示項(xiàng)目——showcase,它用例子演示了WebWork的幾乎所有特性。值得初學(xué)的朋友反復(fù)研究。我們?cè)诒菊鹿?jié)中會(huì)截取其中的部分代碼腳本。

     

    1、 多視圖支持。WebWork框架天生支持多種視圖技術(shù),包括:JspFreeMarkerVelocityJasper ReportsXSLT,還有其它的視圖技術(shù)。這將在敏捷項(xiàng)目中特別有用。在我咨詢(xún)的項(xiàng)目中,就有一個(gè)因?yàn)榧夹g(shù)的原因,視圖技術(shù)由最先的Jsp改為Velocity,后來(lái)又改造為FreeMarker。其中,Action類(lèi)以及后臺(tái)的程序沒(méi)有做任何的改動(dòng)。如果您需要一個(gè)視圖展現(xiàn)層技術(shù),我在這會(huì)好不猶豫的向您推薦FreeMarker。這也是官方的推薦。

    關(guān)于視圖技術(shù)的使用,首先是搭建視圖技術(shù)運(yùn)行的環(huán)境。然后就是編寫(xiě)頁(yè)面腳本,最后就是在xwork.xml文件中配置。Xwork配置文件中,Resulttype參數(shù),就是用來(lái)標(biāo)示所使用的視圖技術(shù)。在showcase項(xiàng)目中,使用到的視圖技術(shù)有:JspFreeMarkerVelocityJasper Reports

     

    2、 Action的數(shù)據(jù)驗(yàn)證功能。在WebWork中,可以在三處實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證功能。一、驗(yàn)證文件(例如:ActionClass-validation.xml文件)中定義數(shù)據(jù)驗(yàn)證規(guī)則。二、在Action中實(shí)現(xiàn)com.opensymphony.xwork.Validateable接口的validate方法。三、在Action的執(zhí)行方法中,硬編碼實(shí)現(xiàn)驗(yàn)證功能。當(dāng)然,在實(shí)現(xiàn)驗(yàn)證時(shí),我們盡可能的用前面兩中方法。

    關(guān)于驗(yàn)證的說(shuō)明:

    1)、第一種驗(yàn)證需要“validation”攔截器的支持。并可以從任意層次綁定驗(yàn)證文件,可以為一個(gè)Action類(lèi)綁定一個(gè)驗(yàn)證文件,也可以為一個(gè)具體在xwork.xml文件中的Action定義綁定一個(gè)驗(yàn)證文件,可以為Action的一個(gè)屬性對(duì)象綁定一個(gè)驗(yàn)證文件,甚至可以為Action的父類(lèi)綁定驗(yàn)證文件。

    2)、WebWork為驗(yàn)證文件提供了一些標(biāo)準(zhǔn)的驗(yàn)證實(shí)現(xiàn):例如:字段必須填寫(xiě),整型、E-mail地址等等。我們也可以使用表達(dá)式語(yǔ)言實(shí)現(xiàn)更復(fù)雜的數(shù)據(jù)驗(yàn)證。

     

    3、 類(lèi)型轉(zhuǎn)換。前面外面一直提到過(guò),WebWork會(huì)自動(dòng)從請(qǐng)求的字符串參數(shù)中組裝Action需要的數(shù)據(jù)對(duì)象。這樣,就會(huì)存在一個(gè)類(lèi)型轉(zhuǎn)換的問(wèn)題。如果Action的字段是基本類(lèi)型或是一個(gè)數(shù)據(jù)對(duì)象,WebWork會(huì)自動(dòng)幫我們處理。如果Action的字段是一個(gè)集合,或者我們需要特定的類(lèi)型轉(zhuǎn)換,這時(shí),我們可以在類(lèi)型轉(zhuǎn)換的定義文件(ClassName-conversion.properties)中定義轉(zhuǎn)換規(guī)則。

    4、 一個(gè)Action的多個(gè)執(zhí)行方法。WebWorkAction是基于Command模式的實(shí)現(xiàn),在WebWork中,除了實(shí)現(xiàn)Action接口的execute()方法之外,Action還可以定義多個(gè)執(zhí)行方法。這些方法必須要是無(wú)方法參數(shù),并且返回返回字符串的方法。這樣我們?cè)?/span>Url中可以用類(lèi)似下面的格式訪(fǎng)問(wèn):actionName!methodName.action,例如user!doAdd.action,調(diào)用user Action類(lèi)的doAdd方法。在最新的WebWork中,Action類(lèi)甚至可以不實(shí)現(xiàn)Action接口。

    5、 Action鏈(Action Chaining)。在WebWork中,一次用戶(hù)請(qǐng)求,可由多個(gè)Action共同完成。每個(gè)Action可以只實(shí)現(xiàn)自己本身的功能單元,這樣我們可以根據(jù)業(yè)務(wù)需要為用戶(hù)的一次請(qǐng)求選擇一個(gè)或多個(gè)Action功能單元來(lái)實(shí)現(xiàn)。在這樣的多個(gè)Action之間可以通過(guò)chain攔截器共享數(shù)據(jù)。如果請(qǐng)求由Action x 鏈到Action y,如果這時(shí)y需要獲得x的數(shù)據(jù),我們就需要為Action y添加chain攔截器。

    例如:在showcase中就由Action Chaining的應(yīng)用。它將ActionactionChain2”鏈到另外一個(gè)ActionactionChain3”,配置文件代碼如下:

          < action name = "actionChain2" class = "com.opensymphony.webwork.showcase.actionchaining.ActionChain2" >

                      < result type = "chain" > actionChain3 </ result >

                </ action >

                < action name = "actionChain3" class = "com.opensymphony.webwork.showcase.actionchaining.ActionChain3" >

                      < result > /actionchaining/actionChainingResult.jsp </ result >

             </ action >

    注意:如果要加 chain 攔截器,是需要加到 actionChain3 中,而不是 actionChain2

     

    6、 多模塊支持解決方案。 WebWork 提供了很靈活的多模塊解決方案,這樣我們可以很好的組織復(fù)雜的 Web 應(yīng)用項(xiàng)目。

    1 )可以在 xwork.xml 文件中,用 include 標(biāo)簽包含另外的一個(gè) xwork 配置文件。例如: <include file="webwork-default.xml"/>

    2 xwork.xml 配置文件支持 package 。我們可以將一個(gè)業(yè)務(wù)模塊的定義方到一個(gè) package package 支持繼承功能,子 package 可以享有父 package 的所有定義。

    3 )可以為 package 定義一個(gè)命名空間。不同的命名空間可以定義相同的 action 名字。命名空間會(huì)用于訪(fǎng)問(wèn) action URL ,基于這個(gè)命名空間,我們可以實(shí)現(xiàn)資源權(quán)限的訪(fǎng)問(wèn)控制。

     

    7、 doInput 方法。這是我們常用的小技巧,有時(shí)候請(qǐng)求的就是一個(gè)頁(yè)面模板,總不能為這個(gè)單獨(dú)寫(xiě)一個(gè) Action 類(lèi)吧,這時(shí)我們就可以用 ActionSupport doInput 方法,直接返回在 Actoion 中定義為“ input ”的 result

    8、 prepare方法。如果在Action執(zhí)行之前,必須要初始化一些數(shù)據(jù)。我們可以將這些初始化的代碼方到prepare方法中。這時(shí),Action類(lèi)要實(shí)現(xiàn)接口com.opensymphony.xwork.Preparable,同時(shí)這個(gè)Action的定義還需要PrepareInterceptor攔截器的支持。

    9、 ActionModel Driven。我們大部分的時(shí)候用得都是ActionField Driven,即直接將Action的字段作為數(shù)據(jù)模型。Model Driven是專(zhuān)門(mén)為這個(gè)Action指定一個(gè)模型對(duì)象,這樣有什么好處呢?好處是在表達(dá)式語(yǔ)言中少了一個(gè)對(duì)象名的前綴。例如:前面值堆棧部分關(guān)于Employee的例子,要設(shè)置雇員名稱(chēng),我們必須要表達(dá)式語(yǔ)言例如:“employee.name”,如果這個(gè)數(shù)據(jù)是有頁(yè)面輸入得到,那么你就必須有一個(gè)Input輸入框的name為“employee.name”,因?yàn)樗嘘P(guān)鍵字符“.”,如果Javascript腳本使用這個(gè)輸入框的名字,就會(huì)有錯(cuò)誤。使用Model Driven之后,這個(gè)表達(dá)式就可以變?yōu)?#8220;name”,省去了前面的“employee.”。

    10、                      Quick Start。這是WebWork2.2.2中非常激動(dòng)人心的特性。它可以象perlPHP可以快速看到程序運(yùn)行結(jié)果。這樣在Web開(kāi)發(fā)時(shí),可以不用編譯Java源代碼,也不用去做打包和部署,就可以快速看到最新程序的運(yùn)行結(jié)果,提高開(kāi)發(fā)效率。我們可以在WebWork源碼解壓包的根目錄,輸入命令:java -jar webwork-2.2.2.jar quickstart:showcase(需要jdk1.5的支持),以Quick Start模式,運(yùn)行showcase項(xiàng)目。

    展望 WebWork 未來(lái)

    這是很多人非常關(guān)心的一個(gè)問(wèn)題。特別是WebWork2.2版本發(fā)布之后,官方宣稱(chēng)WebWork框架將要和Struts合并。這讓一些WebWork的用戶(hù)產(chǎn)生了擔(dān)憂(yōu),合并之后,是不是就意味著自己在WebWork這方面技術(shù)和經(jīng)驗(yàn)的積累都已浪費(fèi)?已使用或即將使用WebWork的項(xiàng)目是不是就意味著更多的風(fēng)險(xiǎn)?

    答案是:完全不用擔(dān)心這些。WebWorkStruts的合并,是各取所長(zhǎng),然后誕生出一個(gè)更加高效的Web框架。而這個(gè)框架用得就是WebWork的優(yōu)秀技術(shù)和Struts的強(qiáng)大社區(qū)。

    合并的情況如下:

    1、 產(chǎn)生一個(gè)新的項(xiàng)目Struts Action 2.0 = WebWork2.2 + 一些Struts的功能和特性。

    2、 WebWork框架將會(huì)中止新功能的增加,如果有新的版本發(fā)布都會(huì)是Bug的修改。

    3、 代碼、框架的開(kāi)發(fā)者、社區(qū)都將移到Struts

    4、 合并的目標(biāo)是致力于生產(chǎn)率的提高。

    5、 Struts不再是一個(gè)框架,它是一個(gè)社區(qū)。

    6、 Struts社區(qū)中主要有兩個(gè)Web框架。一個(gè)是基于Action模型的Struts Action;另一個(gè)是基于組件模型的Struts Shale

    總結(jié)

     

    WebWork是本人工具箱中最?lèi)?ài)的一個(gè)J2EE Web框架。本人開(kāi)發(fā)過(guò)單純使用JspJavaServlet的項(xiàng)目;也曾經(jīng)自己開(kāi)發(fā)過(guò)基于MVCWeb框架;在2002年開(kāi)始使用Struts開(kāi)發(fā);后來(lái)也在項(xiàng)目中分別使用過(guò)TapestrySpring MVC Web框架;也在當(dāng)今的AJAX潮流中隨波逐流。上面的一些技術(shù)也都非常優(yōu)秀,擅用他們?nèi)魏我粋€(gè)都會(huì)給您帶來(lái)很多生產(chǎn)效率的提高。但我仍然是偏愛(ài)WebWorkWebWork的與眾不同,得力于它基于OGNL的強(qiáng)大的數(shù)據(jù)存、取方式,得力于它那解耦的攔截器功能,得力于它那無(wú)侵入的架構(gòu)設(shè)計(jì)。正是由于它,才讓Web編程變得更加的自然、簡(jiǎn)單、靈活、高效。

    posted on 2008-06-23 16:18 henry1451 閱讀(749) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Struts,Webwork,Xwork技術(shù)

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久草福利资源网站免费| 国产亚洲高清不卡在线观看| 日本免费久久久久久久网站| 猫咪www免费人成网站| 亚洲午夜一区二区电影院| 亚洲精品国产成人片| 免费**毛片在线播放直播| 在线v片免费观看视频| 久久99精品国产免费观看| 国产va免费观看| 美女尿口扒开图片免费| 亚洲美国产亚洲AV| 亚洲一卡2卡4卡5卡6卡在线99 | 亚洲中文字幕久久无码| 亚洲欧洲精品国产区| 亚洲国产天堂久久综合网站| 中文字幕不卡亚洲| 青青草原亚洲视频| 亚洲中文无韩国r级电影| 啊v在线免费观看| 亚洲国产高清精品线久久| 日美韩电影免费看| 日韩精品无码人妻免费视频| 成人免费视频一区二区三区| 无码人妻一区二区三区免费手机 | 国产亚洲精品影视在线产品| 全亚洲最新黄色特级网站| 免费欧洲美女牲交视频| 国产无遮挡色视频免费视频 | 深夜A级毛片视频免费| 精品国产日韩亚洲一区91| 国产成人综合亚洲绿色| 亚洲av成人中文无码专区| 亚洲成AV人影片在线观看| 亚洲av中文无码字幕色不卡| 日韩色日韩视频亚洲网站| 日本激情猛烈在线看免费观看| 男女猛烈无遮掩视频免费软件 | 亚洲AV网站在线观看| 亚洲精品一级无码鲁丝片| 亚洲中文字幕无码日韩|