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

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

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

    ∪∩deniable Design

    個人JAVA版GAE(google app engine),struts2+jpa+jQuery開發(fā),互相交流 http://iunbug.appspot.com/

    struts2.0學習筆記(三)--Action

    Posted on 2008-08-22 22:05 ∪∩BUG 閱讀(1274) 評論(5)  編輯  收藏 所屬分類: Struts2學習筆記
    Struts 2.0 筆記
    2008 08 21

    一.標準Action的編寫
        1.將action描述為ActionSupport的子類,用于實現(xiàn)execut的缺省方法
        2.自定義Action的返回值(默認仍使用的返回值是:SUCCESS,ERROR,INPUT,LOGIN,NONE),
            (1)重新編寫映射路徑
            (2)以http訪問地址的區(qū)別Action的使用方法
    二.Action獲取頁面提交信息(兩種方法)
        1.將頁面的提交信息直接封裝在Action的控制器中
        2.便用標準的POJO類進行頁面數(shù)據(jù)的封裝.(必須有無參的構造方法,否則無法生成action實例)[推薦]
    三.獲取Servlet API中的一些對象
        1.非IoC方式
        (1)HttpServletRequest request = ServletActionContext.getRequest();
        (2)Http response = ServletActionContext.getResponse();
        (3)HttpSession session = ServletActionContext.getSession()
        2.IoC方法(使用ActionContext對象獲取Servlet API對象)
            使用接口:
            (1)SessionAware
            (2)ServletRequestAware
            (3)ServletResponseAware

    src/struts.xml
     1<?xml version="1.0" encoding="GBK"?>
     2<!DOCTYPE struts PUBLIC
     3         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
     4         "http://struts.apache.org/dtds/struts-2.0.dtd">
     5<struts>
     6    <include file="struts-default.xml" /><!-- 使用缺省的struts的配置文件 -->
     7
     8    <!-- 包空間 ActionDemo 繼承 struts-default -->
     9    <package name="ActionDemo" extends="struts-default">
    10
    11        <!-- 映射名name="HelloAction" ,使用com.Action.HelloAction來實現(xiàn) -->
    12        <action name="HelloAction" class="com.Action.HelloAction">
    13            <result>/HelloAction.jsp</result><!-- 轉到的頁面為HelloAction.jsp-->
    14        </action>
    15
    16        <!--
    17            1. method="aliasAction"對應 HelloAction.java 中的aliasAction()方法
    18            2.訪問AliasHelloWord Action方法:在地址欄中輸入:
    19            (1)http://localhost:8080/Action/aliasAction.action
    20            (2)http://localhost:8080/Action/HelloAction!aliasAction.action
    21        -->
    22        <action name="AliasHelloWord" class="com.Action.HelloAction"
    23            method="aliasAction">
    24            <result>/HelloAction.jsp</result>
    25        </action>
    26
    27        <!-- 映射名name="Login" 與 Login.jsp 中的 action="Login" 對應,使用com.Action.LoginAction來實現(xiàn) -->
    28        <action name="Login" class="com.Action.LoginAction">
    29            <result>/Hello.jsp</result>
    30        </action>
    31
    32        <!-- 映射名name="Loginx" 與 Loginx.jsp 中的 action="Login" 對應,使用com.Action.LoginActionx來實現(xiàn) -->
    33        <action name="Loginx" class="com.Action.LoginActionx">
    34            <result>/Hello.jsp</result>
    35        </action>
    36    </package>
    37</struts>
    38
    39

    WebRoot/WEB-INF/web.xml
     1<?xml version="1.0" encoding="UTF-8"?>
     2<web-app id="WebApp_ID" version="2.4"
     3    xmlns="http://java.sun.com/xml/ns/j2ee"
     4    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     5    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
     6    <display-name>Struts2Hello</display-name>
     7    <filter>
     8        <filter-name>struts2</filter-name>
     9        <filter-class>
    10            org.apache.struts2.dispatcher.FilterDispatcher
    11        </filter-class><!-- 以過慮器的形式出現(xiàn) -->
    12    </filter>
    13    <filter-mapping>
    14        <filter-name>struts2</filter-name>
    15        <url-pattern>/*</url-pattern><!-- 過慮所有內容 -->
    16    </filter-mapping>
    17    <welcome-file-list>
    18        <welcome-file>index.html</welcome-file>
    19        <welcome-file>index.htm</welcome-file>
    20        <welcome-file>index.jsp</welcome-file>
    21        <welcome-file>default.html</welcome-file>
    22        <welcome-file>default.htm</welcome-file>
    23        <welcome-file>default.jsp</welcome-file>
    24    </welcome-file-list>
    25</web-app>
    26

    WebRoot/Hello.jsp
     1<%@page contentType="text/html;charset=GBK"%>
     2<%@taglib prefix="s" uri="/struts-tags"%>
     3<html>
     4    <head>
     5        <title>HelloAction</title>
     6    </head>
     7    <body>
     8
     9        <h2>
    10            <s:property value="msg" />
    11        </h2>
    12        ${test}<br>
    13        ${nameA}<br>
    14        ${nameB}<br>
    15    </body>
    16</html>

    WebRoot/HelloAction.jsp
     1<%@page contentType="text/html;charset=GBK"%>
     2<%@taglib prefix="s" uri="/struts-tags"%>
     3<html>
     4    <head>
     5        <title>HelloAction</title>
     6    </head>
     7    <body>
     8
     9        <h2>
    10            <s:property value="message" />
    11        </h2>
    12    </body>
    13</html>

    WebRoot/Login.jsp
     1<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
     2<%
     3String path = request.getContextPath();
     4String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     5
    %>
     6<%@taglib prefix="s" uri="/struts-tags"%>
     7
     8<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     9<html>
    10  <head>
    11
    12    <title>Login page</title>
    13  </head>
    14  
    15  <body>
    16    <s:form action="Login" method="POST">
    17    <s:textfield name="name" label="User name"/>
    18    <s:password name="pass" label="Password"/>
    19    <s:submit value="Submit"></s:submit>
    20    </s:form>
    21  </body>
    22</html>
    23

    WebRoot/Loginx.jsp
     1<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
     2<%
     3    String path = request.getContextPath();
     4    String basePath = request.getScheme() + "://"
     5            + request.getServerName() + ":" + request.getServerPort()
     6            + path + "/";
     7
    %>
     8<%@taglib prefix="s" uri="/struts-tags"%>
     9
    10<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    11<html>
    12    <head>
    13
    14        <title>Login page</title>
    15    </head>
    16
    17    <body>
    18        <!-- action="Loginx"中與struts.xml中映射名name="Loginx"相同, name="user.name"表示使用com.Action.LoginActionx類的user對象的name屬性-->
    19        <s:form action="Loginx" method="POST">
    20            <s:textfield name="user.name" label="User name" />
    21            <s:password name="user.pass" label="Password" />
    22            <s:submit value="Submit"></s:submit>
    23        </s:form>
    24    </body>
    25</html>
    26

    src/com.Action/HelloAction.java
     1package com.Action;
     2
     3import java.text.DateFormat;
     4import java.util.Date;
     5
     6import com.opensymphony.xwork2.ActionSupport;
     7
     8/**
     9 * @author ∪∩BUG E-mail: tidelgl@163.com
    10 * @version Aug 20, 2008 1:45:28 PM 類說明
    11 */

    12@SuppressWarnings("serial")
    13public class HelloAction extends ActionSupport {
    14
    15    private String message;
    16
    17    // getMessage()方法對應的是頁面的顯示
    18    public String getMessage()
    19    {
    20        return message;
    21    }

    22    
    23    //缺省的方法,將被默認執(zhí)行
    24    public String execute(){
    25        
    26        message = "HelloAction, Now is" + DateFormat.getInstance().format(new Date());
    27        
    28        //SUCCESS返回的是String類型,
    29        System.out.println(SUCCESS);
    30        return SUCCESS;
    31    }

    32    
    33    //自定義的業(yè)務方法
    34    public String aliasAction(){
    35        message ="自定義的Action方法";
    36        return SUCCESS;
    37    }

    38}

    39

    src/com.Action/LoginAction.java
     1package com.Action;
     2
     3import com.opensymphony.xwork2.ActionSupport;
     4
     5/**
     6 * @author ∪∩BUG E-mail: tidelgl@163.com
     7 * @version Aug 21, 2008 11:31:00 PM 類說明
     8 */

     9public class LoginAction extends ActionSupport {
    10    @Override
    11    public String execute() throws Exception {
    12        if("admin".equals(this.name)&"123".equals(this.pass)){
    13            this.msg="歡迎" + this.name;
    14    
    15        }

    16        else {
    17            this.msg="非法輸入!";
    18        }
        
    19        return SUCCESS;
    20    }

    21
    22    private String name;
    23    private String pass;
    24    private String msg;
    25
    26    // 默認構造方法是必須的.否則無法生成action實例
    27    public LoginAction() {
    28
    29    }

    30
    31    public LoginAction(String name, String pass, String msg) {
    32        super();
    33        this.name = name;
    34        this.pass = pass;
    35        this.msg = msg;
    36    }

    37
    38    public String getName() {
    39        return name;
    40    }

    41
    42    public void setName(String name) {
    43        this.name = name;
    44    }

    45
    46    public String getPass() {
    47        return pass;
    48    }

    49
    50    public void setPass(String pass) {
    51        this.pass = pass;
    52    }

    53
    54    public String getMsg() {
    55        return msg;
    56    }

    57
    58    public void setMsg(String msg) {
    59        this.msg = msg;
    60    }

    61
    62}

    63

    src/com.Action/LoginActionx.java
     1package com.Action;
     2
     3import java.util.Map;
     4
     5import javax.servlet.http.HttpServletRequest;
     6import javax.servlet.http.HttpServletResponse;
     7
     8import org.apache.struts2.interceptor.ServletRequestAware;
     9import org.apache.struts2.interceptor.ServletResponseAware;
    10import org.apache.struts2.interceptor.SessionAware;
    11
    12import com.opensymphony.xwork2.ActionContext;
    13import com.opensymphony.xwork2.ActionSupport;
    14import com.pojo.User;
    15
    16/**
    17 * @author ∪∩BUG E-mail: tidelgl@163.com
    18 * @version Aug 21, 2008 11:31:00 PM 類說明
    19 */

    20
    21//IoC方法獲取Servlet API(implements是一個類實現(xiàn)一個接口用的關鍵字, 他是用來實現(xiàn)接口中定義的抽象方法)
    22public class LoginActionx extends ActionSupport implements ServletRequestAware,ServletResponseAware,SessionAware{
    23    private String msg;
    24    private User user;
    25    private HttpServletRequest request;
    26    private HttpServletResponse response;
    27    private Map session;
    28    
    29    @Override
    30    public String execute() throws Exception {
    31        if("admin".equals(user.getName())&"123".equals(user.getPass())){
    32            this.msg="歡迎" + user.getName()+"對象化的提交";
    33    
    34        }

    35        else {
    36            this.msg="非法輸入!";
    37        }
        
    38        //ServletActionContext.getRequest().setAttribute("test","Just Test!" );//非IoC方法獲取Servlet API
    39        
    40        //獲取session
    41        Map map = ActionContext.getContext().getSession();
    42        map.put("nameA""name1");
    43        session.put("nameB""name2");
    44        
    45        
    46        return SUCCESS;
    47    }

    48
    49    // 默認構造方法是必須的.否則無法生成action實例
    50    public LoginActionx() {
    51
    52    }

    53
    54    public String getMsg() {
    55        return msg;
    56    }

    57
    58    public void setMsg(String msg) {
    59        this.msg = msg;
    60    }

    61
    62    public User getUser() {
    63        return user;
    64    }

    65
    66    public void setUser(User user) {
    67        this.user = user;
    68    }

    69
    70    //IoC方法獲取Servlet API
    71    //實現(xiàn)接口中定義的抽象方法setServletRequest(HttpServletRequest arg0)
    72    public void setServletRequest(HttpServletRequest request) {
    73        this.request=request;
    74        request.setAttribute("test","Just Test!" );
    75        
    76    }

    77
    78    //實現(xiàn)接口中定義的抽象方法setServletResponse(HttpServletResponse arg0)
    79    public void setServletResponse(HttpServletResponse response) {
    80        this.response=response;
    81        
    82    }

    83    
    84    //實現(xiàn)接口中定義的抽象方法setSession(Map arg0)
    85    public void setSession(Map e) {
    86        this.session=e;
    87        
    88    }

    89
    90
    91}

    92

    src/com.pojo/User.java
     1package com.pojo;
     2
     3import java.io.Serializable;
     4
     5/**
     6 * @author ∪∩BUG E-mail: tidelgl@163.com
     7 * @version Aug 22, 2008 11:01:56 AM 類說明
     8 */

     9public class User implements Serializable {
    10    private String name;
    11    private String pass;
    12
    13    public User(String name, String pass) {
    14        super();
    15        this.name = name;
    16        this.pass = pass;
    17    }

    18
    19    public User() {
    20
    21    }

    22
    23    public String getName() {
    24        return name;
    25    }

    26
    27    public void setName(String name) {
    28        this.name = name;
    29    }

    30
    31    public String getPass() {
    32        return pass;
    33    }

    34
    35    public void setPass(String pass) {
    36        this.pass = pass;
    37    }

    38}

    39

    評論

    # re: struts2.0學習筆記(三)--Action  回復  更多評論   

    2008-08-22 22:08 by ∪∩BUG
    Action有些難學,筆記有些難寫.萬事開頭難,萬事開頭難.

    # re: struts2.0學習筆記(三)--Action  回復  更多評論   

    2008-09-02 10:33 by
    老大,能講講struts.xml
    中package是干啥使 的嗎,一直沒想通

    # re: struts2.0學習筆記(三)--Action  回復  更多評論   

    2008-09-02 11:35 by ∪∩BUG

    這個其實你學習了XML會好理解些的,這里我給你找了篇有例子的文章:


    Struts2中struts.xml的Action配置詳解
            使用package可以將邏輯上相關的一組Action,Result,Interceptor等組件分為一組,Package有些像對象,可以繼承其他的Package,也可以被其他package繼承,甚至可以定義抽象的Package。

    Package的可以使用的屬性:

    屬性

    是否必須

    說明

    name Package的表示,為了讓其他的package引用
    extends 從哪個package繼承行為
    namespace 參考Namespace配置說明
    abstract
    定義這個package為抽象的,這個package中不需要定義action


        由于struts.xml文件是自上而下解析的,所以被繼承的package要放在繼承package的前邊。Namespace將action分成邏輯上的不同模塊,每一個模塊有自己獨立的前綴。使用namespace可以有效的避免action重名的沖突,例如每一個package都可以有自己獨立的Menu和Help action,但是事項方式各有不同。Struts2標簽帶有namespace選項,可以根據(jù)namespace的不同向服務器提交不同的package的action的請求。
           “/”表示根namespace,所有直接在應用程序上下文環(huán)境下的請求(Context)都在這個package中查找。
           “”表示默認namespace,當所有的namespace中都找不到的時候就在這個namespace中尋找。

           例如,有如下配置:
    CODE:
    <package name="default">
         <action name="foo" class="mypackage.simpleAction>
                  <result name="success" type="dispatcher">
                          greeting.jsp
                  </result>
        </action>
        <action name="bar" class="mypackage.simpleAction">
           <result name="success" type="dispatcher">bar1.jsp</result>
        </action>
    </package>

    <package name="mypackage1" namespace="/">
        <action name="moo" class="mypackage.simpleAction">
            <result name="success" type="dispatcher">moo.jsp</result>
        </action>
    </package>

    <package name="mypackage2" namespace="/barspace">
        <action name="bar" class="mypackage.simpleAction">
           <result name="success" type="dispatcher">bar2.jsp</result>
        </action>
    </package>1 如果請求為/barspace/bar.action
    查找namespace:/barspace,如果找到bar則執(zhí)行對應的action,否則將會查找默認的namespace,在上面的例子中,在barspace中存在名字為bar的action,所以這個action將會被執(zhí)行,如果返回結果為success,則畫面將定為到bar2.jsp

    2 如果請求為/moo.action
    根namespace('/')被查找,如果moo action存在則執(zhí)行,否則查詢默認的namespace,上面的例子中,根namespace中存在moo action,所以該action被調用,返回success的情況下畫面將定位到moo.jsp、

    Action配置

          在struts2框架中每一個Action是一個工作單元。Action負責將一個請求對應到一個Action處理上去,每當一個Action類匹配一個請求的時候,這個Action類就會被Struts2框架調用。

          一個Action配置示例:
    CODE:
    <action name="Logon" class="tutorial.Logon">
      <result type="redirect-action">Menu</result>
      <result name="input">/tutorial/Logon.jsp</result>
    </action>每一個Action可以配置多個result,多個ExceptionHandler,多個Intercepter,但是只能有一個name,這個name和package的namespace來唯一區(qū)別一個Action。

          每當struts2框架接受到一個請求的時候,它會去掉Host,Application和后綴等信息,得到Action的名字,例如如下的請求將得到Welcome這個Action。 http://www.planetstruts.org/struts2-mailreader/Welcome.action

          在一個Struts2應用程序中,一個指向Action的鏈接通常有Struts Tag產(chǎn)生,這個Tag只需要指定Action的名字,Struts框架會自動添加諸如后綴等的擴展,例如:
    CODE:
    <s:form action="Hello">
        <s:textfield label="Please enter your name" name="name"/>
        <s:submit/>
    </s:form將產(chǎn)生一個如下的鏈接的請求:
    http://Hostname:post/appname/Hello.action
    在定義Action的名字的時候不要使用.和/,最好使用英文字母和下劃線。

    Action中的方法

    Action的默認入口方法由xwork2的Action接口來定義,代碼清單為:
    CODE:
    public interface Action {

        public String execute() throws Exception;

    }有些時候我們想指定一個Action的多個方法,我們可以做如下兩步:
    1  建立一些execute簽名相同的方法,例如:
    Public String forward() throws Exception

    2  在Action配置的時候使用method屬性,例如:
    <action name="delete" class="example.CrudAction" method="delete">

    Action中的方法通配符

        有些時候對Action中方法的調用滿足一定的規(guī)律,例如edit Action對應edit方法,delete Action對應 delete方法,這個時候我們可以使用方法通配符,例如:
    <action name="*Crud" class="example.Crud" method="{1}"> 這時,editCrud Action的引用將調用edit方法,同理,deleteCrud Action的引用將調用delete 方法。

        另外一種比較常用的方式是使用下劃線分割,例如:
    <action name="Crud_*" class="example.Crud" method="{1}">
    這樣當遇到如下調用的時候可以找到對應的方法。
    "action=Crud_input"  =>  input方法
    "action=Crud_delete" =>  delete方法

    通配符和普通的配置具有相同的地位,可以結合使用框架的所有其他功能。

    默認的Action

    當我們沒有指定Action的class屬性的時候,例如:
    <action name="Hello">
    我們默認使用com.opensymphony.xwork.ActionSupport
    ActionSupport有兩個方法input和execute,每個方法都是簡單的返回SUCCESS。

    通常情況下,請求的Action不存在的情況下,Struts2框架會返回一個Error畫面:“404 - Page not found”,有些時候或許我們不想出現(xiàn)一個控制之外的錯誤畫面,我們可以指定一個默認的Action,在請求的Action不存在的情況下,調用默認的Action,通過如下配置可以達到要求:
    CODE:
    <package name="Hello" extends="action-default">
    <default-action-ref name="UnderConstruction">
    <action name="UnderConstruction">
      <result>/UnderConstruction.jsp</result>
    </action>默認通配符
    CODE:
    <action name="*" >
      <result>/{1}.jsp</result>
    </action>每個Action將會被映射到以自己名字命名的JSP上。

    struts2中動態(tài)方法的調用

    可以采用DMI(Dynamic Method Invocation,動態(tài)方法)調用來處理這種請求,動態(tài)方法調用是指表單元素的action并不是直接等于某個Action的名字,而是以如下形式來指定Form的action屬性:
     1<!-- action屬性為actionName!methodName的形式 --> 
     2action="ActionName!methodName.action"
     3 
     4<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
     5<struts>
     6<!--include節(jié)點是struts2中組件化的方式 可以將每個功能模塊獨立到一個xml配置文件中 然后用include節(jié)點引用 -->
     7<include file="struts-default.xml"></include>
     8<!--package提供了將多個Action組織為一個模塊的方式
     9        package的名字必須是唯一的 package可以擴展 當一個package擴展自
    10        另一個package時該package會在本身配置的基礎上加入擴展的package
    11        的配置 父package必須在子package前配置 
    12        name:package名稱
    13        extends:繼承的父package名稱
    14        abstract:設置package的屬性為抽象的 抽象的package不能定義action 值true:false
    15        namespace:定義package命名空間 該命名空間影響到url的地址,例如此命名空間為/test那么訪問是的地址為http://localhost:8080/struts2/test/XX.action
    16     -->
    17<package name="com.kay.struts2"extends="struts-default"namespace="/test">
    18<interceptors>
    19<!--定義攔截器 
    20                name:攔截器名稱
    21                class:攔截器類路徑
    22             -->
    23<interceptor name="timer"class="com.kay.timer"></interceptor>
    24<interceptor name="logger"class="com.kay.logger"></interceptor>
    25<!--定義攔截器棧 -->
    26<interceptor-stack name="mystack">
    27<interceptor-ref name="timer"></interceptor-ref>
    28<interceptor-ref name="logger"></interceptor-ref>
    29</interceptor-stack>
    30</interceptors>
    31<!--定義默認的攔截器 每個Action都會自動引用
    32         如果Action中引用了其它的攔截器 默認的攔截器將無效 -->
    33<default-interceptor-ref name="mystack"></default-interceptor-ref>
    34<!--全局results配置 -->
    35<global-results>
    36<result name="input">/error.jsp</result>
    37</global-results>
    38<!--Action配置 一個Action可以被多次映射(只要action配置中的name不同)
    39             name:action名稱
    40             class: 對應的類的路徑
    41             method: 調用Action中的方法名
    42        -->
    43<action name="hello"class="com.kay.struts2.Action.LoginAction">
    44<!--引用攔截器
    45                name:攔截器名稱或攔截器棧名稱
    46             -->
    47<interceptor-ref name="timer"></interceptor-ref>
    48<!--節(jié)點配置
    49                name : result名稱 和Action中返回的值相同
    50                type : result類型 不寫則選用superpackage的type struts-default.xml中的默認為dispatcher
    51             -->
    52<result name="success"type="dispatcher">/talk.jsp</result>
    53<!--參數(shù)設置 
    54             name:對應Action中的get/set方法 
    55         -->
    56<param name="url">http://www.sina.com</param>
    57</action>
    58</package>
    59</struts>

    # re: struts2.0學習筆記(三)--Action  回復  更多評論   

    2008-09-03 11:25 by
    多謝博主,看來還得多實踐啊

    # re: struts2.0學習筆記(三)--Action  回復  更多評論   

    2008-09-05 16:34 by qin
    看來你挺歷害的!!
    主站蜘蛛池模板: 精品国产亚洲一区二区三区 | 美女被免费网站视频在线| 久久人午夜亚洲精品无码区| 免费国产黄网站在线看| 亚洲第一视频在线观看免费| 好久久免费视频高清| 五月婷婷在线免费观看| 精品免费国产一区二区| 亚洲一区AV无码少妇电影☆| 亚洲精品乱码久久久久久下载| 亚洲 欧洲 自拍 另类 校园| 免费播放美女一级毛片| 精品免费视在线观看| 91香蕉视频免费| 亚洲精品国精品久久99热| 亚洲第一中文字幕| 亚洲色少妇熟女11p| 抽搐一进一出gif免费视频| **实干一级毛片aa免费| 国产免费人成在线视频| 亚洲成AV人片一区二区密柚| 亚洲最大av资源站无码av网址| 一个人看的www视频免费在线观看| 久久久久国产精品免费免费不卡| 成年女人看片免费视频播放器| 亚洲国产中文v高清在线观看| 久久亚洲AV成人出白浆无码国产| 亚洲国产成人手机在线观看| 玖玖在线免费视频| 国产高清在线精品免费软件| 亚洲AV无码久久寂寞少妇| 亚洲精品无码av片| 久久免费观看国产精品| 在线观看国产情趣免费视频 | 亚洲国产无套无码av电影| 亚洲入口无毒网址你懂的| 国产男女爽爽爽免费视频| 一个人看www在线高清免费看| 在线A亚洲老鸭窝天堂| 亚洲精品伦理熟女国产一区二区| 久久青草国产免费观看|