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

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

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

    posts - 495,  comments - 11,  trackbacks - 0

    Struts的plug-in配置部分明確指出,Spring的配置文件有兩個(gè):applicationContext.xml和action-servlet.xml。其實(shí),完全可以使用一個(gè)配置文件。通常,習(xí)慣將Action Bean配置在控制器的context內(nèi)。action-servlet.xml用于配置表現(xiàn)層上下文,其詳細(xì)配置信息如下:

    <?xml version="1.0" encoding="gb2312"?>

    <!-- 指定Spring配置文件的根元素,以及對(duì)應(yīng)的Schame信息 -->

    <beans xmlns="http://www.springframework.org/schema/beans"

    ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    ??? <!-- 每個(gè)request請(qǐng)求產(chǎn)生一個(gè)新實(shí)例,將所有該請(qǐng)求的作用域配置成request -->

    ??? <bean name="/login" class="lee.LoginAction" scope="request">

    ??????? <property name="vb" ref="vb"/>

    ??? </bean>

    </beans>

    因?yàn)槊看握?qǐng)求都應(yīng)該啟動(dòng)新的Action處理用戶請(qǐng)求,因此,應(yīng)將Action的作用域配置成Request。

    注意:ActionServlet轉(zhuǎn)發(fā)請(qǐng)求時(shí),是根據(jù)Bean的name屬性,而不是id屬性。因此,此處確定的name屬性與Struts的action屬性相同。

    applicationContext.xml只有一個(gè)bean配置,即vb bean。其詳細(xì)配置如下:

    <?xml version="1.0" encoding="GBK"?>

    <!-- 指定Spring 配置文件的根元素,以及對(duì)應(yīng)的Schema信息 -->

    <beans xmlns="http://www.springframework.org/schema/beans"

    ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    ??? <!-- 配置ValidBean實(shí)例 -->

    ??? <bean id="vb" class="lee.ValidBeanImpl"/>

    </beans>

    ValidBeanImpl是一個(gè)業(yè)務(wù)邏輯bean,本示例程序中僅作簡(jiǎn)單的判斷,ValidBeanImpl的源代碼如下:

    //面向接口編程,實(shí)現(xiàn)ValidBean接口

    public class ValidBeanImpl implements ValidBean

    {

    ??? //根據(jù)輸入的用戶名和密碼判斷是否有效

    ??? public boolean valid(String username,String pass)

    ??? {

    ??????? //有效,返回true

    ??????? if (username.equals("scott") && pass.equals("tiger"))

    ??????? {

    ??????????? return true;

    ??????? }

    ??????? return false;

    ??? }

    }

    注意:上面的業(yè)務(wù)邏輯組件非常簡(jiǎn)單,它只是一個(gè)示意。如果是真實(shí)的應(yīng)用,業(yè)務(wù)邏輯組件應(yīng)該通過DAO組件來實(shí)現(xiàn)業(yè)務(wù)邏輯方法。

    應(yīng)用的業(yè)務(wù)邏輯控制器,Action則負(fù)責(zé)調(diào)用業(yè)務(wù)邏輯組件的方法,并根據(jù)業(yè)務(wù)邏輯組件方法的返回值,確定如何響應(yīng)用戶請(qǐng)求。下面是該示例應(yīng)用控制器的代碼:

    //業(yè)務(wù)控制器繼承Action

    public class LoginAction extends Action

    {

    ??? //action控制器將調(diào)用的業(yè)務(wù)邏輯組件

    ??? private ValidBean vb;

    ??? //依賴注入業(yè)務(wù)邏輯組件的setter方法

    ??? public void setVb(ValidBean vb)

    ??? {

    ??????? this.vb = vb;

    ??? }

    ??? //必須重寫該核心方法,該方法actionForm將表單的請(qǐng)求參數(shù)封裝成值對(duì)象

    ??? public ActionForward execute(ActionMapping mapping, ActionForm form,

    ?????? HttpServletRequest request, HttpServletResponse response)throws
    ?????? Exception

    ??? {

    ??????? //form由ActionServlet轉(zhuǎn)發(fā)請(qǐng)求時(shí)創(chuàng)建,封裝了所有的請(qǐng)求參數(shù)

    ??????? LoginForm loginForm = (LoginForm)form;

    ??????? //獲取username請(qǐng)求參數(shù)

    ??????? String username = loginForm.getUsername();

    ??????? //獲取pass請(qǐng)求參數(shù)

    ??????? String pass = loginForm.getPass();

    ??????? //下面為服務(wù)器端的數(shù)據(jù)校驗(yàn)

    ??????? String errMsg = "";

    ??????? //判斷用戶名不能為空

    ??????? if (username == null || username.equals(""))

    ??????? {

    ??????????? errMsg += "您的用戶名丟失或沒有輸入,請(qǐng)重新輸入";

    ??????? }

    ??????? //判斷密碼不能為空

    ??????? else if(pass == null || pass.equals(""))

    ??????? {

    ??????????? errMsg += "您的密碼丟失或沒有輸入,請(qǐng)重新輸入";

    ??????? }

    ??????? //如果用戶名和密碼不為空,才調(diào)用業(yè)務(wù)邏輯組件

    ??????? else

    ??????? {

    ??????????? //vb是業(yè)務(wù)邏輯組件,由容器注入

    ??????????? if (vb.valid(username,pass))

    ??????????? {

    ??????????????? return mapping.findForward("welcome");

    ??????????? }

    ??????????? else

    ??????????? {

    ??????????????? errMsg = "您的用戶名和密碼不匹配";

    ??????????? }

    ??????? }

    ??????? //判斷是否生成了錯(cuò)誤信息

    ??????? if (errMsg != null && !errMsg.equals(""))

    ??????? {

    ??????????? //如果有錯(cuò)誤信息,將錯(cuò)誤信息保存在request里,并跳轉(zhuǎn)到input對(duì)應(yīng)的
    ??????????? forward對(duì)象

    ??????????? request.setAttribute("err" , errMsg);

    ??????????? return mapping.findForward("input");

    ??????? }

    ??????? else

    ??????? {

    ??????????? //如果沒有錯(cuò)誤信息,跳轉(zhuǎn)到welcome對(duì)應(yīng)的forward對(duì)象

    ??????????? return mapping.findForward("welcome");

    ??????? }

    ??? }

    }

    在本應(yīng)用中,使用了Struts的客戶端數(shù)據(jù)校驗(yàn),讓Action繼承ValidatorActionForm即可。ActionForm的代碼非常簡(jiǎn)單,此處不再贅述。

    為了完成數(shù)據(jù)校驗(yàn),還應(yīng)該編寫數(shù)據(jù)校驗(yàn)規(guī)則文件。在struts-config.xml文件的尾部,另有一個(gè)plug-in用來加載校驗(yàn)文件,其中validator-rules.xml文件位于struts壓縮包的lib下,直接復(fù)制過來即可使用,而validator.xml必須自己編寫,validator.xml文件如下:

    <?xml version="1.0" encoding="GBK"?>

    <!-- 驗(yàn)證規(guī)則文件的文件頭,包括DTD等信息 -->

    <!DOCTYPE form-validation PUBLIC

    ????????? "-//Apache Software Foundation//DTD Commons Validator Rules
    ????????? Configuration 1.1.3//EN"

    ????????? "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">

    <!-- 驗(yàn)證文件的根元素 -->

    <form-validation>

    ??? <!-- 所有需要驗(yàn)證的form都放在formset里 -->

    <formset>

    ??? <!-- 需要驗(yàn)證的form名,該名與struts里配置的名相同 -->

    ??? <form name="loginForm">

    ??????? <!-- 指定該form的username域必須滿足的規(guī)則:必填、模式匹配 -->

    ??????? <field property="username" depends="required,mask">

    ??????? ??? <arg key="loginForm.username" position="0"/>

    ??????????? <var>

    ??????????????? <!-- 確定匹配模式的正則表達(dá)式 -->

    ??????????? <var-name>mask</var-name>

    ??????????? <var-value>^[a-zA-Z]+$</var-value>

    ??????????? </var>

    ??????? </field>

    ??????? <!-- 指定該form的pass域必須滿足的規(guī)則:必填 -->

    ??????? <field property="pass" depends="required">

    ??????????? <msg name="required" key="pass.required"/>

    ??????? ??? <arg key="loginForm.pass" position="0"/>

    ??????? </field>

    ??? </form>

    </formset>

    </form-validation>

    上面示例程序的結(jié)構(gòu)非常清晰:表現(xiàn)層組件(Action)配置在action-servlet.xml文件中,而業(yè)務(wù)邏輯層組件(vb)配置在applicationContext.xml文件中,如果應(yīng)用中有DAO組件,將DAO組件配置在dao-context.xml文件中。將3個(gè)文件放在plug-in元素里一起加載。

    文本框:圖6.3  DelegatingRequestProcessor整合策略的登錄失敗效果DelegatingRequestProcessor會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到Action,該Action已經(jīng)處于IoC容器管理之下,因此,可以方便地訪問容器中的其他Bean。

    通過配置文件可以看出,Action根本無(wú)須type屬性,即struts-config.xml中Action根本沒有實(shí)例化過,DelegatingRequestProcessor將請(qǐng)求轉(zhuǎn)發(fā)給Spring容器中的同名Bean。這種轉(zhuǎn)發(fā)的時(shí)機(jī)非常早,避免了創(chuàng)建struts-config.xml配置文件中的Action,因而性能非常好。

    圖6.3是采用這種整合策略的執(zhí)行效果。

    6.4.4 使用DelegatingActionProxy

    使用DelegatingRequestProcessor簡(jiǎn)單方便,但有一個(gè)缺點(diǎn),RequestProcessor是Struts的一個(gè)擴(kuò)展點(diǎn),也許應(yīng)用程序本身就需要擴(kuò)展RequestProcessor,而DelegatingRequest- Processor已經(jīng)使用了這個(gè)擴(kuò)展點(diǎn)。

    為了重新利用Struts的RequestProcessor這個(gè)擴(kuò)展點(diǎn),有兩個(gè)做法:

    ?? ● 應(yīng)用程序的RequestProcessor不再繼承Struts的RequestProcessor,改為繼承DelegatingRequestProcessor。

    ?? ● 使用DelegatingActionProxy。

    前者常常有一些未知的風(fēng)險(xiǎn),而后者是Spring推薦的整合策略。使用Delegating- ActionProxy與DelegatingRequestProcessor的目的都只有一個(gè),將請(qǐng)求轉(zhuǎn)發(fā)給Spring管理的Bean。

    DelegatingRequestProcessor直接替換了原有的RequestProcessor,在請(qǐng)求轉(zhuǎn)發(fā)給action之前,轉(zhuǎn)發(fā)給Spring管理的Bean;而DelegatingActionProxy則被配置成Struts的Action,即所有的請(qǐng)求先被ActionServlet截獲,請(qǐng)求被轉(zhuǎn)發(fā)到對(duì)應(yīng)的Action,而action的實(shí)現(xiàn)類全都是DelegatingActionProxy,DelegatingActionProxy再將請(qǐng)求轉(zhuǎn)發(fā)給Spring容器的Action。

    可以看出,使用DelegatingActionProxy比使用DelegatingRequestProcessor要晚一步轉(zhuǎn)發(fā)到Spring的context。但通過這種方式可以避免占用擴(kuò)展點(diǎn)。

    與使用DelegatingRequestProcessor相比,使用DelegatingActionProxy僅需要去掉controller配置元素,并將所有的action實(shí)現(xiàn)類改為DelegatingActionProxy即可。詳細(xì)的配置文件如下:

    <!-- XML文件的版本和編碼集 -->

    <?xml version="1.0" encoding="gb2312"?>

    <!-- struts配置文件的文件頭,包括DTD等信息 -->

    <!DOCTYPE struts-config PUBLIC

    ????????? "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"

    ????????? "http://struts.apache.org/dtds/struts-config_1_2.dtd">

    <!-- struts配置文件的根元素 -->

    <struts-config>

    ??? <!-- 配置formbean,所有的formbean都放在form-beans元素里定義 -->

    ??? <form-beans>

    ??????? <!-- 定義了一個(gè)formbean,確定formbean名和實(shí)現(xiàn)類 -->

    ??????? <form-bean name="loginForm" type="lee.LoginForm"/>

    ??? </form-beans>

    ??? <!-- 定義action部分,所有的action都放在action-mapping元素里定義 -->

    ??? <action-mappings>

    ??????? <!-- 這里只定義了一個(gè)action。必須配置action的type元素為
    ??? ??? DelegatingActionProxy -->

    ??????? <action path="/login" type="org.springframework.web.struts.
    ??????? DelegatingActionProxy"

    ??????????? name="loginForm" scope="request" validate="true" input=
    ??????????? "/login.jsp" >

    ??????????? <!-- 定義action內(nèi)的兩個(gè)局部forward元素 -->

    ??????????? <forward name="input" path="/login.jsp"/>

    ??????????? <forward name="welcome" path="/welcome.html"/>

    ??????? </action>

    ??? </action-mappings>

    ??? <!-- 加載國(guó)際化的資源包 -->

    ??? <message-resources parameter="mess"/>

    ??? <!-- 裝載驗(yàn)證的資源文件 -->

    ??? <plug-in className="org.apache.struts.validator.ValidatorPlugIn">

    ??????? <set-property property="pathnames" value="/WEB-INF/validator-
    ??????? rules.xml,/WEB-INF/validation.xml" />

    ??????? <set-property property="stopOnFirstError" value="true"/>

    ??? </plug-in>

    ??? <!-- 裝載Spring配置文件,隨應(yīng)用啟動(dòng)創(chuàng)建ApplicationContext實(shí)例 -->

    ??? <plug-in className="org.springframework.web.struts. ContextLoaderPlugIn">
    ??????? <set-property property="contextConfigLocation"

    ??????????? value="/WEB-INF/applicationContext.xml,

    ?????????????????? /WEB-INF/action-servlet.xml"/>

    ??? </plug-in>

    </struts-config>

    DelegatingActionProxy接收ActionServlet轉(zhuǎn)發(fā)過來的請(qǐng)求,然后轉(zhuǎn)發(fā)給Application- Context管理的Bean,這是典型的鏈?zhǔn)教幚怼?/p>

    通過配置文件可以看出,struts-config.xml文件中配置了大量DelegatingActionProxy實(shí)例,Spring容器中也配置了同名的Action。即Struts的業(yè)務(wù)控制器分成了兩個(gè)部分:第一個(gè)部分是Spring的DelegatingActionProxy,這個(gè)部分沒有實(shí)際意義,僅僅完成轉(zhuǎn)發(fā);第二個(gè)部分是用戶的Action實(shí)現(xiàn)類,該實(shí)現(xiàn)類負(fù)責(zé)真實(shí)的處理。

    這種策略的性能比前一種策略的效果要差一些,因?yàn)樾枰鄤?chuàng)建一個(gè)Delegating- ActionProxy實(shí)例。而且,J2EE應(yīng)用中Action非常多,這將導(dǎo)致大量創(chuàng)建DelegatingActionProxy實(shí)例,使用一次之后,等待垃圾回收機(jī)制回收——這對(duì)性能的影響不可避免。

    圖6.4是DelegatingActionProxy的執(zhí)行效果。

    文本框:圖6.4  DelegatingActionProxy整合策略的登錄成功效果注意:使用DelegatingActionProxy的整合策略,可避免占用Struts的RequestProcessor擴(kuò)展點(diǎn),但降低了整合性能。

    6.4.5 使用ActionSupport代替Action

    前面已經(jīng)介紹了,Spring與Struts的整合還有一種策略,讓Struts的Action顯式獲取Spring容器中的Bean。在這種策略下,Struts的Action不接受IoC容器管理,Action的代碼與Spring API部分耦合,造成代碼污染。這種策略也有其好處:代碼的可讀性非常強(qiáng),Action的代碼中顯式調(diào)用業(yè)務(wù)邏輯組件,而無(wú)須等待容器注入。

    Action中訪問ApplicationContext有兩種方法:

    ?? ● 利用WebApplicationContextUtils工具類。

    ?? ● 利用ActionSupport支持類。

    通過WebApplicationContextUtils,可以顯式獲得Spring容器的引用(請(qǐng)參閱6.4.1節(jié)的內(nèi)容),而ActionSupport類則提供了一個(gè)更簡(jiǎn)單的方法getWebApplicationContext(),該方法可直接獲取Spring容器的引用。

    所謂ActionSupport類,是指Spring提供了系列擴(kuò)展。Spring擴(kuò)展了Struts的Action,在Struts的Action后加上Support后綴,Spring擴(kuò)展的Action有如下幾個(gè):

    ?? ● ActionSupport。

    ?? ● DispatchActionSupport。

    ?? ● LookupDispatchActionSupport。

    ?? ● MappingDispatchActionSupport。

    下面的示例將展示這種整合策略,在這種整合策略下,Struts的Action改為繼承Spring擴(kuò)展后的Action,下面是應(yīng)用的Action代碼:

    //新的業(yè)務(wù)控制器,繼承Spring的ActionSupport類

    public class LoginAction extends ActionSupport

    {

    ??? //依然將ValidBean作為成員變量

    ??? private ValidBean vb;

    ??? //構(gòu)造器,注意:不可在構(gòu)造器中調(diào)用getWebApplicationContext()方法

    ??? public LoginAction()

    ??? {

    ??? }

    ??? //完成ValidBean的初始化

    ??? public ValidBean getVb()

    ??? {

    ??????? return(ValidBean)getWebApplicationContext().getBean("vb");

    ??? }

    ??? //必須重寫該核心方法,該方法actionForm將表單的請(qǐng)求參數(shù)封裝成值對(duì)象

    ??? public ActionForward execute(ActionMapping mapping, ActionForm form,

    ?????? HttpServletRequest request, HttpServletResponse response)throws
    ?????? Exception

    ??? {

    ??????? //form由ActionServlet轉(zhuǎn)發(fā)請(qǐng)求時(shí)創(chuàng)建,封裝了所有的請(qǐng)求參數(shù)

    ??????? LoginForm loginForm = (LoginForm)form;

    ??????? //獲取username請(qǐng)求參數(shù)

    ??????? String username = loginForm.getUsername();

    ??????? //獲取pass請(qǐng)求參數(shù)

    ??????? String pass = loginForm.getPass();

    ??????? //下面為服務(wù)器端的數(shù)據(jù)校驗(yàn)

    ??????? String errMsg = "";

    ??????? //判斷用戶名不能為空

    ??????? if (username == null || username.equals(""))

    ??????? {

    ??????????? errMsg += "您的用戶名丟失或沒有輸入,請(qǐng)重新輸入";

    ??????? }

    ??????? //判斷密碼不能為空

    ??????? else if(pass == null || pass.equals(""))

    ??????? {

    ??????????? errMsg += "您的密碼丟失或沒有輸入,請(qǐng)重新輸入";

    ??????? }

    ??????? //如果用戶名和密碼不為空,才調(diào)用業(yè)務(wù)邏輯組件

    ??????? else

    ??????? {

    ??????????? //vb是業(yè)務(wù)邏輯組件,通過上面的初始化方法獲得

    ??????????? if (getVb().valid(username,pass))

    ??????????? {

    ??????????????? return mapping.findForward("welcome");

    ??????????? }

    ??????????? else

    ??????????? {

    ??????????????? errMsg = "您的用戶名和密碼不匹配";

    ??????????? }

    ??????? }

    ??????? //判斷是否生成了錯(cuò)誤信息

    ??????? if (errMsg != null && !errMsg.equals(""))

    ??????? {

    ??????????? //如果有錯(cuò)誤信息,將錯(cuò)誤信息保存在request里,并跳轉(zhuǎn)到input對(duì)應(yīng)的
    ??????????? //forward對(duì)象

    ??????????? request.setAttribute("err" , errMsg);

    ??????????? return mapping.findForward("input");

    ??????? }

    ??????? else

    ??????? {

    ??????????? //如果沒有錯(cuò)誤信息,跳轉(zhuǎn)到welcome對(duì)應(yīng)的forward對(duì)象

    ??????????? return mapping.findForward("welcome");

    ??????? }

    ??? }

    }

    在上面的Action代碼中,Action顯式獲取容器中的業(yè)務(wù)邏輯組件,而不是依靠Spring容器的依賴注入。在這種整合策略下,表現(xiàn)層的控制器組件不再接受IoC容器管理。因此,沒有控制器上下文,應(yīng)將原有的action-servlet.xml文件刪除,并修改plug-in元素,不要加載該文件。還要修改Action配置,將Action配置的type元素修改成實(shí)際的處理類。這????? 種整合策略也有一個(gè)好處:代碼的可讀性更強(qiáng),對(duì)傳統(tǒng)Struts應(yīng)用開發(fā)的改變很小,容易使用。

    將該Action部署在struts-config.xml中,Struts將負(fù)責(zé)創(chuàng)建該Action。struts-config.xml文件的源代碼如下:

    <!-- XML文件的版本和編碼集 -->

    <?xml version="1.0" encoding="gb2312"?>

    <!-- Struts配置文件的文件頭,包括DTD等信息 -->

    <!DOCTYPE struts-config PUBLIC

    ????????? "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"

    ????????? "http://struts.apache.org/dtds/struts-config_1_2.dtd">

    <!-- struts配置文件的根元素 -->

    <struts-config>

    ??? <!-- 配置formbean,所有的formbean都放在form-beans元素里定義 -->

    ??? <form-beans>

    ??????? <!-- 定義了一個(gè)formbean,確定formbean名和實(shí)現(xiàn)類 -->

    ??????? <form-bean name="loginForm" type="lee.LoginForm"/>

    ??? </form-beans>

    ??? <!-- 定義action部分,所有的action都放在action-mapping元素里定義 -->

    ??? <action-mappings>

    ??????? <!-- 這里只定義了一個(gè)action。action的類型為ActionSupport的子類 -->

    ??????? <action path="/login" type="type="lee.LoginAction"

    ??????????? name="loginForm" scope="request" validate="true" input=
    ??????????? "/login.jsp" >

    ??????????? <!-- 定義action內(nèi)的兩個(gè)局部forward元素 -->

    ??????????? <forward name="input" path="/login.jsp"/>

    ??????????? <forward name="welcome" path="/welcome.html"/>

    ??????? </action>

    ??? </action-mappings>

    ??? <!-- 加載國(guó)際化的資源包 -->

    ??? <message-resources parameter="mess"/>

    ??? <!-- 裝載驗(yàn)證的資源文件 -->

    ??? <plug-in className="org.apache.struts.validator.ValidatorPlugIn">

    ??????? <set-property property="pathnames" value="/WEB-INF/validator-
    ??????? rules.xml,/WEB-INF/validation.xml" />

    ??????? <set-property property="stopOnFirstError" value="true"/>

    ??? </plug-in>

    </struts-config>

    此時(shí),Spring無(wú)須使用配置Action的配置文件,這種配置方式非常簡(jiǎn)單。只需要業(yè)務(wù)邏輯組件的配置文件,業(yè)務(wù)邏輯組件的配置文件與前面的示例沒有任何改變。

    該配置文件中的業(yè)務(wù)邏輯組件由Spring容器負(fù)責(zé)實(shí)現(xiàn),而ActionSupport能夠先定位Spring容器,然后獲得容器的業(yè)務(wù)邏輯組件。

    這種整合策略的執(zhí)行效果與前面兩種整合策略的執(zhí)行效果完全相同。從代碼中分析可見,在這種整合策略下,業(yè)務(wù)控制器再次退回到Struts起初的設(shè)計(jì)。僅由strutsconfig.xml中Action充當(dāng),從而避免了像DelegatingActionProxy整合策略的性能低下,因?yàn)榭梢灾恍枰獎(jiǎng)?chuàng)建實(shí)際的Action實(shí)例。

    注意:在這種整合策略下,Struts開發(fā)者的改變最小,最接近傳統(tǒng)Struts應(yīng)用開發(fā)者的習(xí)慣。但這種整合策略會(huì)造成代碼污染,因?yàn)锳ction類必須繼承Spring的ActionSupport類。

    posted on 2009-07-19 10:23 jadmin 閱讀(74) 評(píng)論(0)  編輯  收藏

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产羞羞的视频在线观看免费| 亚洲精品高清在线| 男女拍拍拍免费视频网站| 亚洲熟妇AV一区二区三区浪潮| 亚洲av永久无码精品表情包| www国产亚洲精品久久久| 免费无码黄十八禁网站在线观看| 无码国产精品一区二区免费3p| 免费看黄网站在线看| 亚洲精品精华液一区二区 | 亚洲AV噜噜一区二区三区| 久久亚洲AV成人无码电影| 国产成人亚洲精品91专区手机| 日韩免费电影在线观看| 在线观看日本免费a∨视频| 毛片无码免费无码播放| 两个人看的www免费视频| 四虎一区二区成人免费影院网址| 亚洲日本在线电影| 亚洲午夜国产精品| 亚洲av不卡一区二区三区| 国产亚洲一区二区三区在线| 亚洲一区精品伊人久久伊人| 免费午夜爽爽爽WWW视频十八禁| 在线免费观看毛片网站| 91网站免费观看| 日本妇人成熟免费中文字幕| 久久精品无码专区免费青青| 免费无码成人AV在线播放不卡 | 免费观看四虎精品国产永久| 午夜寂寞在线一级观看免费| 成人毛片免费观看视频大全| 成年女人男人免费视频播放| 中文字幕av无码无卡免费| 国产精品成人免费一区二区| 日韩精品成人无码专区免费| 岛国片在线免费观看| 成人人免费夜夜视频观看| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲第一福利视频| 337p欧洲亚洲大胆艺术|