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

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

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

    如鵬網 大學生計算機學習社區

    CowNew開源團隊

    http://www.cownew.com 郵件請聯系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

    #

    為了鞏固 CGLib 的知識,下面我們實現一個稍微復雜一點的例子。

    例、請實現一個攔截器,使其能夠檢測一個 JavaBean 的哪些字段改變了。

    1 )首先定義一個 JavaBean

    public class PersonInfo

    {

    ???? private String name;

    ?

    ???? private String email;

    ?

    ???? private int age;

    ?

    ???? private String address;

    ?

    ???? public String getEmail()

    ???? {

    ???????? return email;

    ???? }

    ?

    ???? public void setEmail(String email)

    ???? {

    ???????? this.email = email;

    ???? }

    ?

    ???? public String getName()

    ???? {

    ???????? return name;

    ???? }

    ?

    ???? public void setName(String name)

    ???? {

    ???????? this.name = name;

    ???? }

    ?

    ???? public String getAddress()

    ???? {

    ???????? return address;

    ???? }

    ?

    ???? public void setAddress(String address)

    ???? {

    ???????? this.address = address;

    ???? }

    ?

    ???? public int getAge()

    ???? {

    ???????? return age;

    ???? }

    ?

    ???? public void setAge(int age)

    ???? {

    ???????? this.age = age;

    ???? }

    }

    2 )定義一個 MethodInterceptor ,這一步是最關鍵的

    import java.lang.reflect.Method;

    import java.util.Collections;

    import java.util.HashSet;

    import java.util.Set;

    ?

    import net.sf.cglib.proxy.MethodInterceptor;

    import net.sf.cglib.proxy.MethodProxy;

    ?

    public class JavaBeanDataChangeInterceptor implements MethodInterceptor

    {

    ???? private static final String SET = "set";

    ?

    ???? private Set changedPropSet;

    ?

    ???? public JavaBeanDataChangeInterceptor()

    ???? {

    ???????? changedPropSet = new HashSet();

    ???? }

    ?

    ???? public Object intercept(Object obj, Method method, Object[] args,

    ????????????? MethodProxy proxy) throws Throwable

    ???? {

    ???????? String name = method.getName();

    ???????? if (name.startsWith(SET))

    ???????? {

    ????????????? String s = name.substring(SET.length());

    ????????????? changedPropSet.add(s);

    ???????? }

    ???????? return proxy.invokeSuper(obj, args);

    ???? }

    ?

    ???? public Set getChangedPropSet()

    ???? {

    ???????? return Collections.unmodifiableSet(changedPropSet);

    ???? }

    ?

    ???? public void reset()

    ???? {

    ???????? changedPropSet.clear();

    ???? }

    }

    定義一個集合 changedPropSet 用來存放修改了的字段名,增加了一個方法 reset 用來清空此集合,增加了一個 getChangedPropSet 方法用來供外界得到修改了的字段,為了防止調用者對 changedPropSet 做修改,因此我們采用 Collections.unmodifiableSet 對返回的集合進行不可修改的修飾。

    intercept 方法中,我們判斷如果被調用的方法以 set 開頭,則把此字段名放入 changedPropSet 集合中。

    3 )定義剖析用工具類。

    import net.sf.cglib.proxy.Callback;

    import net.sf.cglib.proxy.Factory;

    ?

    public class JavaBeanInterceptorUtils

    {

    ???? public static JavaBeanDataChangeInterceptor getInterceptor(

    ????????????? Object obj)

    ???? {

    ???????? if (!(obj instanceof Factory))

    ???????? {

    ????????????? return null;

    ???????? }

    ???????? Factory f = (Factory) obj;

    ???????? Callback[] callBacks = f.getCallbacks();

    ???????? for (int i = 0, n = callBacks.length; i < n; i++)

    ???????? {

    ????????????? Callback callBack = callBacks[i];

    ????????????? if (callBack instanceof JavaBeanDataChangeInterceptor)

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

    ?????????????????? return (JavaBeanDataChangeInterceptor) callBack;

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

    ???????? }

    ???????? return null;

    ???? }

    }

    這個 JavaBeanInterceptorUtils 只有一個方法 getInterceptor ,這個方法用于從一個被 CGLib 代理的 JavaBean 中取出攔截器 JavaBeanDataChangeInterceptor

    前邊提到了, CGLib 實現攔截的方式就是生成被攔截類的子類,這個子類實現了 net.sf.cglib.proxy.Factory 接口,這個接口中有一個非常重要的方法 getCallbacks() ,通過這個方法我們可以得到所有的攔截器

    4 主程序

    public class MainApp

    {

    ???? public static void main(String[] args)

    ???? {

    ???????? Enhancer enhancer = new Enhancer();

    ???????? enhancer.setSuperclass(PersonInfo.class);

    ???????? enhancer.setCallback(new JavaBeanDataChangeInterceptor());

    ?

    ???????? PersonInfo info = (PersonInfo) enhancer.create();

    ???????? // 對生成的 JavaBean 做一些初始化

    ???????? info.setAddress(" 地址 1");

    ???????? info.setAge(21);

    ???????? info.setName("tom");

    ?

    ???????? // 得到攔截器

    ???????? JavaBeanDataChangeInterceptor interceptor = JavaBeanInterceptorUtils

    ?????????????????? .getInterceptor(info);

    ???????? // 復位修改字段記錄集合

    ???????? interceptor.reset();

    ?

    ???????? // JavaBean 做一些修改

    ???????? editPersonInf(info);

    ?

    ???????? // 得到修改了的字段

    ???????? Iterator it = interceptor.getChangedPropSet().iterator();

    ???????? while (it.hasNext())

    ???????? {

    ????????????? System.out.println(it.next());

    ???????? }

    ???? }

    ?

    ???? private static void editPersonInf(PersonInfo info)

    ???? {

    ???????? info.setName("Jim");

    ???????? info.setAddress("N.Y Street");

    ???? }

    }???

    運行結果:

    Address

    Name

    ?

    這個“變化字段攔截器”是有一定實際意義的,比如可以用來實現“只保存修改了的字段以提高效率”等功能

    ?

    很多資料中都說如果要使用 JDK Proxy ,被代理的對象的類必須要實現接口,這種說法是不嚴謹的。從上邊的例子我們可以看出,正確的說法應該是:如果要使用 JDK Proxy ,那么我們要通過代理調用的方法必須定義在一個接口中。“面向接口編程而不是面向實現編程”是 OOP 開發中的一條基本原則,因此這種限制并不會對我們的開發造成障礙。

    posted @ 2007-02-20 00:50 CowNew開源團隊 閱讀(352) | 評論 (0)編輯 收藏

         摘要: 服務器通過配置文件將符合特定格式的 URL 同 Servlet 建立對應關系,當一個客戶端請求到達服務器的時候,服務器就會分析其 URL 格式并派發給合適的 Servlet 處理,然后將 Servlet 處理完成的結果返回給客戶。 與 ASP 、 ...  閱讀全文
    posted @ 2007-02-19 21:45 CowNew開源團隊 閱讀(794) | 評論 (0)編輯 收藏

    公司安排偶做終端字符界面庫,這是我半個月做出來的東西,呵呵,挺有意思,與大家分享。
    p3.JPG

    這是用這些控件搭建出來的程序界面,供大家把玩
    p1.JPGp2.JPG
    posted @ 2007-02-13 17:37 CowNew開源團隊 閱讀(546) | 評論 (2)編輯 收藏

    對象圖
    XStream支持對象圖,也就是“反序列化”一個對象的時候將會保持原來的對象引用關系,這其中包括循環引用關系。?我們可以指定XStream是使用XPath還是IDs來實現對象引用的這種處理方式,指定的方式就是調用XStream的setMode方法,此方法有XStream.XPATH_REFERENCES、XStream.ID_REFERENCES、XStream.NO_REFERENCES三個選項。其意義分別如下:
    XStream.XPATH_REFERENCES:這是默認值。這個選項指定XStream使用XPath引用方式處理重復引用。
    XStream.ID_REFERENCES:這個選項指定XStream使用ID引用方式處理重復引用。當使用手寫XML的時候,這種方式可能更好用一些。?
    XStream.NO_REFERENCES:這個選項指定XStream不支持圖引用,將對象結構當做樹狀處理。重復的引用將會被認為是兩個獨立的對象,而循環引用將會導致一個異常。這種方式速度會更快一些,并且相對于前兩者來說占用更少的內存。
    自定義轉換器
    XStream對String, Date, int, boolean等基本類型以及Map, List, Set, Properties等集合類型提供了轉換器,因此這些類型可以輕松的實現序列化和反序列化。如果您使用的數據類型不被XStream支持,那么就需要自定義數據轉換器。自定義轉換器要實現com.thoughtworks.xstream.converters.Converter接口,這個接口定義了如下三個方法:
    boolean canConvert(Class type);
    void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context);
    Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context);
    這三個方法分別表示:type這個類型的數據此轉換器是否有能力轉換;將對象進行編組(marshal)為XML格式;將XML格式反編組(unmarshal)為對象。
    我們通常無需直接實現該接口,而是繼承com.thoughtworks.xstream.converters.MarshallingContext.AbstractBasicConverter抽象類,然后覆蓋:
    protected String toString(Object obj)
    protected Object fromString(String str);
    兩個方法即可。可以參考com.thoughtworks.xstream.converters.extended.SqlTimestampConverter的實現代碼。
    轉換器開發完畢以后調用XStream類的public void registerConverter(Converter converter)方法注冊轉換器。
    posted @ 2007-02-13 09:38 CowNew開源團隊 閱讀(823) | 評論 (0)編輯 收藏

    為什么使用數據源
    在帳套配置項中,我們使用數據源來表示對應的數據庫連接。使用數據源有兩個好處:對開發人員屏蔽數據庫細節,只要通過JNDI取得數據源就可以了,無需關心數據庫連接是如何建立的;數據源通常都提供了數據庫連接池的功能。
    數據庫連接是一種關鍵的有限的昂貴的資源,而且數據庫連接的建立和關閉也是很耗費系統資源的。在傳統的兩層C/S架構中,一個客戶端對應一個數據庫連接,在用戶活動期間就獨占此連接;而在分布式系統中,數據庫連接的建立與關閉是異常頻繁的,因此數據庫連接的對系統的性能影響更是明顯。對數據庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。數據庫連接池正是針對這個問題提出來的。
    數據庫連接池在初始化時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的。數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而再不是重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏。無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。連接池的最大數據庫連接數量限定了這個連接池能占有的最大連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。
    JDBC3.0規范中規定了如下的接口和類來實現數據庫連接池:
    javax.sql.ConnectionEvent:連接事件
    javax.sql.ConnectionPoolDataSource:連接池數據源
    javax.sql.PooledConnection:被池化的連接
    javax.sql.ConnectionEventListener:連接事件監聽接口
    上邊這些接口和類是對數據庫連接池內部實現的規定,對于使用者來說是透明的。數據庫連接池的使用者一般只和DataSource接口直接打交道,通過這個接口獲得數據庫連接,其主要方法為:
    Connection getConnection():得到一個數據庫連接
    Connection getConnection(String userName,String password):得到一個數據庫連接
    java.io.PrintWriter getLogWriter():獲得Log Writer的對象
    void setLogWriter(java.io.PrintWriter out):設置Log Writer
    void setLoginTimeout(int seconds):設置數據源嘗試連接數據庫的最大時間
    int getLoginTimeout():獲得數據源嘗試連接數據庫的最大時間
    開源社區中有很多數據庫連接池的實現,比如PoolMan等,使用這些數據庫連接池包可以保證跨應用服務器的移植。不過在本案例系統中,我們使用應用服務器的數據源功能提供的數據庫連接池。數據源在不同的服務器中有不同的配置方式,下面介紹Tomcat中數據源的配置。
    打開%TOMCAT_HOME%\conf\server.xml,在</Context>和</host>前添加如下配置文件項:
    <Context docBase="CowNewPIS" path="/CowNewPIS"??????reloadable="true">
    <Resource type="javax.sql.DataSource"
    ??????auth="Container" name="jdbc/PISMSSQL_Dev" />
    <ResourceParams name="jdbc/PISMSSQL_Dev">
    <parameter>
    <name>maxWait</name>
    <value>5000</value>
    </parameter>
    <parameter>
    <name>maxActive</name>
    <value>4</value>
    </parameter>
    <parameter>
    <name>password</name>
    <value></value>
    </parameter>
    <parameter>
    <name>url</name>
    <value>
    jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=PISDev1106
    </value>
    </parameter>
    <parameter>
    <name>driverClassName</name>
    <value>
    com.microsoft.jdbc.sqlserver.SQLServerDriver
    ????</value>
    </parameter>
    <parameter>
    <name>maxIdle</name>
    <value>2</value>
    </parameter>
    <parameter>
    <name>username</name>
    <value>sa</value>
    </parameter>
    </ResourceParams>
    </Context>
    ?
    在配置的時候,要指定數據庫的JDBC驅動、數據庫連接URL等。數據源配置完畢,重啟服務器。編寫一個測試客戶端:
    Context ctx=null;
    Connection conn=null;
    try
    {
    ctx=new InitialContext();
    DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/PISMSSQL_Dev");
    conn=ds.getConnection();
    }
    finally
    {
    if(conn!=null)
    conn.close();
    if(ctx!=null)
    ctx.close();
    }

    Tomcat啟動的時候會將Server.xml中的數據源配置綁定到JNDI中,我們可以在應用服務器啟動的時候用代碼來代替Tomcat完成綁定:
    BasicDataSource bdds = new BasicDataSource();
    //設置數據庫驅動
    bdds.setDriverClassName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
    //設置JDBC的URL
    bdds.setUrl("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=PISDev1106");
    bdds.setUsername("sa");
    //設置連接池初始大小
    bdds.setInitialSize(2);?????
    //JNDI配置
    Map env = new Hashtable();
    env.put("java.naming.factory.initial",
    "org.apache.naming.java.javaURLContextFactory");
    InitialContext ctx=new InitialContext(env);?????
    //數據源綁定到JNDI
    ctx.bind("jdbc/PISMSSQL_Dev",bdds);

    這樣我們可以把數據源的配置文件移到ServerConfig.xml中,增加類似如下的配置:
    <DataSources>
    <DataSource
    name=”jdbc/PISMSSQL_Dev” driverClassName=”com.microsoft.jdbc.sqlserver.SQLServerDriver”
    url=”jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=PISDev1106”
    userName=”sa”
    >
    </DataSource>
    </DataSources>
    在應用服務器啟動的時候,到ServerConfig.xml中讀取數據源配置完成綁定。這種方式一是減少了實施人員配置文件的工作量,服務端的任何配置都可以在這個配置文件中完成;二是使得系統在不同服務器之間移植變得更加容易。

    posted @ 2007-02-13 09:37 CowNew開源團隊 閱讀(349) | 評論 (0)編輯 收藏

    BeanUtils
    BeanUtils是Apache-Commons項目提供的另一個非常方便的類庫,通過這個類庫能夠更方便的使用反射。最常用的類是BeanUtils(org.apache.commons.beanutils包中),使用這個類能通過名字訪問一個Bean中的某個屬性。
    通過BeanUtils.getProperty(person,”age”)能得到person的age屬性。此方法還支持內嵌對象,比如BeanUtils.getProperty(person,”manager.name”)就能得到person的manager屬性的name屬性。還支持List和Map類型的屬性,如下面的語法即可取得Order的顧客列表中第一個顧客的名字BeanUtils.getProperty(orderBean, "customers[1].name")。?使用BeanUtils.setProperty方法則可以設置javaBean的屬性值。
    ConstructorUtils提供了調用構造函數的方法,使用public static Object invokeConstructor(Class klass, Object arg)可以直接調用某個類的構造函數。
    MethodUtils提供了調用bean方法的方法,使用MethodUtils.invokeMethod(bean, methodName, parameter);可以直接調用某個類的某個方法。
    PropertyUtils提供了更詳細的屬性訪問方法,使用public static Class getPropertyType(Object bean, String name)獲取屬性的Class類型。
    UserInfo userInfo = (UserInfo) ConstructorUtils.invokeConstructor(
    ????UserInfo.class, new Object[] {});
    PersonInfo personInfo = (PersonInfo) ConstructorUtils
    ????.invokeConstructor(PersonInfo.class, new Object[] {});
    BeanUtils.setProperty(personInfo, "age", new Integer(20));
    BeanUtils.setProperty(personInfo, "name", "Tom");
    BeanUtils.setProperty(userInfo, "number", "admin");
    ??BeanUtils.setProperty(userInfo, "person", personInfo);
    System.out.println(BeanUtils.getProperty(userInfo, "person.name"));
    BeanUtils.setProperty(userInfo, "person.name","xdx");
    System.out.println(BeanUtils.getProperty(userInfo, "person.name"));
    System.out.println(PropertyUtils.getPropertyType(userInfo,"person"));
    運行結果:
    Tom
    xdx
    class com.cownew.PIS.basedata.common.PersonInfo
    posted @ 2007-02-05 12:49 CowNew開源團隊 閱讀(770) | 評論 (1)編輯 收藏

         摘要: LDBC 支持的語法 ( 1 ) Insert 語句 插入單行數據: INSERT INTO tableName [ (columnName [,...] ) ...  閱讀全文
    posted @ 2007-02-05 12:44 CowNew開源團隊 閱讀(575) | 評論 (0)編輯 收藏

    雖然使用正則表達式能很好的進行字符串的解析、提取、替換,但是對于一些簡單的應用,使用 String 類提供的一些方法就可以很好的完成,最突出的就是 split 方法。

    split 方法能夠很方便的將字符串按照一定的規則拆分開。

    比如對于下面的字符串:

    Tom,Jane,Tony,Elva,Gigi

    只要調用如下的代碼就可以將各個名字提取出來:

    String value = "Tom,Jane,Tony,Elva,Gigi";

    String[] names = value.split(",");

    for(int i=0,n=names.length;i<n;i++)

    {

    ???? System.out.println(names[i]);

    }

    運行結果:

    Tom

    Jane

    Tony

    Elva

    Gigi

    ?

    看到這個運行結果,很多人都認為 split 方法就是按照給定的字符串對字符串進行拆分,知道碰到了下面的問題。

    有一個字符串:中國 . 北京 . 海淀 . 學院路。請解析此字符串,并打印輸出“中國 北京 海淀 學院路 ”。

    于是寫代碼如下:

    String value = " 中國 . 北京 . 海淀 . 學院路 ";

    String[] names = value.split(".");

    for(int i=0,n=names.length;i<n;i++)

    {

    ???? System.out.print(names[i]+" ");

    }

    運行結果:

    ?

    對,沒看錯!沒有任何輸出!

    讓我們來看看 split 方法的方法簽名吧:

    public String[] split(String regex)

    這里的參數的名稱是 regex ,也就是 Regular Expression (正則表達式)。這個參數并不是一個簡單的分割用的字符,而是一個正則表達式,看了 split 方法的實現代碼就更堅定了我們的信心:

    public String[] split(String regex, int limit) {

    ???? return Pattern.compile(regex).split(this, limit);

    }

    split 的實現直接調用的 Matcher 類的 split 的方法。讀者已經知道,“ . ”在正則表達式中有特殊的含義,因此我們使用的時候必須進行轉義。

    修改代碼如下:

    private static void split2()

    {

    ???? String value = " 中國 . 北京 . 海淀 . 學院路 ";

    ???? String[] names = value.split("\\.");

    ???? for(int i=0,n=names.length;i<n;i++)

    ???? {

    ???????? System.out.print(names[i]+" ");

    ???? }

    }

    運行結果

    中國 北京 海淀 學院路

    posted @ 2007-01-20 23:38 CowNew開源團隊 閱讀(2843) | 評論 (9)編輯 收藏

    CowNewSQL的擴展:
    要編寫對新的數據庫的支持必須首先開發翻譯器,翻譯器必須實現IMethodTranslator接口,不過一般只要從BaseMethodTranslator派生即可,BaseMethodTranslator類已經提供了標準的SQL的翻譯。因為方法的翻譯在BaseMethodTranslator中實現時是獨立到一個方法翻譯器中的,所以派生類要通過getMethodTranslator方法提供方法翻譯器,方法翻譯器要實現IMethodTranslator接口,一般從BaseMethodTranslator派生即可。翻譯器開發完畢,調用DialectManager類的registerTranslator方法將翻譯器注冊到系統中。
    CowNewSQL的編譯
    CowNewSQL使用JDK1.5語法編寫的,因此如果要在JDK1.4的平臺上運行必須使用RetroTranslator將二進制代碼編織成在JDK1.4下能運行的二進制代碼。RetroTranslator的使用非常簡單,在命令行敲入如下指令即可完成代碼編織:
    java -jar retrotranslator-transformer-1.0.7.jar -srcjar F:\資料\寫書\ZDisk\lib\common\cownewSQLjdk5.jar -destjar F:\資料\寫書\ZDisk\lib\common\cownewSQLjdk4.jar
    RetroTranslator對JDK1.5中枚舉等類型的支持是通過RetroTranslator的運行時包來實現的,因此運行時還需要將RetroTranslator的運行時包retrotranslator-runtime-***.jar加入到類路徑中。
    posted @ 2007-01-20 23:36 CowNew開源團隊 閱讀(2109) | 評論 (0)編輯 收藏

    原文:
    http://community.csdn.net/Expert/topic/5294/5294255.xml?temp=.9256861

    匯總我的觀點:
    1、大家應該理性的看待這個問題,盡管從短期來看,這種行為會使大家在短期內受害,但是我想為這家公司喝彩,中國的知識產權保護觀念太淡薄了,也間接導致了國內IT環境的烏煙瘴氣,利潤越來越低。隨著中國入世的腳步,國人的版權觀念會逐漸加強的。到那個時候國內才會有一個良性循環的環境。
    2、大家還記得當年的打假英雄王海嗎?盡管他是在借著打假賺錢,也被很多人罵,很多人對他的做法也是嗤之以鼻,可是理性的思考一下,他的行為是不是有積極的意義呢?假如北京美好景象這樣的公司再多一點,或者我們每個公司都像北京美好景象這樣,那么還有人敢盜用別人的東西嗎,還敢隨便用網上下載的圖片嗎,還敢隨便用網上下載來的軟件包嗎,還敢隨便用盜版軟件搞低價競爭嗎?這樣我們產品的成本提高了,軟件開發的門檻提高了,市場規范了,那么IT業規范化、良性化、規模化發展的格局也就離我們不遠了。
    如果我見了北京美好景象的老總,我會對他說:你真他媽的無恥,不過我支持你!
    3、“我們是要強調版權,但問題是有的圖片你從baidu獲取的,你知不知道這個圖片是不是有版權?”,你連一點的知識產權的觀念都沒有,悲哀!做商業開發所用的任何東西,除非是明確表示能被免費用于商業用途,否則你都不能未經授權使用。如果你還不理解的話,希望你想想你去黑市買偷來的車是合法的嗎?
    4、“不過他是應該在圖片上寫明什么東西的,你這樣不寫,如果你在用別人的東西的時候,不是也會 被陷害 嗎”。嚴格來說,你用別人的東西的時候必須要他證明這個東西是他合法占有的,并要他書面授權你使用。這聽起來有點變態,不過這正是一個高度發達的法制社會的最終目標。如果你聽過羅永浩的“小心地滑”、“毒藥請勿吞服”那幾段語錄的話,就明白米國的法治社會是什么樣的了,我不是崇洋媚外,但是不得不承認的是在很多事情上我們和很多國家還有很大差距。

    總之,支持無恥的“北京美好景象圖片有限公司”。
    posted @ 2007-01-16 01:06 CowNew開源團隊 閱讀(1201) | 評論 (7)編輯 收藏

    僅列出標題
    共30頁: First 上一頁 15 16 17 18 19 20 21 22 23 下一頁 Last 
    主站蜘蛛池模板: 国产亚洲人成网站在线观看不卡| 亚洲熟妇无码一区二区三区 | 亚洲国产一区在线| 激情综合亚洲色婷婷五月APP| 免费无码专区毛片高潮喷水| 久草福利资源网站免费| 日本免费网站在线观看| 久久精品亚洲综合专区| 成人精品国产亚洲欧洲| 在线看片免费人成视久网| 无码国产亚洲日韩国精品视频一区二区三区 | 亚洲第一福利网站在线观看| 亚洲最大的成网4438| 视频一区二区三区免费观看| 日韩欧毛片免费视频| 亚洲AV日韩AV永久无码免下载| 爱情岛论坛亚洲品质自拍视频网站 | 亚洲黄色一级毛片| 国产日韩精品无码区免费专区国产| 国产精品成人免费视频网站京东| 亚洲免费人成在线视频观看| 精品韩国亚洲av无码不卡区| 亚洲福利中文字幕在线网址| 大妹子影视剧在线观看全集免费 | 无码国产精品一区二区免费式直播 | 区三区激情福利综合中文字幕在线一区亚洲视频1 | 美丽的姑娘免费观看在线播放| 亚洲人成在线播放网站| 国产高清不卡免费视频| 亚洲区精品久久一区二区三区| 性xxxxx大片免费视频| 国产精品亚洲视频| 色婷婷综合缴情综免费观看| 破了亲妺妺的处免费视频国产 | MM1313亚洲国产精品| 国产亚洲精品拍拍拍拍拍| 久久久久免费看成人影片| 亚洲区小说区图片区QVOD| 在免费jizzjizz在线播| 朝桐光亚洲专区在线中文字幕| 亚洲乱码国产乱码精品精|