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

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

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

    愚人碼頭

    知恥而后勇,知不足而進
    隨筆 - 33, 文章 - 1, 評論 - 26, 引用 - 0
    數據加載中……

    2005年12月20日

    對hibernate的新認識

         摘要:   閱讀全文

    posted @ 2008-01-30 11:14 船夫 閱讀(1955) | 評論 (7)編輯 收藏

    轉:Javascript事件處理

         摘要:   閱讀全文

    posted @ 2007-12-26 13:00 船夫 閱讀(350) | 評論 (0)編輯 收藏

    轉:提升JSP應用程序的七大絕招

    提升JSP應用程序的七大絕招
    你時常被客戶抱怨JSP頁面響應速度很慢嗎?你想過當客戶訪問次數劇增時,你的WEB應用能承受日益增加的訪 問量嗎?本文講述了調整JSP和servlet的一些非常實用的方法,它可使你的servlet和JSP頁面響應更快,擴展性更強。而且在用戶數增加的情 況下,系統負載會呈現出平滑上長的趨勢。在本文中,我將通過一些實際例子和配置方法使得你的應用程序的性能有出人意料的提升。其中,某些調優技術是在你的 編程工作中實現的。而另一些技術是與應用服務器的配置相關的。在本文中,我們將詳細地描述怎樣通過調整servlet和JSP頁面,來提高你的應用程序的 總體性能。在閱讀本文之前,假設你有基本的servlet和JSP的知識。
    方法一:在servlet的init()方法中緩存數據

    當應用服務器初始化servlet實例之后,為客戶端請求提供服務之前,它會調用這個servlet的init()方法。在一個servlet的生命周 期中,init()方法只會被調用一次。通過在init()方法中緩存一些靜態的數據或完成一些只需要執行一次的、耗時的操作,就可大大地提高系統性能。

    例如,通過在init()方法中建立一個JDBC連接池是一個最佳例子,假設我們是用jdbc2.0的DataSource接口來取得數據庫連接,在通 常的情況下,我們需要通過JNDI來取得具體的數據源。我們可以想象在一個具體的應用中,如果每次SQL請求都要執行一次JNDI查詢的話,那系統性能將 會急劇下降。解決方法是如下代碼,它通過緩存DataSource,使得下一次SQL調用時仍然可以繼續利用它:

    public class ControllerServlet extends HttpServlet
    {
    private javax.sql.DataSource testDS = null;
    public void init(ServletConfig config) throws ServletException
    {
    super.init(config);
    Context ctx = null;
    try
    {
    ctx = new InitialContext();
    testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");
    }
    catch(NamingException ne)
    {
    ne.printStackTrace();
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    }

    public javax.sql.DataSource getTestDS()
    {
    return testDS;
    }
    ...
    ...
    }

    方法 2:禁止servlet和JSP 自動重載(auto-reloading)

    Servlet/JSP提供了一個實用的技術,即自動重載技術,它為開發人員提供了一個好的開發環境,當你改變servlet和JSP頁面后而不必重啟 應用服務器。然而,這種技術在產品運行階段對系統的資源是一個極大的損耗,因為它會給JSP引擎的類裝載器(classloader)帶來極大的負擔。因 此關閉自動重載功能對系統性能的提升是一個極大的幫助。

    方法 3: 不要濫用HttpSession

    在很多應 用中,我們的程序需要保持客戶端的狀態,以便頁面之間可以相互聯系。但不幸的是由于HTTP具有天生無狀態性,從而無法保存客戶端的狀態。因此一般的應用 服務器都提供了session來保存客戶的狀態。在JSP應用服務器中,是通過HttpSession對像來實現session的功能的,但在方便的同 時,它也給系統帶來了不小的負擔。因為每當你獲得或更新session時,系統者要對它進行費時的序列化操作。你可以通過對HttpSession的以下 幾種處理方式來提升系統的性能:

    ? 如果沒有必要,就應該關閉JSP頁面中對HttpSession的缺省設置: 如果你沒有明確指定的話,每個JSP頁面都會缺省地創建一個HttpSession。如果你的JSP中不需要使用session的話,那可以通過如下的JSP頁面指示符來禁止它:

    <%@ page session="false"%>

    ? 不要在HttpSession中存放大的數據對像:如果你在HttpSession中存放大的數據對像的話,每當對它進行讀寫時,應用服務器都將對其進行 序列化,從而增加了系統的額外負擔。你在HttpSession中存放的數據對像越大,那系統的性能就下降得越快。

    ? 當你不需要HttpSession時,盡快地釋放它:當你不再需要session時,你可以通過調用HttpSession.invalidate()方法來釋放它。

    ? 盡量將session的超時時間設得短一點:在JSP應用服務器中,有一個缺省的session的超時時間。當客戶在這個時間之后沒有進行任何操作的話, 系統會將相關的session自動從內存中釋放。超時時間設得越大,系統的性能就會越低,因此最好的方法就是盡量使得它的值保持在一個較低的水平。

    方法 4: 將頁面輸出進行壓縮

    壓縮是解決數據冗余的一個好的方法,特別是在網絡帶寬不夠發達的今天。有的瀏覽器支持gzip(GNU zip)進行來對HTML文件進行壓縮,這種方法可以戲劇性地減少HTML文件的下載時間。因此,如果你將servlet或JSP頁面生成的HTML頁面 進行壓縮的話,那用戶就會覺得頁面瀏覽速度會非常快。但不幸的是,不是所有的瀏覽器都支持gzip壓縮,但你可以通過在你的程序中檢查客戶的瀏覽器是否支 持它。下面就是關于這種方法實現的一個代碼片段:

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
    OutputStream out = null
    String encoding = request.getHeader("Accept-Encoding");
    if (encoding != null && encoding.indexOf("gzip") != -1)
    {
    request.setHeader("Content-Encoding" , "gzip");
    out = new GZIPOutputStream(request.getOutputStream());
    }
    else if (encoding != null && encoding.indexOf("compress") != -1)
    {
    request.setHeader("Content-Encoding" , "compress");
    out = new ZIPOutputStream(request.getOutputStream());
    }
    else
    {
    out = request.getOutputStream();
    }
    ...
    ...
    }

    方法 5: 使用線程池

    應用服務器缺省地為每個不同的客戶端請求創建一個線程進行處理,并為它們分派service()方法,當service()方法調用完成后,與之相應的 線程也隨之撤消。由于創建和撤消線程會耗費一定的系統資源,這種缺省模式降低了系統的性能。但所幸的是我們可以通過創建一個線程池來改變這種狀況。另外, 我們還要為這個線程池設置一個最小線程數和一個最大線程數。在應用服務器啟動時,它會創建數量等于最小線程數的一個線程池,當客戶有請求時,相應地從池從 取出一個線程來進行處理,當處理完成后,再將線程重新放入到池中。如果池中的線程不夠地話,系統會自動地增加池中線程的數量,但總量不能超過最大線程數。 通過使用線程池,當客戶端請求急劇增加時,系統的負載就會呈現的平滑的上升曲線,從而提高的系統的可伸縮性。

    方法 6: 選擇正確的頁面包含機制

    在JSP中有兩種方法可以用來包含另一個頁面:1、使用include指示符(<%@ includee file=”test.jsp” %>)。2、使用jsp指示符(<jsp:includee page=”test.jsp” flush=”true”/>)。在實際中我發現,如果使用第一種方法的話,可以使得系統性能更高。

    方法 7:正確地確定javabean的生命周期

    JSP的一個強大的地方就是對javabean的支持。通過在JSP頁面中使用<jsp:useBean>標簽,可以將javabean直接插入到一個JSP頁面中。它的使用方法如下:

    <jsp:useBean id="name" scope="page|request|session|application" class=
    "package.className" type="typeName">
    </jsp:useBean>

    其中scope屬性指出了這個bean的生命周期。缺省的生命周期為page。如果你沒有正確地選擇bean的生命周期的話,它將影響系統的性能。

    舉例來說,如果你只想在一次請求中使用某個bean,但你卻將這個bean的生命周期設置成了session,那當這次請求結束后,這個bean將仍然 保留在內存中,除非session超時或用戶關閉瀏覽器。這樣會耗費一定的內存,并無謂的增加了JVM垃圾收集器的工作量。因此為bean設置正確的生命 周期,并在bean的使命結束后盡快地清理它們,會使用系統性能有一個提高

    其它一些有用的方法

    ? 在字符串連接操作中盡量不使用“+”操作符:在java編程中,我們常常使用“+”操作符來將幾個字符串連接起來,但你或許從來沒有想到過它居然會對系統 性能造成影響吧?由于字符串是常量,因此JVM會產生一些臨時的對像。你使用的“+”越多,生成的臨時對像就越多,這樣也會給系統性能帶來一些影響。解決 的方法是用StringBuffer對像來代替“+”操作符。

    ? 避免使用System.out.println()方法:由于System.out.println()是一種同步調用,即在調用它時,磁盤I/O操作必 須等待它的完成,因此我們要盡量避免對它的調用。但我們在調試程序時它又是一個必不可少的方便工具,為了解決這個矛盾,我建議你最好使用Log4j工具 (http://Jakarta.apache.org ),它既可以方便調試,而不會產生System.out.println()這樣的方法。

    ? ServletOutputStream 與 PrintWriter的權衡:使用PrintWriter可能會帶來一些小的開銷,因為它將所有的原始輸出都轉換為字符流來輸出,因此如果使用它來作為 頁面輸出的話,系統要負擔一個轉換過程。而使用ServletOutputStream作為頁面輸出的話就不存在一個問題,但它是以二進制進行輸出的。因 此在實際應用中要權衡兩者的利弊。

    總結

    本文的目的是通過對servlet和JSP的一些調優技術來極大地提高你 的應用程序的性能,并因此提升整個J2EE應用的性能。通過這些調優技術,你可以發現其實并不是某種技術平臺(比如J2EE和.NET之爭)決定了你的應 用程序的性能,重要是你要對這種平臺有一個較為深入的了解,這樣你才能從根本上對自己的應用程序做一個優化! 

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1448910

    posted @ 2007-12-25 17:04 船夫 閱讀(230) | 評論 (0)編輯 收藏

    轉載一篇測試筆記,用于備忘

         摘要:   閱讀全文

    posted @ 2007-12-25 14:43 船夫 閱讀(271) | 評論 (0)編輯 收藏

    JSP編譯過程

    很久以來,都知道JSP其實就是Servlet,今天心血來潮,想把里面的具體代碼看一遍,并記錄心得。
    一個編譯好的JSP類如下:
    public
     final class index_jsp extends HttpJspBase
        
    implements JspSourceDependent
    //上述類為index.jsp被編譯后得到的類
    //HttpJspBase是extends HttpServlet的一個類
    //JspSourceDependent是一個接口,只聲明了一個方法、、getDependants(),返回當前page所依賴的文件的名稱,文件包括以下幾種
    //1) files that are included by page directives 
    //2) files that are included by include-prelude and include-coda in jsp:config 
    //3) files that are tag files and referenced 
    //4) TLDs referenced
    其核心方法為:
      public void _jspService(HttpServletRequest request, HttpServletResponse response)
            
    throws IOException, ServletException{
    .
    }
    該方法重載HttpJspBase中的_jspService方法,進行頁面解析,包括對scriptlet的加載,html的生成,自定義Tag的解析等等
    HttpJspBase的service再對_jspService再進行調用,最終生成HTML頁面

    posted @ 2007-12-18 12:06 船夫 閱讀(1909) | 評論 (1)編輯 收藏

    Annotation初步了解

    今天在看Tapestry代碼的時候,突然想了解一下annotation到底是干什么的,有什么好處?花了3個小時的時間,從JDK API開始,大致了解了一下。

    annotation實際上就是給一些特定的類和其屬性,方法等加上一些注釋(annotation),這些注釋是以屬性name,value進行設置的,這些屬性在Annotation Class中以方法的形式存在,如下:
    @Documented                //是否需要產生javadoc
    @Target(java.lang.annotation.ElementType.METHOD)   //應用目標,這里是應用到field屬性上面
    @Retention(RetentionPolicy.RUNTIME)   //該策略指明該注釋會被加載到jvm中,即在運行時,我們可以得到該注釋的內容,另外兩個策略,SOURCE, CLASS都不會加載到jvm中
    public @interface TestAnnoation {
        String value();   //屬性value
        String time();     //屬性time
    }
    以上為自定義的annotation,是應用在成員變量上的,使用該annotation情況如下
    public class Test {
        @TestAnnoation(time
    ="12:30",value="20")
        
    public String test(){
              System.out.println("test!");
              return null;
        };
    }

    可以使用java的反射來進行獲取,通過:
    Class cls = Class.forName("Test");
    cls.isAnnotationPresent(AnnotationClass.
    class);//判斷是否存在annotation
    TestAnnotation ta = (TestAnnotation)cls.getAnnotation(AnnotationClass.class);//獲得AnnotationClass實例,后調用這個實例可以獲得在AnnotationClass中定義的一些屬性
    System.out.println(ta.time()); //輸出注釋time內容
    System.out.println(ta.value()); //輸出注釋value內容

    我個人認為annotation的好處是將一些配置直接寫在代碼上,很直觀;以前在使用hibernate的時候,PO對象和對應的mapping xml是分開的,不夠直觀,若是使用annotation就會很直觀的看出這個對象的映射屬性以及它的一些特殊屬性(如lazy=true)之類的,在JPA中就把這種配置方式換成了annotation。

    在JE上有很多關于使用annotation和xml的爭論,我認為在小規模使用上可以使用annotation,就像JPA這種,每個PO上面都需要進行配置,即使使用XML也不能簡化;而在大規模使用,如spring所維護的一些service的事務配置上避免使用annotation,因為每個service類中都需要配置,而使用AOP根據XML配置可以一下就搞定。

    關于ElementType的其他屬性:
    TYPE(類型), FIELD(屬性), METHOD(方法), PARAMETER(參數), CONSTRUCTOR(構造函數),LOCAL_VARIABLE(局部變量), ANNOTATION_TYPE,PACKAGE(包),其中的TYPE(類型)是指可以用在Class,Interface,Enum和 Annotation類型上.

    posted @ 2007-12-17 16:33 船夫 閱讀(324) | 評論 (1)編輯 收藏

    禁食了,腎結石患者還能吃什么?

    當腎結石、膀胱結石發生以后,患者在劇烈的疼痛中常向醫生討教:腎臟、尿道里那來的石頭呢?手術之后要怎樣才能預防它復發呢?
    結石的形成,主要原因就是飲食。它是由飲食中可形成結石的有關成分攝入過多引起的。再細一點解釋是:
    草酸積存過多。體內草酸的大量積存,是導致腎尿結石的 因素之一。如菠菜、豆類、葡萄、可可、茶葉、桔子、番茄、土豆、李子、竹筍等這些人們普遍愛吃的東西,正是含草酸較高的食物。醫生通過研究發現:200克 菠菜中,含草酸725.6毫克,如果一人一次將200克菠菜全部吃掉,食后8小時,檢查尿中草酸排泄量為20-25毫克,相當于正常人24小時排出的草酸 平均總量。
    嘌呤代謝失常。動物內臟、海產食品、花生、豆角、菠菜等,均含有較多的嘌呤成分。嘌呤進入體內后,要進行新陳代謝,它代謝的最終產物是尿酸。尿酸可促使尿中草酸鹽沉淀。如果,一次過多地食用了含嘌呤豐富的食物,嘌呤的代謝又失常,草酸鹽便在尿中沉積而形成尿結石
    脂肪攝取太多。各種動物的肉類,尤其是肥豬肉,都是脂肪多的食品。多吃了體內脂肪必然增高,脂肪會減少腸道中可結合的鈣,因而引起對草酸鹽的吸收增多,如果一旦出現排泄功能故障,如出汗多、喝水少,尿量少,腎結石很可能就在這種情況下形成。所以,醫生們常講,為了預防得結石病,熱天要多喝點水,吃了油水多的食物時,也要多喝點水,以促進排尿暢通,稀釋尿液成分,就減少了得結石的危險。
    糖分增高。糖是人體的重要養分,要經常適量增補,但一下子增加太多,尤其是乳糖,也會使結石形成創造條件。專家們發現:不論正常人或結石病人,在食用100克蔗糖后,過2小時去檢查他們的尿,發現尿中的鈣和草酸濃度均上升,若是服用乳糖,它更能促進鈣的吸收,更可能導致草酸鈣在體內的積存而形成尿結石
    蛋白質過量。對腎結石成分進行化驗分析,發現結石中的草酸鈣占87.5%。這么大比重的草酸鈣的來源就是因為蛋白質里除含有草酸的原料——甘氨酸、羥脯氨酸之外,蛋白質還能促進腸道功能對鈣的吸收。如果經常過量食用高蛋白質的食物,便使腎臟和尿中的鈣、草酸、尿酸的成分普遍增高。如果不能及時有效地通過腎臟功能把多余的鈣、草酸、尿酸排出體外,這樣,得腎臟結石、輸尿管結石癥的條件就形成了。當今世界經濟發達國家腎結石發病率增高的主要原因就是如此。
    從以上幾種易形成腎結石的因素來看,要預防腎結石病 的發生,就必須改變只顧單求一種營養和追求營養過甚的觀念。這就是說,在人類的日常飲食中,不能因為某種食物好吃、營養價值高,就一味地只顧去吃這種食 物。必須注意食物的搭配,各種食物都適量進食,即使是檢查出身體缺乏某種營養素需要某種食物來補充時,也不宜一次大量進食,因為人體的消化、吸收功能是有限的。消化、吸收不了的養分就要通過排泄器官排泄出去,這樣也會增加泌尿系統的負擔,即便不患腎結石病,也對健康不利。特別是當檢查出確認是腎結石癥時,在患病期間,要限制病人吃那些易促使結石形成的食物。
    結石是尿石癥的一種,多在炎熱的夏天形成,因為夏天大量出汗,甚至體內脫水,使排尿減少,再加之夏季暴露于陽光下時間長,紫外線照射皮膚有助于體內維生素D和維生素A合成增多,維生素D和維生素A可促進小腸吸收鈣離子,尿液中排泄鈣增多,尿內結石物質易產生結晶核,從而形成結石。冬季天氣寒冷,人的尿量增多,已形成的小結石被尿液沖刷,向下移動,此時引起腎絞痛癥狀。所以,腎結石常為“夏季形成冬季發病”。

    人們的飲食品種是多樣的,人體新陳代謝是復雜的,所以腎結石的成分也是多樣的。常見結石按成分可分為五種:一草酸鈣結石:最為常見,占腎結石的80以上,在酸性或中性尿中形成,發病多為青壯年,以男性多見。二磷酸鈣結石:占結石的6-9,在堿性尿中形成,也以男性青壯年多發。三尿酸結石:占結石的6,在酸性尿中形成,當尿PH值大于6.7時結石溶解,以男性多見。四磷酸鎂胺結石:占結石的10,在堿性尿中形成,尿PH值小于7.2時結石溶解,以女性多見。五胱氨酸結石:少見,約占結石的1-2,在酸性尿中形成,尿PH值大于7.0時結石溶解。

    大量飲水對所有成分尿石都有防治作用。在炎熱的夏天,每日尿量少于1200毫升時,尿石生長的危險性顯著增大。如能使每日飲水量在2000-4000毫升,這樣可維持每日尿量在2000毫升以上。磁化水對防治草酸鈣結石更有效,可將全日飲水量分別于晨起、餐間、睡前給予。清晨飲水量可達500-1000毫升。為了保持夜間尿量,睡前飲水500毫升,睡眠中起床排尿后再飲水300-500毫升,余下水分別于餐間飲服。大量飲水可促使小的結石排出,稀釋尿液可防止尿石結晶形成,并能延緩結石增長速度。

    1985年國外學者Vehlensieck認為,多飲水和飲食療法可使2/3復發結石病人不再生新結石。下面介紹幾種腎結石的飲食療法。

    ⑴草酸鈣結石:宜低鈣及低草酸飲食。少食牛奶及乳制品、豆制品、肉類、動物內臟(如肝、心臟、腎、腸等),還有巧克力、濃茶、芝麻醬、蛋黃、香菇、菠菜、蝦皮、蘿卜、可可、芹菜、土豆等。近年來發現食物中纖維素可減少尿鈣的形成,如麥麩食品中的麥麩面包、米糠也有同樣作用,對復發性高鈣尿結石有效,維生素B1、維生素B6缺乏使尿草酸增多,應增加富含此類維生素的食物,如谷物、干果、硬果等。

    ⑵磷酸鈣結石及磷酸鎂銨結石:其低鈣飲食同草酸鈣結石相同。在低磷食物中,宜少食肉類、魚類及骨頭湯。

    ⑶尿結石: 應限制蛋白質的攝入量,每日蛋白質的總攝入量應在48-80克(0.8-1.0克/公斤/日)之間。一般帶葉的蔬菜每市斤約含10克蛋白質、瘦肉類每50 克約含蛋白質10克、谷類每市斤含蛋白質35-60克。要增加新鮮蔬菜和水果的食量。蔬菜和水果含維生素B1及維生素C,它們在體內最后代謝產物是堿性 的,尿酸在堿性尿內易于溶解,故有利于治療。常規治療:每隔1-2日用一次清涼飲食(生水果、果汁及生菜),至少每周1次清涼飲食。少食或忌用肉類、動物 內臟、肉湯、肉汁、沙丁魚、蟹、菠菜、濃茶、咖啡,烈性的香料及調味品也宜少用。
    現實生活中很多疾病的發生和日常飲食是密切相關的,如果能做到起居有時,飲食有節,甚至大部分癌癥也可能避免。現在就腎結石病這一頑癥來提醒大家如何用飲食來預防,或使已經患了腎結石者,結石增大的速度減慢,甚至縮小、溶解而排出體外。

    (一)多飲白開水 多飲水使尿液得到稀釋,鈣離子和草酸根的濃度就會降低,形成不了草酸鈣結石。研究表明,增加50%的尿量,可使腎結石發病率下降86%。

    (二)合理補鈣,尤其飲食上補鈣 腎結石患者往往“談鈣色變”,錯誤地認為腎結石的元兇是鈣,其實不然,腎結石患者也需要補鈣。目前醫學界從兩個不同的角度來解釋,腎結石患者為什么要補鈣。

    第一是補充鈣能與胃腸道中蔬菜含有的草酸結合成不溶性的草酸鈣,隨糞便排出體外,減少了部分被腸胃吸收和經腎臟排出體外的草酸,從而減少了形成腎結石的幾率。

    第二是日本學者提出的“酸堿平衡學說”。即血液呈酸性時,結石容易形成。呈堿性時,抑制結石形成。缺鈣時血液偏酸性,合理補鈣,血液偏堿,這樣反而有利于抑制結石形成。

    (三)限量攝入糖類 美國科學家最新一項研究結果表明,高糖食品的攝入,可以使患腎結石的機會增加,因此,要注意少吃甜食。

    (四)少吃草酸鹽含量高的食物 含草酸鹽高的食物有番茄、菠菜、草莓、甜菜、巧克力等,過高的草酸鹽攝入也是導致腎結石的主要原因之一。

    (五)少吃豆制品 大豆食品含草酸鹽和磷酸鹽都高,能同腎臟中的鈣融合,形成結石

    (六)睡前慎喝牛奶 睡眠不好的人,睡前喝杯牛奶有助于睡眠。但在睡眠后,尿量減少、濃縮,尿中各種有形物質增加。而飲牛奶后2~3小時,正是鈣通過腎臟排泄的高峰。鈣通過腎臟在短時間內驟然增多,容易形成結石。因此腎結石患者,睡前就不應喝含鈣高的牛奶。

    (七)勿過量服用魚肝油 魚肝油富含維生素D,有促進腸膜對鈣磷吸收的功能,驟然增加尿液中鈣磷的排泄,勢必產生沉淀,容易形成結石

    (八)多食黑木耳 黑木耳中富含多種礦物質和微量元素,能對各種結石產生強烈的化學反應,使結石剝脫、分化、溶解,排出體外。

    posted @ 2007-12-17 12:04 船夫 閱讀(1401) | 評論 (0)編輯 收藏

    XSL取得當前循環的位置

    最近在一個項目中用到了XSLT,目的是將返回的XML數據記錄通過XSL轉換為HTML,在for-each的循環中取得當前記錄的位置,通過實踐,找到了解決的辦法,主要是使用xsl的position函數
    1 <xsl:for-each select="QRoleInline-list/QRoleInline">
    2 <xsl:if test="not(position() = 1)"><xsl:text>,</xsl:text></xsl:if><xsl:value-of select="@roleName"/>
    3 </xsl:for-each>
    使用position函數可以取得當前行在循環中的位置,從1開始。上述代碼是判斷如果位置為第一個, 則需要加逗號。

    還有一個函數current()是負責取到當前節點對象的。

    posted @ 2007-12-14 11:33 船夫 閱讀(524) | 評論 (0)編輯 收藏

    走出ClassLoader迷局 --轉至sharajava的博克http://m.tkk7.com/sharajava/archive/2006/07/25/59946.html

    : 這個問題經常出現在編寫框架代碼 , 需要動態加載很多類和資源的時候 . 通常當你需要動態加載資源的時候 , 你至少有三個 ClassLoader 可以選擇 :

    2??????? 系統類加載器或叫作應用類加載器 (system classloader or application classloader)

    2??????? 當前類加載器

    2??????? 當前線程類加載器

    上面的問題指的是最后一種類加載器 . 哪種類加載器是正確的選擇呢 ?

    第一種選擇可以很容易地排除 : 系統類加載器 (system classloader). 這個類加載器處理 -classpath 下的類加載工作 , 可以通過 ClassLoader.getSystemClassLoader() 方法調用 . ClassLoader 下所有的 getSystemXXX() 的靜態方法都是通過這個方法定義的 . 在你的代碼中 , 你應該盡量少地調用這個方法 , 以其它的類加載器作為代理 . 否則你的代碼將只能工作在簡單的命令行應用中 , 這個時候系統類加載器 (system classloader) JVM 最后創建的類加載器 . 一但你把代碼移到 EJB, Web 應用或 Java Web Start 應用中 , 一定會出問題 .

    ????? 所以我們來看第二種選擇 : 當前上下文環境下的類加載器 . 根據定義 , 當前類加載器就是你當前方法所屬的類的加載器 . 在運行時類之間動態聯編 , 及調用 Class.forName,() Class.getResource() 等類似方法時 , 這個類加載器會被隱含地使用 . It is also used by syntactic constructs like X.class class literals.

    ??? 線程上下文類型加載器是在Java 2平臺上被引入的. 每一個線程都有一個類加載器與之對應(除非這個線程是被本地代碼創建的). 這個類加載器是通過Thread.setContextClassLoaser()方法設置的. 如果你不在線程構造后調用這個方法, 這個線程將從它的父線程中繼承相應的上下文類加載器. 如果在整個應用中你不做任何特殊設置, 所有的線程將都以系統類加載器(system classloader)作為自己的線程上下文類加載器. 自從WebJ2EE應用服務器使用成熟的類加載器機制來實現諸如JNDI, 線程池, 組件熱部署等功能以來, 這種在整個應用中不做任何線程類加載器設置的情況就很少了.

    ??? 為什么線程上下文類加載器存在于如此重要的位置呢? 這個概念在J2SE中的引入并不引人注目. 很多開發人員對這一概念迷惑的原因是Sun公司在這方面缺乏適當的指引和文檔.

    ??? 事實上, 上下文類加載器提供了類加載機制的后門, 這一點也在J2SE中被引入了. 通常, JVM中的所有類加載器被組織成了有繼承層次的結構, 每一個類加載器(除了引導JVM的原始類加載器)都有一個父加載器. 每當被請示加載類時, 類加載器都會首先請求其父類加載器, 只有當父類加載器不能加載時, 才會自己進行類加載.

    ?? 有時候這種類加載的順序安排不能正常工作, 通常當必須動態加載應用程序開發人員提供的資源的時候. JNDI為例: 它的內容(J2SE1.3開始)就在rt.jar中的引導類中實現了, 但是這些JNDI核心類需要動態加載由獨立廠商實現并部署在應用程序的classpath下的JNDI提供者. 這種情況就要求一個父classloader(本例, 就是引導類加載器)去加載對于它其中一個子classloader(本例, 系統類加載器)可見的類. 這時通常的類加載代理機制不能實現這個要求. 解決的辦法(workaround)就是, JNDI核心類使用當前線程上下文的類加載器, 這樣, 就基本的類加載代理機制的相反方向建立了一條有效的途徑.

    ??? 另外, 上面一段可能讓你想起一些其它的事情: XML解析Java API(JAXP). 是的, JAXP只是J2SE的擴展進, 它很自然地用當前類加載器來引導解析器的實現. 而當JAXP被加入到J2SE1.4的核心類庫中時, 它的類加載也就改成了用當前線程類加載器, JNDI的情況完全類似(也使很多程序員很迷惑). 明白為什么我說來自Sun的指導很缺乏了吧?

    ?? 在以上的介紹之后, 我們來看關鍵問題: 這兩種選擇(當前類加載器和當前線程類加載器)都不是在所有環境下都適用. 有些人認為當前線程類加載器應該成為新的標準策略. 但是, 如果這樣, 當多個線程通過共享數據進行交互的時, 將會呈現出一幅極其復雜的類加載的畫面, 除非它們全部使用了同一個上下文的類加載器. 進一步說, 在某些遺留下來的解決方案中, 委派到當前類加載器的方法已經是標準. 比如對Class.forName(String)的直接調用(這也是我為什么推薦盡量避免對這個方法進行調用的原因). 即使你努力去只調用上下文相關的類加載器, 仍然會有一些代碼會不由你控制. 這種不受控制的類加載委派機制是混入是很危險的.

    ??? 更嚴重的問題, 某些應用服務器把環境上下文及當前類加載器設置到不同的類加載器實例上, 而這些類加載器有相同的類路徑但卻沒有委派機制中的父子關系. 想想這為什么十分可怕. 要知道類加載器定義并加載的類實例會帶有一個JVM內部的ID. 如果當前類加載器加載一個類X的實例, 這個實例調用JNDI查找類Y的實例, 些時的上下文的類加載器也可以定義了加載類Y實例. 這個類Y的定義就與當前類加載器看到的類Y的定義不同. 如果進行強制類型轉換, 則產生異常.

    ?? 這種混亂的情況還將在Java中存在一段時間. 對于那些需要動態加載資源的J2SEAPI, 我們來猜想它們的類加策略. 例如:

    ????????? JNDI 使用線程上下文類加載器

    ????????? Class.getResource() Class.forName()使用當前類加載器

    ????????? JAXP(J2SE 1.4 及之后)使用線程上下文類加載器

    ????????? java.util.ResourceBundle 使用調用者的當前類加載器

    ????????? URL protocol handlers specified via java.protocol.handler.pkgs system property are looked up in the bootstrap and system classloaders only

    ????????? Java 序列化API默認使用調用者當前的類加載器

    這些類及資源的加載策略問題, 肯定是J2SE領域中文檔最及說明最缺乏的部分了.

    posted @ 2006-07-27 15:23 船夫 閱讀(313) | 評論 (0)編輯 收藏

    看星星的日子

    今天晚上吃完晚飯,往回走的路上,不經意間抬頭,看到了很多的星星,我跟同事都停下腳步,抬頭分辨哪個是北極星,哪里是北斗七星,聊得非常興起。
    想起來自從到了成都之后,算上這次都只看過兩次星星,第一次是大一軍訓的時候,在華陽看到的,第二次就是今天晚上了。成都市里面不要指望會看到星星,因為濃密的云把所有的星星都遮住了。
    昨天聽老唐說他看到夜空中有一條“白帶”,他說好像是銀河,他之前從來都沒有看過銀河,跟他比起來我真可以算是幸運多了。小時候,到了夏天,家里人和鄰居都跑到院子里面納涼,我就躺在母親的懷里面,邊享受母親扇子帶來的涼爽,邊抬頭看星星,東北的星空真的是非常清晰,那時候,母親給我講哪個是銀河,哪個是牛郎織女,哪個是勺子星(北斗七星),還給我講牛郎織女的故事,說一到了七月初七就會下雨,那是因為牛郎和織女相會的淚水,還說從來沒說過謊的小孩子趴在黃瓜架下面可以聽到他們的哭聲,想想現在認識的那幾顆星星都是那個時候記下來的,書本上學的好像都不知道被我丟到哪里去了。那時候看到的星空現在回想起來真的是非常漂亮,就像冰心在繁星中描述的一樣。
    已經很多年沒在家里面過夏天了,過年的時候倒是有回去,但是天氣太冷,實在沒那種興致去看星星。
    長大了,反而覺得快樂只存在于回憶中了,這是成長的代價嗎?

    posted @ 2006-07-25 23:53 船夫 閱讀(263) | 評論 (0)編輯 收藏

    惰性已經在充分的滋長

    已經封閉開發了近三個月了,由剛開始的熱情高漲到現在的熱情全無,我已經逐漸被自己的惰性所吞噬,已經快慢慢的丟失了真正的自我。

    經過了這么一段時間,曾經對新技術非常感興趣的我已經完全失去了這種熱情。

    知恥而后勇,我要克服自己的這種情緒,重新開始,用嶄新的眼光去對待每一天

    posted @ 2006-07-25 23:22 船夫 閱讀(227) | 評論 (0)編輯 收藏

    項目中遇到的一個Spring事務管理的問題

    今天從CVS上checkout項目的時候,出現了一個問題,我以前寫的模塊功能本來是好的,但是checkout之后就出了問題,我想一定是配置文件更新出錯了,努力尋找,發現沒有問題.后來經同事說他更改了一個方法,而我的代碼中有對那個方法的調用,終于知道了問題的所在.
    程序中拋出的異常是
    java.lang.IllegalStateException:?No?value?for?key?[org.hibernate.impl.SessionFactoryImpl@7a3d45f0]?bound?to?thread?[Servlet.Engine.Transports?:?0]
    我發現是在我spring的sevice方法中調用了他的方法,他的方法又調用了另一個service方法,導致出現了這個問題.

    這個問題只要把他的那個方法修改一下,或者從我的service方法中移出就可以解決.

    我想spring中肯定應該有些配置能使兩個service方法處于同一個事務中,但是我還沒找到.希望知道的高手能提點一下,謝謝

    posted @ 2006-07-24 18:40 船夫 閱讀(655) | 評論 (0)編輯 收藏

    在WSAD 5.1中使用log4j遇到的問題

    使用log4j作為日志輸出工具,設置根級別為warn,然后分別設置了hibernate和spring等的級別為debug,自己項目的級別也設置為debug,但是很奇怪的事情出現了:
    我啟動wasd的測試服務器,打出來的日志只有我本項目的debug級以上的信息,spring和hibernate的都打不出來;
    我使用main函數運行我項目中的一個方法,所有的debug信息,spring和hibernate以及我本項目的debug信息一樣都沒少。
    我的配置是絕對沒有問題的,我實在想不出來怎么會出現這種問題,見鬼了,哪位高手遇到過這種情況,告知一下解決方法,謝謝

    posted @ 2006-07-21 01:23 船夫 閱讀(554) | 評論 (4)編輯 收藏

    好久沒有思考過什么了,整個大腦都仿佛已經失去了這個能力,每天忙著要么是做項目,要么就是忙著發呆,發呆自己能想些什么,做些什么,腦袋真的已經生銹了。
    整個人再也沒有高中時候的那種反應,看來這個大學讀的是虧了,直到現在還改變不了這種壞習慣。其實我很清楚,我這樣對自己說完全是找個借口,這樣才能使自己感到沒有那么的空虛,少些對自己的自責。不過我發現,很久以來,都沒有那種自責的心理了,不會在為自己的懶散感到自責,真的是很奇怪,在高中的時候,中午或周末多玩兒了一會兒,或是做錯了一道不該做錯的題,都會感到非常的愧疚,為此而一直自責。現在長大了,每天充斥在腦子里面的都是,怎樣才能賺錢,學什么才能讓自己更加有發展,思考的越來越現實,反而發現自己的動力越來越不足,天哪,我是怎么了?
    買房子,結婚?現實圍繞在我的身邊,把我壓得好緊,女友說我脾氣太好,沒有男子氣概?難道我對她發脾氣才是好的嗎?兩地分居,為了生活出去奔波,希望能賺回來一棟房子,難道我愿意嗎?她爸和她媽對我的印象也不是很好,我知道我這個人太笨了,不會說話,不會討別人喜歡,啊~~~~~~~~~~~我實在是受不了了,我已經對自己失望透頂了,誰能告訴我這個時候應該能做什么?????
    我要改變這一切,我要改變自己,我要提高自己的能力,我要改變他人對我的看法,我要做一個讓所有人都滿意的人,我他媽的是為了什么活得這么累啊,愛情,不是應該兩個人之間事嗎?干嘛有那么多外在因素要影響我呢?
    25歲,這個世界讓我變得衰老~~~

    posted @ 2006-07-21 01:14 船夫 閱讀(203) | 評論 (0)編輯 收藏

    表的外鍵約束[ZT]

    1。創建測試表
    SQL> create table lesson(lesson_name varchar2(20), classroom varchar2(10));

    表已創建。

    SQL> create table teacher(name varchar2(20),lesson_name varchar2(20));

    表已創建。

    SQL> alter table lesson add constraint pk_lesson primary key(lesson_name);

    表已更改。

    SQL> alter table teacher add constraint fk_lessonname foreign key(lesson_name)
    2 references lesson(lesson_name);

    表已更改。


    2。插入測試數據
    SQL> insert into lesson values('english','class 1');

    已創建 1 行。

    SQL> insert into lesson values('music','class 2');

    已創建 1 行。


    3。測試有外鍵的字段是否可以為空
    SQL> insert into teacher values('wang','hello');
    insert into teacher values('wang','hello')
    *
    ERROR 位于第 1 行:
    ORA-02291: 違反完整約束條件 (SYSTEM.FK_LESSONNAME) - 未找到父項關鍵字

    SQL> insert into teacher values('wang','music');

    已創建 1 行。

    SQL> insert into teacher values('wang',null);

    已創建 1 行。


    結論:有外鍵約束的字段可以為空。如果不為空的話,則一定要滿足外鍵的約束關系

    posted @ 2006-03-16 15:44 船夫 閱讀(325) | 評論 (0)編輯 收藏

    outer和left outer join有什么區別??

    outer和left outer join有什么區別??

    使用關系代數合并數據
    1 關系代數
    合并數據集合的理論基礎是關系代數,它是由E.F.Codd于1970年提出的。
    在關系代數的形式化語言中:
    ?        用表、或者數據集合表示關系或者實體。
    ?        用行表示元組。
    ?        用列表示屬性。
    關系代數包含以下8個關系運算符
    ?        選取――返回滿足指定條件的行。
    ?        投影――從數據集合中返回指定的列。
    ?        笛卡爾積――是關系的乘法,它將分別來自兩個數據集合中的行以所有可能的方式進行組合。
    ?        并――關系的加法和減法,它可以在行的方向上合并兩個表中的數據,就像把一個表壘在另一個表之上一樣。
    ?        交――返回兩個數據集合所共有的行。
    ?        差――返回只屬于一個數據集合的行。
    ?        連接――在水平方向上合并兩個表,其方法是:將兩個表中在共同數據項上相互匹配的那些行合并起來。
    ?        除――返回兩個數據集之間的精確匹配。
    此外,作為一種實現現代關系代數運算的方法,SQL還提供了:
    ?        子查詢――類似于連接,但更靈活;在外部查詢中,方式可以使用表達式、列表或者數據集合的地方都可以使用子查詢的結果。
    本章將主要講述多種類型的連接、簡單的和相關的子查詢、幾種類型的并、關系除以及其他的內容。
    2 使用連接
    2.1 連接類型
    在關系代數中,連接運算是由一個笛卡爾積運算和一個選取運算構成的。首先用笛卡爾積完成對兩個數據集合的乘運算,然后對生成的結果集合進行選取運算,確保只把分別來自兩個數據集合并且具有重疊部分的行合并在一起。連接的全部意義在于在水平方向上合并兩個數據集合(通常是表),并產生一個新的結果集合,其方法是將一個數據源中的行于另一個數據源中和它匹配的行組合成一個新元組。
    SQL提供了多種類型的連接方式,它們之間的區別在于:從相互交疊的不同數據集合中選擇用于連接的行時所采用的方法不同。
    連接類型        定義
    內連接        只連接匹配的行
    左外連接        包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行
    右外連接        包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行
    全外連接        包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。
    (H)(theta)連接        使用等值以外的條件來匹配左、右兩個表中的行
    交叉連接        生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行都一一匹配
    在INFORMIX中連接表的查詢
    如果FROM子句指定了多于一個表引用,則查詢會連接來自多個表的行。連接條件指定各列之間(每個表至少一列)進行連接的關系。因為正在比較連接條件中的列,所以它們必須具有一致的數據類型。
    SELECT語句的FROM子句可以指定以下幾種類型的連接
    FROM子句關鍵字        相應的結果集
    CROSS JOIN        笛卡爾乘積(所有可能的行對)
    INNER JOIN        僅對滿足連接條件的CROSS中的列
    LEFT OUTER JOIN        一個表滿足條件的行,和另一個表的所有行
    RIGHT OUTER JOIN        與LEFT相同,但兩個表的角色互換
    FULL OUTER JOIN        LEFT OUTER 和 RIGHT OUTER中所有行的超集

    2.2 內連接(Inner Join)
    內連接是最常見的一種連接,它頁被稱為普通連接,而E.FCodd最早稱之為自然連接。
    下面是ANSI SQL-92標準
    select *
    from  t_institution i
    inner join t_teller t
    on i.inst_no = t.inst_no
    where i.inst_no = "5801"
    其中inner可以省略。
    等價于早期的連接語法
    select *
    from t_institution i, t_teller t
    where i.inst_no = t.inst_no
    and i.inst_no = "5801"

    2.3 外連接
    2.3.1        左外連接(Left Outer Jion)
    select *
    from  t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    其中outer可以省略。
    2.3.2        右外連接(Rigt Outer Jion)
    select *
    from  t_institution i
    right outer join t_teller t
    on i.inst_no = t.inst_no
    2.3.3        全外連接(Full Outer)
    全外連接返回參與連接的兩個數據集合中的全部數據,無論它們是否具有與之相匹配的行。在功能上,它等價于對這兩個數據集合分別進行左外連接和右外連接,然后再使用消去重復行的并操作將上述兩個結果集合并為一個結果集。
    在現實生活中,參照完整性約束可以減少對于全外連接的使用,一般情況下左外連接就足夠了。在數據庫中沒有利用清晰、規范的約束來防范錯誤數據情況下,全外連接就變得非常有用了,你可以使用它來清理數據庫中的數據。
    select *
    from  t_institution i
    full outer join t_teller t
    on i.inst_no = t.inst_no
    2.3.4        外連接與條件配合使用
    當在內連接查詢中加入條件是,無論是將它加入到join子句,還是加入到where子句,其效果是完全一樣的,但對于外連接情況就不同了。當把條件加入到join子句時,SQL Server、Informix會返回外連接表的全部行,然后使用指定的條件返回第二個表的行。如果將條件放到where子句中,SQL Server將會首先進行連接操作,然后使用where子句對連接后的行進行篩選。下面的兩個查詢展示了條件放置位子對執行結果的影響:
    條件在join子句
    select *
    from  t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    and i.inst_no = “5801”
    結果是:
    inst_no    inst_name            inst_no    teller_no  teller_name
    5801       天河區               5801       0001       tom
    5801       天河區               5801       0002       david
    5802       越秀區
    5803       白云區
    條件在where子句
    select *
    from  t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    where i.inst_no = “5801”
    結果是:
    inst_no    inst_name            inst_no    teller_no  teller_name
    5801       天河區               5801       0001       tom
    5801       天河區               5801       0002       david

    2.4 自身連接
    自身連接是指同一個表自己與自己進行連接。這種一元連接通常用于從自反關系(也稱作遞歸關系)中抽取數據。例如人力資源數據庫中雇員與老板的關系。
    下面例子是在機構表中查找本機構和上級機構的信息。
    select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
    from t_institution i
    join t_institution s
    on i.superior_inst = s.inst_no

    結果是:
    superior_inst sup_inst_name        inst_no    inst_name
    800           廣州市               5801       天河區
    800           廣州市               5802       越秀區
    800           廣州市               5803       白云區

    2.5 交叉(無限制) 連接
    交叉連接用于對兩個源表進行純關系代數的乘運算。它不使用連接條件來限制結果集合,而是將分別來自兩個數據源中的行以所有可能的方式進行組合。數據集合中一的每個行都要與數據集合二中的每一個行分別組成一個新的行。例如,如果第一個數據源中有5個行,而第二個數據源中有4個行,那么在它們之間進行交叉連接就會產生20個行。人們將這種類型的結果集稱為笛卡爾乘積。
    大多數交叉連接都是由于錯誤操作而造成的;但是它們卻非常適合向數據庫中填充例子數據,或者預先創建一些空行以便為程序執行期間所要填充的數據保留空間。
    select *
    from  t_institution i
    cross join t_teller t
    在交叉連接中沒有on條件子句

    3 APPENDIX
    3.1 A 參考資料與資源
    ?        《Microsoft SQL Server 2000 Bile》Paul Nielsen
    ?        Paul Nielsen的Web站點
    www.isnotnull.com
    3.2 注文章所有SQL在IBM Informix Dynamic Server Version 9.40.TC2E1測試通過

    posted @ 2006-03-06 13:02 船夫 閱讀(1643) | 評論 (0)編輯 收藏

    HTML中Target的四個保留字

    _parent:在當前FRAMESET位置顯示新href。  
    _top:在當前整個窗口位置顯示新href,比如本身FRAMESET位于另一個FRAMESET中。  
    _self:強制在當前FRAME中顯示新href。  
    _blank:在新窗口中顯示href

    posted @ 2005-12-21 09:40 船夫 閱讀(2036) | 評論 (0)編輯 收藏

    java實現文件傳輸

         摘要:   1import java.awt.*;   2import java.awt.event.*;   3import javax.swing.*;   4import javax.swing.event.*;   5i...  閱讀全文

    posted @ 2005-12-20 11:22 船夫 閱讀(3056) | 評論 (5)編輯 收藏

    Document 和 Document.all 分別什么時候用

    如果與a,form對象,image對象,applet對象相對應的html標記中設定了name性質,它的值將被用作document對象的屬性名,用來引用相應的對象,其他的對象則不可以。

      另外,input等如果作為form的子元素,則直接用inputName或者document.inputName來引用此對象就是錯誤的,必須使用formName.inputName引用,否則就可以使用inputName來引用.

      另外應該注意到有很多平時用的元素都沒有name.

      如果想引用一個有id的元素,只能用Id或者document.getElementById,document.all.id來引用
    但是象這樣的元素,所以象<a href="......" name="linkname" id="linkid">......</a>這樣的
    可以用

    linkid.href;
    linkname.href;
    document.all.linkid.href;
    document.all.linkname.href;
    document.getElementById("linkid").href;
    document.getElementsByName("linkname")[0].href來引用

      all是一個集合,包含所有html對像的集合,寫一個程式,可以存取到所有的對像。像這樣:

    <script language="javascript">
    var obj="";
    for(i=0;i<document.all.length;i++)
    obj+=document.all[i].tagName+";";
    alert(obj);
    </script>

      注意要把程式放到</html>之后哦。

    作者:  來源:CSDN

    posted @ 2005-12-20 10:24 船夫 閱讀(678) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 久久精品国产亚洲一区二区三区| 永久免费看bbb| 亚洲av女电影网| 免费福利电影在线观看| 久久久久久a亚洲欧洲aⅴ| a级毛片无码免费真人久久| 国产成人A亚洲精V品无码| 黄网站免费在线观看| 亚洲自偷自拍另类12p| 日本最新免费网站| 亚洲中文字幕无码一去台湾| 好男人看视频免费2019中文 | EEUSS影院WWW在线观看免费| 久久久久久亚洲精品不卡| 中国一级特黄的片子免费| 久久久久久亚洲精品| 亚洲精品免费在线视频| 亚洲色大成网站WWW国产| 哒哒哒免费视频观看在线www| 污视频网站免费观看| 亚洲人成亚洲人成在线观看| 久久免费福利视频| 中国china体内裑精亚洲日本| 免费一级毛片不卡在线播放| a毛看片免费观看视频| 亚洲人成在久久综合网站| 成人永久免费高清| a毛片免费全部播放完整成| 亚洲免费福利视频| 亚洲国产成人a精品不卡在线| 四虎影视成人永久免费观看视频 | 亚洲AV一区二区三区四区| 亚洲综合AV在线在线播放| 久久久久久精品免费免费自慰| 亚洲国产精品无码久久| 亚洲色成人中文字幕网站| 亚洲精品动漫免费二区| 国产成人无码免费网站| 亚洲成a人片在线看| 亚洲午夜久久久久久久久电影网 | 国产精品无码免费视频二三区|