<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                > 前面講了servlet入門實踐現在開始介紹jsp入門實踐,開發環境的搭建請參考我前面的tomcat的文章,jsp入門教程分為上下兩部分,第一部分簡單講解:jsp語法的規范,以及三大編譯指令,七個動作指令和九大內置對象,生命周期講解等。 全部代碼下載:[鏈接](http://download.csdn.net/detail/peace1213/9303561) ### 1.jsp簡介: JSP全名為Java Server Pages,中文名叫java服務器頁面,其根本是一個簡化的Servlet設計,它[1] 是由Sun Microsystems公司倡導、許多公司參與一起建立的一種動態網頁技術標準。JSP技術有點類似ASP技術,它是在傳統的網頁HTML(標準通用標記語言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而形成JSP文件,后綴名為(*.jsp)。 用JSP開發的Web應用是跨平臺的,既能在Linux下運行,也能在其他操作系統上運行。 **第一個jsp程序:** 1. 在eclipse中建立動態web工程 2. 在WebContent上右擊建立jsp文件 3. 在jsp文件中輸入如下: ~~~ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% out.print("hello peace"); %> </body> </html> ~~~ 1. 在瀏覽器中輸入如下:[http://localhost:8080/](http://localhost:8080/)工程名/NewFile.jsp 顯示如下: ![01](https://box.kancloud.cn/2016-04-13_570e001229769.png "") 1. JSP作為servlet的變體,jsp的文件會被翻譯成servlet文件:文件位置為Tomcat按住給你目錄:apache-tomcat-7.0.64/work/Catalina/localhost/stuJsp/org/apache/jsp ![02](https://box.kancloud.cn/2016-04-13_570e00123ed5f.png "") 打開java文件可以看到該文件根servlet的文件類似:有_jspInit(),jspDestroy(),_jspService()方法。并將jsp文件中的代碼生成了_jspService()方法中的代碼 ![03](https://box.kancloud.cn/2016-04-13_570e0012528f7.png "") ### 2.JSP語法: #### 2.1.JSP腳本: ????腳本程序,就是為了在HTML中穿插java代碼,可以包含任意語法真確的java語句,變量,方法或表達式。生成servlet源碼時該處的代碼被放到_jspService()方法中 1. 腳本程序的語法: <% 代碼片段 %> 就像第一個jsp程序那樣 ~~~ <% out.print("hello peace"); %> ~~~ 1. **注意**:腳本中不能出現標簽和jsp元素,記住只能寫java就行;但是可以穿插寫:如下: ~~~ <% for(int i=0;i<5;i++) { out.print("hello peace"+i); %> <br/> <% out.print("換行符穿插在中間了,一樣會被循環輸出"); }//for循環結束 %> ~~~ #### 2.2.JSP聲明: ????一個聲明語句可以聲明一個或多個變量、方法,供后面的Java代碼使用。在JSP文件中,您必須先聲明這些變量和方法然后才能使用它們。生成servlet源碼時該處的代碼成為類的屬性和方法; 1. JSP聲明的語法: <%! declaration; [ declaration; ]+ … %> 2. 演示如下: ~~~ <%! private int i=10; %> <%! public void test(){ int a=0; int b=2; a=a+b; System.out.print(a); } %> ~~~ 1. 查看生成的servlet文件可以知道剛才在jsp聲明的變量和方法,成為了相應的屬性和方法 #### 2.3JSP表達式: ????一個JSP表達式中包含的腳本語言表達式,先被轉化成String,然后插入到表達式出現的地方,作用相當于腳本中的out(輸出) 由于表達式的值會被轉化成String,所以您可以在一個文本行中使用表達式而不用去管它是否是HTML標簽。 表達式元素中可以包含任何符合Java語言規范的表達式,但是不能使用分號來結束表達式。 生成servlet源碼時該處的代碼被放到_jspService()方法中 1. JSP表達式的語法格式 <%= 表達式 %> 2. 演示如下: ~~~ <%--在腳本處聲明的變量是局部變量不能帶有修飾符 --%> <% String nick="sisi"; int a=10,b=10; %> 3.jsp表達式:<br/> <%--表達式可以輸出相當于out.write 不需要分號結束--%> <%=(a-b) %> <%=nick %> <hr/> ~~~ #### 2.4JSP注釋: ????JSP注釋不會出現在html的源碼中 可以用來注釋jsp的代碼,html注釋會出現在html的源碼中; 1. JSP注釋的語法格式: <%– 這里可以填寫 JSP 注釋 –%> 2. 演示如下: ~~~ 1.jsp注釋:<br/> <%-- 這些注釋不會出現在html的源碼中 可以用來注釋jsp的代碼--%> ~~~ ### 3.三大編譯指令: JSP編譯指令用來設置與整個JSP頁面相關的屬性; 主要有三大編譯指令: ~~~ <%@ page ... %> 定義頁面的依賴屬性,比如腳本語言、error頁面、緩存需求等等 <%@ include ... %> 包含其他文件 <%@ taglib ... %> 引入標簽庫的定義,可以是自定義標簽 ~~~ ### 3.1page指令介紹: Page指令為容器提供當前頁面的使用說明。一個JSP頁面可以包含多個page指令。 1. Page指令的語法格式: <%@ page attribute=”value” %> 2. 屬性: ![04](https://box.kancloud.cn/2016-04-13_570e00127c6db.png "") 3. 演示如下: ~~~ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.Random"%> ~~~ ### 3.2include指令介紹:(靜態包含) JSP可以通過include指令來包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分,會被同時編譯執行。 1. Include指令的語法格式如下: <%@ include file=”url” %> 2. Include指令中的文件名實際上是一個相對的URL。如果您沒有給文件關聯一個路徑,JSP編譯器默認在當前路徑下尋找。 3. 演示如下: ~~~ <%-- 1.原理是把被包含的頁面(header.jsp) 的內容翻譯到包含頁面(index.jsp)中,合并成翻譯成一個java源文件, 再編譯運行!!,這種包含叫靜態包含(源碼包含) 2.被包含頁面中不需要出現全局的html標簽了!!! (如html、head、body)--%> <%@include file="/common/header.jsp"%> ~~~ ### 3.3taglib指令介紹: JSP API允許用戶自定義標簽,一個自定義標簽庫就是自定義標簽的集合。Taglib指令引入一個自定義標簽集合的定義,包括庫路徑、自定義標簽。 1. taglib指令的語法: <%@ taglib uri=”uri” prefix=”prefixOfTag” %> 2. uri為屬性確定的標簽位置,prefix屬性指定標簽庫的前綴。此處后面會進一步介紹; 3. 演示如下: ~~~ 自己定義的標簽庫 <%@ taglib uri="http://rlovep.com" prefix="rlovep" %> ~~~ ### 4.七大動作指令介紹: 動作指令與編譯指令不同,編譯指令時通知servlet引擎的處理消息,而動作指令只是運行時的動作。編譯指令在將JSP編譯成Servlet時起作用,而處理指令通常可替換成JSP腳本,它只是JSP腳本的標準化寫法。 (1)JSP:forward 執行頁面轉向,將請求的處理轉發到下一個頁面。 (2)JSP:param 用于傳遞參數,必須與其他支持參數的標簽一起使用 (3)JSP:include 用于動態引入一個JSP頁面 (4)JSP:plugin 用于下載JavaBean或者Applet到客戶端執行 (5) JSP:useBean 創建一個Javabean實例 (6) JSP:setProperty 設置JavaBean實例的屬性值 (7)JSP:getProperty 獲取JavaBean實例的屬性值 ### 4.1jsp:forward指令  jsp:forward動作把請求轉到另外的頁面。jsp:forward標記只有一個屬性page。 1. 語法格式如下所示: 2. page屬性:page屬性包含的是一個相對URL。page的值既可以直接給出,也可以在請求的時候動態計算,可以是一個JSP頁面或者一個 Java Servlet. 3. 執行forward指令時,用戶請求的地址依然沒有發生改變,仍然是一次請求,但頁面內容完全變為被forward目標頁的內容。執行forward指令轉發請求時,客戶端的請求參數不會丟失。類似于servlet中的 getRequestDispatcher(“/GetData”).forward(request, response); 4. 可以附帶增加額外的請求參數:配合JSP:param動作指令 ~~~ <%--轉發 jsp:foward 參數 jsp:param <jsp:forward page="/action2.jsp"> <jsp:param value="peace" name="name"/> <jsp:param value="123456" name="pass"/> </jsp:forward> --%> ~~~ ### 4.2jsp:include指令(動態包含) jsp:include>動作元素用來包含靜態和動態的文件。該動作把指定文件插入正在生成的頁面 1. 語法格式如下: 2. 前面介紹過include的編譯指令與前面不同的是這里的是動態包含,靜態包含是在JSP文件被轉換成Servlet的時候引入文件,而這里的jsp:include動作不同,插入文件的時間是在頁面被請求的時候。如果被包含的頁面是jsp一樣會另一個生成servlet; 3. 屬性介紹: page:被包含頁面的url flush:布爾屬性,定義在包含資源前是否刷新緩存區。 4. 可以附帶增加額外的請求參數:配合JSP:param動作指令 ~~~ <%--動態包括 --%> 動態包括: <jsp:include page="/common/header1.jsp"> <jsp:param value="lucc" name="name"/> </jsp:include> ~~~ ![05](https://box.kancloud.cn/2016-04-13_570e00129aae4.png "") ### 4.3jsp:userBean,setProperty,getProperty指令 這三個指令都是與JavaBean相關的指令,其中userBean指令用于在JSP頁面中初始化一個java實例,setProperty指令用于為JavaBean實例的屬性設置值;getProperty指令用于輸出JavaBean實例的屬性。 1. jsp:useBean動作簡單的語法為: 其中,id屬性是JavaBean的實例名,class屬性確定JavaBean的實現類。scope屬性用于指定JavaBean實例的作用范圍。 2. jsp:setProperty的語法格式: 其中,name屬性是要確定JavaBean的實例名,property屬性要確定設置屬性的屬性名,value屬性時要確定屬性名對應的值。 3. jsp:getProperty的語法格式: 其中,name屬性時要確定JavaBean的實例名,name屬性是指定要獲取的屬性名對應的值。 4. 演示如下: ~~~ <%--useBean setProperty getProperty --%> <%--創建Student的實例 實例名稱為student 屬性范圍為page --%> <hr/> <jsp:useBean id="student" class="com.rlovep.entity.Student" scope="page"/> <%--設置student的name值 --%> <jsp:setProperty name="student" property="name" value="peace"/> <%--輸出 student的name值--%> name:<jsp:getProperty name="student" property="name" /> ~~~ ### 4.3jsp:param,plugin指令 param用于設置參數值,這個指令本身不能單獨使用,因此單獨的param指令沒有實際意義,param指令可以與以下指令結合使用 jsp:include jsp:forward jsp:plugin。使用方法上面已經介紹; plugin指令主要用于下載服務器端的JavaBean或Applet到到客戶端執行,由于程序在客戶端執行,因此客戶端必須安裝虛擬機。該指令用處較少,不做介紹; ### 4.4整體演示如下: 需要建立,action.jsp本文件,以級轉發頁面action2.jsp,被包含頁面/common/header1.jsp,JavaBean:Student類 ~~~ <%--轉發 jsp:foward 參數 jsp:param <jsp:forward page="/action2.jsp"> <jsp:param value="peace" name="name"/> <jsp:param value="123456" name="pass"/> </jsp:forward> --%> <%--動態包括 --%> 動態包括: <jsp:include page="/common/header1.jsp"> <jsp:param value="lucc" name="name"/> </jsp:include> <%--useBean setProperty getProperty --%> <%--創建Student的實例 實例名稱為student 屬性范圍為page --%> <hr/> <jsp:useBean id="student" class="com.rlovep.entity.Student" scope="page"/> <%--設置student的name值 --%> <jsp:setProperty name="student" property="name" value="peace"/> <%--輸出 student的name值--%> name:<jsp:getProperty name="student" property="name" /> ~~~ ### 5. 9大內置對象介紹 JSP腳本中包含9個內置對象,這9個內置對象都是Servlet API接口的實例,只是JSP規范對他們默認進行了初始化(由JSP頁面對應的Servlet的_jspService()方法來創建這些實例)。也就是它們已經是對象,可以直接使用。 ![06](https://box.kancloud.cn/2016-04-13_570e0012b5bdc.png "") JSP初始化該9個對象的地方可以通過生成的servlet類看到如下: ![07](https://box.kancloud.cn/2016-04-13_570e0012d87b1.png "") request、response兩個對象是_jspService()方法的形參,當Tomcat調用該方法時會初始化這兩個對象。而page、pageContext、application、config、session、out都是_jspService()方法的局部變量,由該方法完成初始化。 ### 5.1稍簡單再介紹:詳細介紹可以觀看我的[Servlet入門實踐](http://rlovep.com/2015/10/21/Servlet%E5%85%A5%E9%97%A8%E5%AE%9E%E8%B7%B5/) 1. application:javax.servlet.ServletContext的實例,該實例代表JSP所屬的Web應用本身,可用于JSP頁面,或者在Servlet之間交換信息。常用的方法有getAttribute(StringattName)、setAttribute(String attName , String attValue)和getInitParameter(StringparamName)等。 1. config:javax.servlet.ServletConfig的實例,該實例代表該JSP的配置信息。常用的方法有getInitParameter(StringparamName)和getInitParameternames()等方法。事實上,JSP頁面通常無須配置,也就不存在配置信息。因此,該對象更多地在Servlet中有效。 1. exception:java.lang.Throwable的實例,該實例代表其他頁面中的異常和錯誤。只有當頁面是錯誤處理頁面,即編譯指令page的isErrorPage屬性為true時,該對象才可以使用。常用的方法有getMessage()和printStackTrace()等。 1. out:javax.servlet.jsp.JspWriter的實例,該實例代表JSP頁面的輸出流,用于輸出內容,形成HTML頁面。 1. page:代表該頁面本身,通常沒有太大用處。也就是Servlet中的this,其類型就是生成的Servlet類,能用page的地方就可用this。 1. pageContext:javax.servlet.jsp.PageContext的實例,該對象代表該JSP頁面上下文,使用該對象可以訪問頁面中的共享數據。常用的方法有getServletContext()和getServletConfig()等。這個對象存儲了request對象和response對象的引用。application對象,config對象,session對象,out對象可以通過訪問這個對象的屬性來導出。PageContext類定義了一些字段,包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。它也提供了40余種方法,有一半繼承自javax.servlet.jsp.JspContext 類。其中一個重要的方法就是removeArribute(),它可接受一個或兩個參數。比如,pageContext.removeArribute(“attrName”)移除四個scope中相關屬性,但是下面這種方法只移除特定scope中的相關屬性: pageContext.removeAttribute(“attrName”, PAGE_SCOPE); 1. request:javax.servlet.http.HttpServletRequest的實例,該對象封裝了一次請求,客戶端的請求參數都被封裝在該對象里。這是一個常用的對象,獲取客戶端請求參數必須使用該對象。常用的方法有getParameter(String paramName)、getParameterValues(StringparamName)、setAttribute(String 8. 8/ attrName,Object attrValue)、getAttribute(StringattrName)和setCharacterEncoding(String env)等。 1. response:javax.servlet.http.HttpServletResponse的實例,代表服務器對客戶端的響應。通常很少使用該對象直接響應,而是使用out對象,除非需要生成非字符響應。而response對象常用于重定向,常用的方法有getOutputStream()、sendRedirect(java.lang.String location)等。 1. session:javax.servlet.http.HttpSession的實例,該對象代表一次會話。當客戶端瀏覽器與站點建立連接時,會話開始;當客戶端關閉瀏覽器時,會話結束。常用的方法有:getAttribute(String attrName)、setAttribute(StringattrName, Object attrValue)等。 ### 5.2四個域對象: 1. 四個域對象: pageContext——– page域 request ——– request域 session——– session域 application ——–context域 1. 域對象作用: 保存數據 和 獲取數據 ,用于數據共享。 1. 域對象方法: setAttribute(“name”,Object) 保存數據 getAttribute(“name”) 獲取數據 removeAttribute(“name”) 清除數據 1. 域對象作用范圍: page域: 只能在當前jsp頁面中使用(當前頁面) request域: 只能在同一個請求中使用(轉發) session域: 只能在同一個會話(session對象)中使用(私有的) context域: 只能在同一個web應用中使用。(全局的) ### 5.3 整體演示如下: ~~~ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%--out對象:對應jspwriter --%> <% /* for(int i=0;i<=1024;i++){ out.write("a"); } System.out.println("當前緩存區大小:"+out.getBufferSize()); System.out.println("剩余緩存區大小:"+out.getRemaining()); */ //如果不刷新則,123先輸出; //out.flush(); response.getWriter().write("123"); %> <%-- application對象:對應servlet中的context 存儲的屬性,是整個應用共享的;同樣可以獲得配置參數; --%> <% //存儲屬性 application.setAttribute("name", "peace"); %> <%=application.getInitParameter("keys") %> <%-- config對象:對應servlet中的config 用處不是很大 --%> <%=config.getServletName() %> <%-- exception對象:在錯誤頁面中有效,可以獲得異常屬性 親發生錯誤:該對象只有當編譯指令page的isErrorPage="true"才有效 <%=exception.getMessage() %> --%> <%-- request對象:對應servlet中的request --%> <%=request.getLocalName() %> <%-- response對象:對應servlet中的response --%> <% response.getWriter().println("hello respose"); %> <%-- session對象:對應servlet中的session --%> <% session.setAttribute("pass", "567"); %> <%-- pagecontext對象:jsp的頁面對象 可以獲得其他八個對象: --%> <% //獲得其他對象 response.getWriter().write("是否相等?"+(out==pageContext.getOut())+"<br/>"); %> <%--可以往不同的域中存對象 --%> <% pageContext.setAttribute("message", "wang"); pageContext.setAttribute("age", "22", PageContext.REQUEST_SCOPE); pageContext.setAttribute("qq", "374126165", pageContext.SESSION_SCOPE); pageContext.setAttribute("tl","1881679",pageContext.APPLICATION_SCOPE); //重定向到另一個頁面取得數據: response.sendRedirect(request.getContextPath()+"/pageget.jsp"); //刪除存儲的對象 pageContext.removeAttribute("age",PageContext.REQUEST_SCOPE ); %> </body> </html> ~~~ ### 6.JSP生命周期講解: 理解JSP底層功能的關鍵就是去理解它們所遵守的生命周期。JSP生命周期就是從創建到銷毀的整個過程,類似于servlet生命周期,區別在于JSP生命周期還包括將JSP文件編譯成servlet。 ### 6.1JSP執行過程: 訪問:[http://localhost:8080/](http://localhost:8080/)工程名/NewFile.jsp 1. 訪問到NewFile.jsp頁面,tomcat掃描到jsp文件,在/work/Catalina/localhost/stuJsp/org/apache/jsp把jsp文件翻譯成java源文件 (NewFile.jsp -> NewFile_jsp.java) (翻譯) 2. tomcat服務器把java源文件編譯成class字節碼文件 (編譯) (NewFile_jsp.java ->NewFile_jsp.class) 3. tomcat服務器構造NewFile_jsp類對象 4. tomcat服務器調用NewFile_jsp類里面方法,返回內容顯示到瀏覽器。 第一次訪問jsp:走(1)(2)(3)(4) 之后的訪問:走(4) **注意**:jsp文件修改了或jsp的臨時文件被刪除了,要重新走翻譯(1)和編譯(2)的過程 ### 6.2JSP生命周期: 1. JSP編譯: 當瀏覽器請求JSP頁面時,JSP引擎會首先去檢查是否需要編譯這個文件。如果這個文件沒有被編譯過,或者在上次編譯后被更改過,則編譯這個JSP文件。編譯為servlet; 1. JSP初始化: 容器載入JSP文件后,它會在為請求提供任何服務前調用jspInit()方法。你可以重寫該方法:在jsp聲明段 ~~~ <%! public void jspInit(){ initVar++; System.out.println("jspInit(): JSP被初始化了"+initVar+"次"); } %> ~~~ 1. JSP執行: 這一階段描述了JSP生命周期中一切與請求相關的交互行為,直到被銷毀。每一次服務請求都會執行_jspService()方法。 1. JSP清理: JSP生命周期的銷毀階段描述了當一個JSP網頁從容器中被移除時所發生的一切,一般只有在容器停止部署該工程才執行:jspDestroy()方法 你可以進行重寫 ~~~ <%! public void jspDestroy(){ destroyVar++; System.out.println("jspDestroy(): JSP被銷毀了"+destroyVar+"次"); } %> ~~~ 1. JSP與servlet的生命周期對比 ~~~ Servlet的生命周期: 1)構造方法(第1次訪問) 2)init方法(第1次訪問) 3)service方法 4)destroy方法 Jsp的生命周期: 1)翻譯: jsp->java文件 2)編譯: java文件->class文件(servlet程序) 3)構造方法(第1次訪問) 4)init方法(第1次訪問):_jspInit() 5)service方法:_jspService() 6)destroy方法:_jspDestroy() ~~~ ### 6.3演示如下: ~~~ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%! //記錄執行次數: private int initVar=0; private int serviceVar=0; private int destroyVar=0; %> <%! public void jspInit(){ initVar++; System.out.println("jspInit(): JSP被初始化了"+initVar+"次"); } public void jspDestroy(){ destroyVar++; System.out.println("jspDestroy(): JSP被銷毀了"+destroyVar+"次"); } %> <% serviceVar++;// System.out.println("_jspService(): JSP共響應了"+serviceVar+"次請求"); //對各個的執行次數計數 String content1="初始化次數 : "+initVar; String content2="響應客戶請求次數 : "+serviceVar; String content3="銷毀次數 : "+destroyVar; %> <%-- 輸出顯示 --%> <h1><%=content1 %></h1> <h1><%=content2 %></h1> <h1><%=content3 %></h1> </body> </html> ~~~ 顯示如下: ![08](https://box.kancloud.cn/2016-04-13_570e001300821.png "") 來自一條小鯊魚wpeace(rlovep.com)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看