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

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

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

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
    一、簡介
      Struts-Menu是一組從基于XML的配置文件中生成多種樣式的菜單的JSP Tags,并且可以結合API開發通過數據庫生成的動態菜單。Struts-Menu支持國際化和多種權限控制。

    二、運行環境
      Windows 2000 Professional
      JDK 1.4.2_03
      Eclipse 3.1
      Tomcat 5.0.28
      Tomcat Plugin 3.1Beta
      Struts 1.2.7
      Commons-Lang 2.1
      Commons-Collections 3.1
      Struts-Menu 2.3
      MySQL 4.1.10a-nt

    三、下載與安裝
      1:從http://java.sun.com下載J2SDK,當前1.4.x系列的最新版本為1.4.2_08
      2:從http://www.eclipse.org下載Eclipse,當前最新版本為3.1正式版
      3:從http://jakarta.apache.org/tomcat下載Tomcat,當前5.x系列的最新版本為5.0.28
      4:從http://www.sysdeo.com/eclipse/tomcatplugin下載Eclipse的Tomcat插件,對應Eclipse3.1x的最新版本為3.1Beta
      5:從http://struts.apache.org下載Struts,當前最新版本為1.2.7
      6:從http://jakarta.apache.org/commons/下載Commons-Lang,當前最新版本為2.1,下載Commons-Collections,當前最新版本為3.1
      7:從http://struts-menu.sourceforge.net下載Struts Menu,當前最新版本為2.3
      8:從http://www.mysql.com下載MySQL數據庫,4.x系列的最新版本是4.1.12a
      9:MySQL、JDK、Eclipse、Tomcat和TomcatPlugin的安裝及配置請參考相關資料

    四、運行示例程序
      1:安裝好Tomcat后,解壓縮struts-menu-2.3.zip,將struts-menu.war釋放到Tomcat安裝目錄下的webapps下,運行Tomcat
      2:在地址欄輸入http://localhost:8080/struts-menu

    五、安裝與配置
      1:在Eclipse中新建Tomcat項目,Context為/mymenu,Subdirectory為/web
      2:在項目目錄下面新建lib目錄和web目錄及WEB-INF,在web/WEB-INF目錄下新建web.xml,內容如下:


    <?xml version="1.0" encoding="ISO-8859-1"?>

    <!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd"
    >

    <web-app>
      
    <display-name>My Example Application -- Vinton Lee</display-name>
          
      
    <!-- ============= The Struts ActionServlet Configuration ============= -->
      
    <servlet>
        
    <servlet-name>action</servlet-name>
        
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        
    <init-param>
          
    <param-name>config</param-name>
          
    <param-value>/WEB-INF/struts-config.xml</param-value>
        
    </init-param>
        
    <load-on-startup>1</load-on-startup>
      
    </servlet>
      
    <!-- ================================================================== -->
        
      
    <!-- ============= The Struts Action Servlet Mapping ================== -->
      
    <servlet-mapping>
        
    <servlet-name>action</servlet-name>
        
    <url-pattern>*.do</url-pattern>
      
    </servlet-mapping>
      
    <!-- ================================================================== -->
      
      
    <!-- The Welcome File List -->
      
    <welcome-file-list>
        
    <welcome-file>index.jsp</welcome-file>
      
    </welcome-file-list>

      
    <!-- =============== The Struts Taglib Definition ===================== -->
      
    <taglib>
        
    <taglib-uri>struts-bean</taglib-uri>
        
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
      
    </taglib>
      
    <taglib>
        
    <taglib-uri>struts-html</taglib-uri>
        
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
      
    </taglib>
      
    <taglib>
        
    <taglib-uri>struts-logic</taglib-uri>
        
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
      
    </taglib>
      
    <taglib>
        
    <taglib-uri>struts-nested</taglib-uri>
        
    <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
      
    </taglib>
      
    <taglib>
        
    <taglib-uri>struts-tiles</taglib-uri>
        
    <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
      
    </taglib>
      
    <!-- ================================================================== -->
      
      
    <!-- ============= The Struts-Menu Taglib Definition ================== -->
      
    <taglib>
        
    <taglib-uri>struts-menu</taglib-uri>
        
    <taglib-location>/WEB-INF/struts-menu.tld</taglib-location>
      
    </taglib>
      
    <!-- ================================================================== -->
    </web-app>

    3:解壓縮struts-1.2.7.zip,將壓縮包中的lib目錄下所有的8個jar釋放到lib目錄中,將5個tld文件釋放到web\WEB-INF目錄中,在web\WEB-INF目錄中新建struts-config.xml,內容如下:

    <?xml version="1.0" encoding="ISO-8859-1" ?>

    <!DOCTYPE struts-config PUBLIC
              "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
              "http://struts.apache.org/dtds/struts-config_1_2.dtd"
    >

    <struts-config>

        
    <!-- ========== Data Source Configuration =============================== -->
        
    <data-sources />

        
    <!-- ========== Form Bean Definitions =================================== -->
        
    <form-beans />

        
    <!-- ========== Global Exception Definitions ============================ -->
        
    <global-exceptions />

        
    <!-- ========== Global Forward Definitions ============================== -->
        
    <global-forwards />

        
    <!-- ========== Action Mapping Definitions ============================== -->
        
    <action-mappings />

        
    <!-- ========== Controller Configuration ================================ -->

        
    <!-- ========== Message Resources Definitions =========================== -->
        
    <message-resources parameter="application" />

        
    <!-- ========== Plug Ins Configuration ================================== -->
        
    <plug-in className="net.sf.navigator.menu.MenuPlugIn">
          
    <set-property property="menuConfig" value="/WEB-INF/menu-config.xml"/>
        
    </plug-in>

    </struts-config>

    4:解壓縮struts-menu-2.3.zip,將壓縮包中的jstl-1.0.6.jar、standard-1.0.6.jar、struts-menu-2.3.jar釋放到lib目錄中,將壓縮包中的struts-menu.tld、struts-menu-el.tld釋放到web\WEB-INF目錄中,解壓縮commons-lang-2.1.zip,將commons-lang-2.1.jar解壓縮到lib目錄中,注意,在Struts-Menu的文檔中沒有看到需要這個包,但是沒有這個包卻無法成功加載。在web\WEB-INF目錄中新建menu-config.xml,內容如下:
    <?xml version="1.0" encoding="UTF-8" ?>

    <MenuConfig>

      
    <Displayers>
        
    <Displayer   name="DropDown"
                     type
    ="net.sf.navigator.displayer.DropDownMenuDisplayer"/>
        
    <Displayer   name="Simple"
                     type
    ="net.sf.navigator.displayer.SimpleMenuDisplayer"/>
        
    <Displayer   name="CoolMenu"
                     type
    ="net.sf.navigator.displayer.CoolMenuDisplayer"/>
        
    <Displayer   name="CoolMenu4"
                     type
    ="net.sf.navigator.displayer.CoolMenuDisplayer4"/>
        
    <Displayer   name="MenuForm"
                     type
    ="net.sf.navigator.example.PermissionsFormMenuDisplayer"/>
        
    <Displayer   name="ListMenu"
                     type
    ="net.sf.navigator.displayer.ListMenuDisplayer"/>
        
    <Displayer   name="TabbedMenu"
                     type
    ="net.sf.navigator.displayer.TabbedMenuDisplayer"/>
        
    <Displayer   name="Velocity"
                     type
    ="net.sf.navigator.displayer.VelocityMenuDisplayer"/>
      
    </Displayers>

      
    <Menus>
        
    <Menu  name="DoorSite"  title="DoorSite"  description="Some famous doorsite" width="50">
           
    <Item   name="Yahoo"   title="Yahoo">
               
    <Item   name="YahooIndex"   title="Yahoo Index"   location="http://www.yahoo.com.cn"/>
               
    <Item   name="YahooMail"    title="Yahoo Mail"    location="http://cn.mail.yahoo.com"/>
           
    </Item>
           
    <Item    name="Sohu"  title="Sohu"   location="http://www.sohu.com"/>
           
    <Item    name="Sina"  title="Sina"   location="http://www.sina.com.cn"/>
        
    </Menu>
      
    </Menus>

    </MenuConfig>

    5:將第四步的示例程序中的struts-menu應用目錄下的images、scripts、styles三個目錄中的內容復制到web目錄下

      6:你的目錄結構應該類似如下:

    %PROJECT_HOME%\classes
        %PROJECT_HOME%\lib
        %PROJECT_HOME%\lib\antlr.jar
        %PROJECT_HOME%\lib\commons-beanutils.jar
        %PROJECT_HOME%\lib\commons-digester.jar
        %PROJECT_HOME%\lib\commons-fileupload.jar
        %PROJECT_HOME%\lib\commons-lang-
    2.1.jar
        %PROJECT_HOME%\lib\commons-logging.jar
        %PROJECT_HOME%\lib\commons-validator.jar
        %PROJECT_HOME%\lib\jakarta-oro.jar
        %PROJECT_HOME%\lib\jstl-
    1.0.6.jar
        %PROJECT_HOME%\lib\standard-
    1.0.6.jar
        %PROJECT_HOME%\lib\struts.jar
        %PROJECT_HOME%\lib\struts-menu-
    2.3.jar
        %PROJECT_HOME%\src
        %PROJECT_HOME%\src\log4j.properties
        %PROJECT_HOME%\src\application.properties
        %PROJECT_HOME%\src\application_zh_CN.properties
        %PROJECT_HOME%\web
     %PROJECT_HOME%\web\images\
     %PROJECT_HOME%\web\scripts\
     %PROJECT_HOME%\web\styles\
        %PROJECT_HOME%\web\WEB-INF
        %PROJECT_HOME%\web\WEB-INF\menu-config.xml
        %PROJECT_HOME%\web\WEB-INF\struts-bean.tld
        %PROJECT_HOME%\web\WEB-INF\struts-config.xml
        %PROJECT_HOME%\web\WEB-INF\struts-html.tld
        %PROJECT_HOME%\web\WEB-INF\struts-logic.tld
        %PROJECT_HOME%\web\WEB-INF\struts-menu.tld
        %PROJECT_HOME%\web\WEB-INF\struts-menu-el.tld
        %PROJECT_HOME%\web\WEB-INF\struts-nested.tld
        %PROJECT_HOME%\web\WEB-INF\struts-tiles.tld
        %PROJECT_HOME%\web\WEB-INF\web.xml

    六、實戰Struts-Menu
      1:使用配置文件實現靜態菜單
      新建JSP文件web/static-menu.jsp,內容如下:

    <%@ page contentType="text/html; charset=GBK" %>
    <%@ taglib uri="struts-menu" prefix="menu" %>

    <menu:useMenuDisplayer name="ListMenu" 
        bundle
    ="org.apache.struts.action.MESSAGE">
        
    <menu:displayMenu name="DoorSite"/>
    </menu:useMenuDisplayer>

    運行Tomcat,在IE地址欄輸入http://localhost:8080/mymenu/static-menu.jsp查看

    2:實現中文化
      > 在src\application_zh_CN.properties中增加下面的內容,Unicode可以通過JDK自帶的native2ascii工具得到:
    #門戶網站
    menu.DoorSite
    =\u95e8\u6237\u7f51\u7ad9
    #雅虎
    menu.Yahoo
    =\u96c5\u864e
    #雅虎首頁
    menu.YahooIndex
    =\u96c5\u864e\u9996\u9875
    #雅虎郵件
    menu.YahooMail
    =\u96c5\u864e\u90ae\u4ef6
    #搜狐
    menu.Sohu
    =\u641c\u72d0
    #新浪
    menu.Sina
    =\u65b0\u6d6a
    > 在src\application.properties中增加下面的內容:

    #門戶網站
    menu.DoorSite
    =DoorSite
    #雅虎
    menu.Yahoo
    =Yahoo
    #雅虎首頁
    menu.YahooIndex
    =Yahoo Index
    #雅虎郵件
    menu.YahooMail
    =Yahoo Mail
    #搜狐
    menu.Sohu
    =Sohu
    #新浪
    menu.Sina
    =Sina
    > 修改menu-config.xml文件<Menus></Menus>部分:

    <Menus>
        
    <Menu  name="DoorSite"  title="menu.DoorSite"  description="Some famous doorsite" width="50">
           
    <Item   name="Yahoo"   title="menu.Yahoo">
               
    <Item   name="YahooIndex"   title="menu.YahooIndex"   location="http://www.yahoo.com.cn"/>
               
    <Item   name="YahooMail"    title="menu.YahooMail"    location="http://cn.mail.yahoo.com"/>
           
    </Item>
           
    <Item    name="Sohu"  title="menu.Sohu"   location="http://www.sohu.com"/>
           
    <Item    name="Sina"  title="menu.Sina"   location="http://www.sina.com.cn"/>
        
    </Menu>
      
    </Menus>
    重起Tomcat,在IE地址欄輸入http://localhost:8080/mymenu/static-menu.jsp查看

      3:結合數據庫實現動態菜單
      > 新建數據myexamples:
    CREATE DATABASE myexamples
      > 新建數據庫表menu_item:

    CREATE TABLE menu_item (
       id BIGINT not null
    ,
       parent_name VARCHAR(
    30),
       name VARCHAR(
    30),
       title VARCHAR(
    30),
       titleCN VARCHAR(
    30),
       description VARCHAR(
    50),
       location VARCHAR(
    255),
       target VARCHAR(
    10),
       onclick VARCHAR(
    100),
       onmouseover VARCHAR(
    100),
       onmouseout VARCHAR(
    100),
       image VARCHAR(
    50),
       altImage VARCHAR(
    30),
       tooltip VARCHAR(
    100),
       roles VARCHAR(
    100),
       page VARCHAR(
    255),
       width VARCHAR(
    5),
       height VARCHAR(
    5),
       forward VARCHAR(
    50),
       action VARCHAR(
    50),
       primary key (id)
    )


    > 插入測試數據:
    INSERT INTO menu_item
        (id
    , parent_name, name, title, titleCN, location)
    VALUES
        (
    1,null,'DatabaseMenu','Database Menu','數據庫動態菜單',null),
        (
    2,'DatabaseMenu','Yahoo','Yahoo Mail','雅虎郵件','http://mail.yahoo.com'),
        (
    3,'DatabaseMenu','JavaBlogs','JavaBlogs','Java博客','http://javablogs.com'),
        (
    4,null,'StandaloneMenu','Standalone Menu','獨立的菜單','http://www.sohu.com')
    > 將數據庫驅動程序放到lib目錄中,并加入到Build Path,如MySQL的數據庫驅動mysql-connector-java-3.1.8-bin.jar,解壓縮commons-collections-3.1.zip,將commons-collections-3.1.jar釋放到lib目錄,并加入Build Path
      > 新建一個Struts的Action,代碼如下:

    package cn.appex.menu;

    import java.io.UnsupportedEncodingException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.ListResourceBundle;
    import java.util.Map;

    import com.mysql.jdbc.Driver;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;

    import net.sf.navigator.menu.MenuComponent;
    import net.sf.navigator.menu.MenuRepository;
    import net.sf.navigator.menu.PermissionsAdapter;

    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;

    public class MenuAction extends Action {
        
    public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)
                
    throws Exception {
            buildMenuRepository(request);
            buildMenuResourceBundle(request);
            buildMenuPermissions(request);
            
    return (mapping.findForward("success"));
        }

        
    /**
         * 創建菜單數據結構
         * 
         * 
    @param request
         
    */
        
    private void buildMenuRepository(HttpServletRequest request) {
            MenuRepository repository 
    = new MenuRepository();
            
    // Get the repository from the application scope - and copy the
            
    // DisplayerMappings from it.
            MenuRepository defaultRepository = (MenuRepository) request
                    .getSession().getServletContext().getAttribute(
                            MenuRepository.MENU_REPOSITORY_KEY);
            repository.setDisplayers(defaultRepository.getDisplayers());

            Map[] menus 
    = getMenuComponents();
            
    for (int i=0; i < menus.length; i++) {
                MenuComponent mc 
    = new MenuComponent();
                Map row 
    = menus[i];
                String name 
    = (String) row.get("name");
                mc.setName(name);
                String parent 
    = (String) row.get("parent_name");
                System.out.println(name 
    + ", parent is: " + parent);
                
    if (parent != null) {
                    MenuComponent parentMenu 
    = repository.getMenu(parent);
                    
    if (parentMenu == null) {
                        System.out.println(
    "parentMenu '" + parent + "' doesn't exist!");
                        
    // create a temporary parentMenu
                        parentMenu = new MenuComponent();
                        parentMenu.setName(parent);
                        repository.addMenu(parentMenu);
                    }

                    mc.setParent(parentMenu);
                }
                String title 
    = (String) row.get("title");
                mc.setTitle(title);
                String location 
    = (String) row.get("location");
                mc.setLocation(location);
                String description 
    = (String) row.get("description");
                mc.setDescription(description);
                repository.addMenu(mc);
            }
            
            request.setAttribute(
    "examplesRepository", repository);
        }

        
    /**
         * 從數據庫中讀取菜單配置信息
         * 
         * 
    @return
         
    */
        
    private Map[] getMenuComponents() {
            ArrayList list 
    = new ArrayList();
            Connection conn 
    = null;
            PreparedStatement pstmt 
    = null;
            ResultSet rest 
    = null;
            String sql 
    = "select name,parent_name,title,location,description from menu_item order by id";
            
    try {
                Class.forName(
    "com.mysql.jdbc.Driver").newInstance();
                conn 
    = DriverManager.getConnection("jdbc:mysql://localhost/myexamples?user=root&password=mywangya&useUnicode=true&characterEncoding=UTF-8");
                pstmt 
    = conn.prepareStatement(sql);
                rest 
    = pstmt.executeQuery();
                
    while (rest.next()) {
                    
    int i = 1;
                    HashMap map 
    = new HashMap();
                    map.put(
    "name", rest.getString(i++));
                    map.put(
    "parent_name", rest.getString(i++));
                    map.put(
    "title", rest.getString(i++));
                    map.put(
    "location", rest.getString(i++));
                    map.put(
    "description", rest.getString(i++));
                    list.add(map);
                }
            } 
    catch (SQLException ex) {
                ex.printStackTrace();
            } 
    catch (InstantiationException e) {
                e.printStackTrace();
            } 
    catch (IllegalAccessException e) {
                e.printStackTrace();
            } 
    catch (ClassNotFoundException e) {
                e.printStackTrace();
            } 
    finally {
                
    try {
                    
    if (null!=rest) rest.close();
                    
    if (null!=pstmt) pstmt.close();
                    
    if (null!=conn) conn.close();
                } 
    catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            
            
    return (Map[]) list.toArray(new HashMap[0]);
        }
        
        
    /**
         * 構造菜單權限
         * 
         * 
    @param request
         
    */
        
    private void buildMenuPermissions(HttpServletRequest request) {
            PermissionsAdapter permession 
    = new PermissionsAdapter() {
                
    public boolean isAllowed(MenuComponent menu) {
                    
    // 名稱等于StandaloneMenu的菜單不顯示
                    return !"StandaloneMenu".equalsIgnoreCase(menu.getName());
                }
            };
            request.setAttribute(
    "examplesPermession", permession);
        }

        
    /**
         * 構造菜單顯示標題
         * 
         * 
    @param request
         
    */
        
    private void buildMenuResourceBundle(HttpServletRequest request) {
            MenuResourceBundle resourceBundle 
    = new MenuResourceBundle();
            request.setAttribute(
    "examplesBundle", resourceBundle);
        }
        
        
    /**
         * MenuResourceBundle樹狀菜單國際語言顯示
         * 
         * 
    @author wenbin.zhang
         *  
         
    */
        
    class MenuResourceBundle extends ListResourceBundle {
            
    private ArrayList list = new ArrayList();

            
    public MenuResourceBundle() {
                Connection conn 
    = null;
                PreparedStatement pstmt 
    = null;
                ResultSet rest 
    = null;
                String sql 
    = "select title,titleCN from menu_item order by id";
                
    try {
                    Class.forName(
    "com.mysql.jdbc.Driver").newInstance();
                    conn 
    = DriverManager.getConnection("jdbc:mysql://localhost/myexamples?user=root&password=mywangya&useUnicode=true&characterEncoding=UTF-8");
                    pstmt 
    = conn.prepareStatement(sql);
                    rest 
    = pstmt.executeQuery();
                    
    while (rest.next()) {
                        
    int i = 1;
                        String[] message 
    = new String[2];
                        message[
    0= rest.getString(i++);
                        
    try {
                            message[
    1= new String(rest.getString(i++).getBytes("latin1"), "gbk");
                        } 
    catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                        
    if (message[0!= null && message[1!= null) {
                            list.add(message);
                        }
                    }
                } 
    catch (SQLException ex) {
                    ex.printStackTrace();
                } 
    catch (InstantiationException e) {
                    e.printStackTrace();
                } 
    catch (IllegalAccessException e) {
                    e.printStackTrace();
                } 
    catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } 
    finally {
                    
    try {
                        
    if (null!=rest) rest.close();
                        
    if (null!=pstmt) pstmt.close();
                        
    if (null!=conn) conn.close();
                    } 
    catch (SQLException e) {
                        e.printStackTrace();
                    }
                }

            }

            
    public Object[][] getContents() {
                
    return (String[][]) list.toArray(new String[0][0]);
            }
        }
    }

    > 將struts-config.xml文件的<action-mappings />部分修改為:
    <action-mappings>
      
    <action path="/menuAction" type="cn.appex.menu.MenuAction" >
        
    <forward name="success" path="/struts-menu/dynamic-menu.jsp" />
      
    </action>
    </action-mappings>
    > 新建JSP文件web/dynamic-menu.jsp,內容如下:
    <%@ page contentType="text/html; charset=GBK" %>
    <%@ taglib uri="struts-menu" prefix="menu" %>

    <p>沒有使用Bundle和權限控制:
    <menu:useMenuDisplayer name="ListMenu" repository="examplesRepository">
        
    <menu:displayMenu name="DatabaseMenu"/>
        
    <menu:displayMenu name="StandaloneMenu"/>
    </menu:useMenuDisplayer></p>

    <p>使用Bundle, 沒有使用權限控制:
    <menu:useMenuDisplayer name="ListMenu" bundle="examplesBundle" repository="examplesRepository">
        
    <menu:displayMenu name="DatabaseMenu"/>
        
    <menu:displayMenu name="StandaloneMenu"/>
    </menu:useMenuDisplayer></p>

    <p>使用Bundle和權限控制:
    <menu:useMenuDisplayer name="ListMenu" permissions="examplesPermession"  bundle="examplesBundle" repository="examplesRepository">
        
    <menu:displayMenu name="DatabaseMenu"/>
        
    <menu:displayMenu name="StandaloneMenu"/>
    </menu:useMenuDisplayer></p>

    七、關于Struts-Menu配置文件和API的使用方法,請參考附錄中的官方網站


    附:
    Struts-Menu官方網站:http://struts-menu.sourceforge.net
    數據庫驅動的動態菜單:http://demo.raibledesigns.com/struts-menu/dynamicMenu.jsp

    posted on 2006-11-02 14:11 蘆葦 閱讀(2441) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 久久久久久亚洲精品无码| 最近免费中文字幕大全视频| 国产免费观看黄AV片| 一级一片免费视频播放| 国产麻豆视频免费观看| 91亚洲精品视频| aⅴ免费在线观看| 国产精品亚洲专区在线观看| 67194熟妇在线永久免费观看 | 亚洲AV无码成人精品区大在线| 亚洲第一成年网站视频| 日韩视频在线免费观看| 偷自拍亚洲视频在线观看| 亚洲av无码不卡私人影院| 久草免费福利在线| 亚洲综合无码一区二区| 免费无码AV片在线观看软件| 亚洲av中文无码乱人伦在线观看| 在线观看91精品国产不卡免费| 亚洲AV永久无码精品放毛片 | 国产亚洲精aa成人网站| 日韩视频在线观看免费| 亚洲一区二区三区在线观看蜜桃 | 久久久久亚洲精品天堂久久久久久| 国产一二三四区乱码免费| 亚洲黑人嫩小videos| 国产成人免费A在线视频| 午夜精品一区二区三区免费视频| 激情综合亚洲色婷婷五月| 亚洲中文字幕丝袜制服一区| 日韩插啊免费视频在线观看| 久久精品国产亚洲AV天海翼| 日本亚洲成高清一区二区三区| 在线观看成人免费| 久久国产精品2020免费m3u8 | 最近更新免费中文字幕大全| 亚洲色在线无码国产精品不卡| 久久噜噜噜久久亚洲va久| 免费国产成人午夜私人影视 | 亚洲欧美成人av在线观看| 亚洲天堂男人天堂|