日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JSP自定义标签学习笔记

發布時間:2024/4/17 javascript 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSP自定义标签学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/liangbinny/article/details/6309893

本文是本人學習《JavaWeb學習》書籍所記下的學習筆記

?

一、概述

?

JSP 2.0 中提供了兩種新的開發自定義標記的方法:

1、簡單標簽機制SimpleTag

JSP 2.0 中加入了新的創建自定義標記的API:javax.servlet.jsp.tagext.SimpleTag,該API 定義了用來實現簡單標記的接口。和JSP 1.2 中的已有接口不同的是,SimpleTag 接口不使用doStartTag()和doEndTag()方法,而提供了一個簡單的doTag()方法。這個方法在調用該標記時只被使用一次。一個自定義標記中實現的所有邏輯都在這個方法中實現。相對JSP1.2 中自定義標記機制,SimpleTag 的方法和處理周期要簡單得多。

?

2、 標簽文件

標簽文件允許JSP 網頁作者使用JSP 語法創建可復用的標簽庫。標簽文件的擴展名必須是.tag。

?

1.1 使用簡單標簽機制

與JSP1.2 相似,開發自定義標簽要遵循“開發標記類---配置TLD 文件----在JSP 中使用”的過程,

示例如下:

步驟一:編寫標記處理類AddTag.java

package tag;

?

import java.io.IOException;

?

import javax.servlet.jsp.JspContext;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.SimpleTagSupport;

?

public class AddTag extends SimpleTagSupport{

???????? private int num1 = 0;

???????? private int num2 = 0;

???????? public void setNum1(int num1) {

?????????????????? this.num1 = num1;

???????? }

???????? public void setNum2(int num2) {

?????????????????? this.num2 = num2;

???????? }

???????? public void doTag() throws JspException, IOException {

?????????????????? JspContext ctx = getJspContext();

?????????????????? JspWriter out = ctx.getOut();

?????????????????? int sun = num1+num2;

?????????????????? out.print(num1+"+"+num2+"="+sun);

???????? }

}

?

步驟二:編寫描述符文件 test.tld:放在/WEB-INF/test-tld/test.tld

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE taglib

??????? PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

??????? "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<taglib><!-- 標簽定義成<test:add /> -->

??? <tlibversion>1.0</tlibversion>

??? <jspversion>1.2</jspversion>

??? <shortname>test</shortname><!-- 這個test可以設置為空,你標簽就可以定義成<add />了,不過一般比較常見的都是<test:add />這種類型的 -->

??? <tag>

?????? <name>add</name>

?????? <tagclass>tag.AddTag</tagclass>

?????? <bodycontent>empty</bodycontent><!-- 就是<test:add ></test>中間的內容是空的 -->

?????? <info>Add Tag</info>

?????? <attribute>

?????????? <name>num1</name>

?????????? <required>true</required>

?????????? <rtexprvalue>true</rtexprvalue>

?????? </attribute>

?????? <attribute>

?????????? <name>num2</name>

?????????? <required>true</required>

?????????? <rtexprvalue>true</rtexprvalue>

?????? </attribute>

??? </tag>

</taglib>

?

?

步驟三:在JSP 中使用標記:

<%@ page language="java"?? pageEncoding="UTF-8"%>

<%@ taglib prefix="test" uri="/WEB-INF/test-tld/test.tld" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

? <head>

??? <title>測試自定義標簽</title>

? </head>

? <body>

? ????? SimpleTag 測試:<br />

? ????? <h1><test:add num1="2" num2="3"/></h1>

? </body>

</html>

?

無需在web.xml下配置,

運行結果如下:

?

?

?

?

?

1.2 使用標簽文件

通過標簽文件實際上可以將一個JSP 文件的內容作為標簽處理程序,但該文件擴展名必須是.tag,

示例如下:

1) 標記文件hello.tag,該文件存放在 WEB-INF/tags 目錄下

hello.tag.<br>

IP:<%= request.getRemoteAddr() %>

2) 在JSP 中使用tag 文件

<%@ page contentType="text/html;charset=gb2312" %>

<%@ taglib prefix="test" tagdir="/WEB-INF/tags/" %>

<h2>Tag File 測試</h2>

<test:hello/>

3) 運行效果如下:

?

二 、自定義標簽簡介

?

2.1 自定義標簽概念

?

JSP標簽分為標準JSP 環境自帶的標簽(即前面章節中學習過的JSP 動作標簽)和JSP 自定義標簽。JSP 自定義標簽是用戶定義的標記,它遵循XML 語法。當servlet 容器處理自定義標記時,會自動調用一個Java 類文件完成相對應的功能。

Java 開發人員編寫標記處理程序類以處理標記并處理所有需要的Java 代碼和數據操作。對于Web頁面設計者來說,自定義標記與標準HTML 標記使用起來沒什么區別,但HTML 標記只能完成前臺顯示的功能,而自定義標記可以在后臺完成某些操作。

正確編寫自定義標記可以讓 Web 設計者創建、查詢和操作數據而無需編寫一行Java 代碼。正確使用自定義標記使 Java 開發人員不必再在編碼過程中考慮表示層。這樣應用程序開發小組的每一位成員都可以關注于他或者她最擅長的事物。

所以說,JSP 自定義標記為在動態Web 頁中將表示與業務邏輯分離提供了一種標準化的機制,使頁面設計者可以將注意力放到表示上,而應用程序開發人員編寫后端的代碼。

?

2.2 標簽相關概念

JSP 自定義標簽的使用語法與普通HTML標簽相同,與自定義標簽相關的基本術語簡單說明如下,

這些術語在開發JSP 自定義標簽時要用到:

1) 自結束標簽——沒有標記體的標簽

示例:<test:myhrtag />

說明:假設myhrtag 是一個自定義標簽

2) 屬性

示例:<test:myhrtag color=”red” />

說明:以上標簽中包含了color 屬性,值為red

3) 帶標記體的標簽

示例:<test:myhrtag > xxxxx </test:myhrtag>

說明:以上標簽中間的xxxxx 即為標記體

4) 子標記

示例: <test:myhrtag >

<test:mytag2/>

</test:myhrtag>

說明:以上myhrtag 標簽中間的mytag2 即為子標記

?

?

2.3 如何創建自定義標簽

?

自定義標簽功能的實現要求在后臺必須有一個相關的JAVA 類的支持,但并不是任意編寫一個JAVA 類就能處理JSP 標簽,這個類也必須實現指定的規范才能用于支持JSP 標簽,這些規范表現形式也是接口和類,它們在javax.servlet.jsp.tagext包中聲明,主要接口/類的描述如下:

javax.servlet.jsp.tagext.Tag 接口,所有處理JSP 標簽的類必須實現該接口。該接口中聲明了6個方法,如果直接從該接口生成類則必須實現所有的6 個方法,通常不會直接通過該接口生成標簽的處理類。

?javax.servlet.jsp.tagext.TagSupport 類,該類實現了Tag 接口,用于創建不帶標記體的自結束標簽,這些標簽中可以帶屬性。

javax.servlet.jsp.tagext.BodyTagSupport 類,該類繼承了TagSupport,用于創建帶標記體的標簽。

??? 通常我們自定義的標簽,編寫處理程序時使用TagSupport 和BodyTagSupport 即可,不需要涉及到標簽體的,繼承TagSupport,需要用標簽體的,用BodyTagSupport,以下是開發和使用一個JSP 自定義標簽的全過程:

1) 開發標記處理類,編譯生成class 文件,該類要繼承TagSupport 或BodyTagSupport;

2) 創建標記庫描述符文件*.tld,在該文件中為標記處理類指定標簽名、聲明標簽屬性;

3) 在JSP 中引用標簽庫;

4) 在JSP 中使用標JSP 標簽

?

三、自結束標簽(不帶標簽體,TagSupport)

3.1 自結束標簽簡介

這是一種不帶標記體的標簽,所以該類標簽的處理類直接繼承javax.servlet.jsp.tagext.TagSupport即可。TagSupport 的主要方法如下:

public int doStartTag() throws JspException

在WEB 容器遇到標簽開始時,該方法會運行。

public int doEndTag() throws JspException

在WEB 容器遇到標簽結束時,該方法會運行。

???????? TagSupport 類中有一個重要的成員:pageContext,該成員的功能與JSP 的內置對象pageContex完全相同。通過該對象可以得到其他幾個JSP 對象的引用。這樣,我們就可以在JAVA 類中與JSP 進行交互了。如: JspWriter out=pageContext.getOut();這一語句可以得到JSP 內置對象out 的引用,通過out 我們就可以向客戶端瀏覽器中輸出內容了。要使用其他幾個JSP 對象原理與此相同。

?

3.2自結束標簽開發示例

?

方式二:動態引用

步驟一:編寫標記處理類

package tag;

?

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.Tag;

import javax.servlet.jsp.tagext.TagSupport;

?

/**

?*自定義自結束標簽,不含標簽體。

?*

?*1、在自定義的類中,重寫了父類TagSupport的兩個方法:doStartTag()、doEndTag(),在容器遇到標記開始時會運行doStartTag(),遇到標記結束時運行doEndTag()方法;

?*2doStartTag()方法的返回值:通??梢匀蓚€值:

?* ???? EVAL_BODY_INCLUDE——包含標記體,本例中要編寫自結束標記所以不使用該值;

?* ???? SKIP_BODY——跳過標記體,即不處理標記體,開發自結束標記應該使用該值。

?*3、doEndTag()方法的返回值:通??梢匀蓚€值:

?* ???? SKIP_PAGE——返回這個值,則終止頁面執行;

?* ???? EVAL_PAGE——返回該值則處理完當前標記后,JSP頁面中止運行。

?*/

?

publicclass MyHrTag extends TagSupport{

?

??? /**

??? ?*

??? ?*/

??? privatestaticfinallongserialVersionUID = 1L;

?

??? /*

??? ?* WEB 容器遇到標簽開始時,該方法會運行。

??? ?* 該方法可以自行定義,也可以不定義。不定義該方法則遇到開始標簽什么都不做

??? ?* */

??? publicint doStartTag() throws JspException {

?????? try {

?????????? //得到網絡輸出流,pageContext 是從父類繼承過來的成員

?????????? JspWriter out = pageContext.getOut();

?????????? //向網頁輸出內容

?????????? out.println("<h4>開始執行doStartTag()......</h4>");

?????????? //輸出5 條水平線;

?????????? for(int i=1; i<=5; i++){

????????????? out.println("<hr>");

?????????? }

?????? } catch (Exception e) {

?????????? e.printStackTrace();

?????? }

?????? //return EVAL_BODY_INCLUDE; //處理標記體

?????? return Tag.SKIP_BODY; //跳過標記體;

??? }

???

??? /*

??? ?* WEB 容器遇到標簽結束時,該方法會運行。

??? ?* 該方法可以自行定義,也可以不定義。不定義該方法則遇到結束標簽什么都不做

??? ?* */

??? publicint doEndTag() throws JspException {

?????? try {

?????????? JspWriter out=pageContext.getOut();

?????????? out.println("<h3>開始執行doEndTag().....</h3>.");

?????? } catch (Exception e) {

?????????? e.printStackTrace();

?????? }

?????? //return Tag.SKIP_PAGE; //返回這個值,則終止頁面執行;

?????? returnEVAL_PAGE;

??? }

}

?

步驟二:創建標記庫描述符文件myhr.tld,該文件要存放在 WEB-INF/test-tld 目錄下:

?

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE taglib

??????? PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

??????? "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">????

<!--

解釋:

tld 文件中,映射了標記名和處理程序類;

<tallib>元素,代表開始一個標記庫的描述

<tligversion>元素,代表標記庫的版本

<jspversion>元素,代表標記所支持的JSP 的版本

<shortname>為標記庫起別名,相當于注釋,無實際用途

<tag>元素,代表開始描述一個標記,其下子元素如下:

??? <name>——為標記處理類起的標記名

??? <tagclass>——指定標記處理類的全名(即帶包的名字)

??? <bodycontent>——標記體的類型,該示例中不需要標記體,所有設置為EMPTY,該值的其他取值在后續內容中講解

?-->

<taglib>

??? <tlibversion>1.0</tlibversion>

??? <jspversion>1.1</jspversion>

??? <shortname>myhr</shortname><!-- 標簽以<myhr:XXX />形式 -->

??? <tag>

?????? <name>MyHr</name><!-- 該標簽為<myhr:MyHr /> -->

?????? <tagclass>tag.MyHrTag</tagclass>

?????? <bodycontent>EMPTY</bodycontent>

??? </tag>

</taglib>

?

?

步驟三:在JSP 中引用標記庫描述文件

引用標記庫有兩種方式,分別稱為靜態引用和動態引用。

方式一:動態引用(即直接在JSP 頁面中使用TLD 文件)

<%@ page language="java"? pageEncoding="UTF-8"%>

<%@ taglib uri="/WEB-INF/test-tld/myhr.tld" prefix="myhr" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

? <head>

??? <title>My JSP 'MyHr1.jsp' starting page</title>

? </head>

? <body>

?? <myhr:MyHr/>

? </body>

</html>

?

JSP 指令<%@ taglib... %>用于引用標記庫,該指令的兩個屬性作用如下:

uri——指明要引用的標記庫,在靜態引用中就是TLD 文件的路徑

prefix——為標記起的前綴名,可以防止多個標記重名的情況出現

?

方式二:靜態引用

首先在web.xml 中為TLD 文件聲明別名:

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

<Web-app>

……

<taglib>

<taglib-uri>myhr2</taglib-uri>

<taglib-location>/WEB-INF/myhr.tld</taglib-location>

</taglib>

……

</Web-app>

然后在JSP 中通過別名引用TLD 文件:

<%@ page language="java"? pageEncoding="UTF-8"%>

<%@ taglib uri="myhr2" prefix="myhr" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

? <head>

??? <title>My JSP 'MyHr1.jsp' starting page</title>

? </head>

? <body>

?? <myhr:MyHr/>

? </body>

</html>

到此為止,自結束標簽開發完畢,其中主要工作有兩個:開發標記處理類、配置TLD 文件。訪

問JSP,運行結果如下:

?

?

四、標簽中的屬性

4.1 為自定義標簽添加屬性

以上的示例中開發了一個簡單的JSP 標簽,但一個實用的標簽通常還要由屬性來制定標簽的特定行為,以下示例演示為自定義標簽添加屬性。該示例在1.2 示例基礎上,為標簽添加了color 和loop兩個自定義屬性,以控制水平線的顏色和輸出的水平線的數量。

步驟一:編寫標記處理類

package tag;

?

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.Tag;

import javax.servlet.jsp.tagext.TagSupport;

?

/**

?*

?*該類為自定義標簽添加了兩個屬性,屬性的聲明與javabean語法完全相同,即屬性本身是private類型,

?*但要求提供publicgetset方法。

?*?

?*/

?

publicclass MyHrTag2 extends TagSupport{

???

??? //聲明屬性

??? private String color = "black"; //定義線條顏色

??? private String loop = "1"; //定義輸出水平線的條數

???

??? //嚴格按照javabean模式

??? publicvoid setColor(String color) {

?????? this.color = color;

??? }

???

??? //嚴格按照javabean模式

??? publicvoid setLoop(String loop) {

?????? this.loop = loop;

??? }

???

??? //只定義遇到開始標簽執行方法即可了。

??? publicint doStartTag() throws JspException {

?????? try {

?????????? //得到網絡輸出流

?????????? JspWriter out = pageContext.getOut();

?????????? //向網頁輸出內容;

?????????? out.println("<h4>開始執行doStartTag()......</h4>");

?????????? int n = Integer.parseInt(loop);

?????????? for (int i=1;i<=n;i++) {

????????????? out.print("<hr color='"+this.color+"' />");

?????????? }

?????? } catch (Exception e) {

?????????? e.printStackTrace();

?????? }

?????? return Tag.SKIP_BODY;

??? }

???

}

?

步驟二:創建TLD 文件,本例中是在1.2 中的myhr.tld 文件中進行修改得到:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE taglib

??????? PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

??????? "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">????

<!--

解釋:

?? tld 文件中,映射了標記名和處理程序類;

?? <tallib>元素,代表開始一個標記庫的描述

?? <tligversion>元素,代表標記庫的版本

?? <jspversion>元素,代表標記所支持的JSP 的版本

?? <shortname>為標記庫起別名,相當于注釋,無實際用途

?? <tag>元素,代表開始描述一個標記,其下子元素如下:

??? <name>——為標記處理類起的標記名

??? <tagclass>——指定標記處理類的全名(即帶包的名字)

??? <bodycontent>——標記體的類型,該示例中不需要標記體,所有設置為EMPTY,該值的其他取值在后續內容中講解

??? <tag>中的子元素

?????? <attribute>用于為標簽聲明屬性,其子元素如下:

?????????? <name>——用于指定屬性名稱

?????????? <required>——用于聲明該屬性是否為必需的,本例中聲明color、loop 兩個屬性都不是必需的。

?-->

<taglib>

??? <tlibversion>1.0</tlibversion>

??? <jspversion>1.1</jspversion>

??? <shortname>myhr</shortname><!-- 標簽以<myhr:XXX />形式 -->

??? <tag>

?????? <name>MyHr</name><!-- 該標簽為<myhr:MyHr /> -->

?????? <tagclass>tag.MyHrTag</tagclass>

?????? <bodycontent>EMPTY</bodycontent>

??? </tag>

??? <tag>

?????? <name>MyHr2</name><!-- 該標簽為<myhr:MyHr /> -->

?????? <tagclass>tag.MyHrTag2</tagclass>

?????? <bodycontent>EMPTY</bodycontent>

?????? <attribute>

?????????? <name>color</name>

?????????? <required>false</required>

?????? </attribute>

?????? <attribute>

?????????? <name>loop</name>

?????????? <required>false</required>

?????? </attribute>

??? </tag>

</taglib>

?

步驟三:在JSP 中引用TLD,并使用標簽

<%@ page language="java"? pageEncoding="UTF-8"%>

<%@ taglib uri="/WEB-INF/test-tld/myhr.tld" prefix="myhr" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

? <head>

??? <title>My JSP 'MyHr3.jsp' starting page</title>

? </head>

? <body>

??? 第一次測試(未賦屬性值):<br>

??? <myhr:MyHr2/>

???

??? 第二次測試(使用兩個屬性):<br>

??? <myhr:MyHr2 color="red" loop="3"/>

???

??? 第三次測試(使用一個屬性):<br>

??? <myhr:MyHr2 color="blue"/>

???

??? 測試完畢.

? </body>

</html>

?

運行圖

?

?

?

4.2 標簽綜合示例

該示例中創建了一個JSP 標簽,用于在JSP 中判斷用戶是否登錄過,如果沒登錄過則自動轉到登錄頁,這樣就可以避免在JSP 中使用代碼段進行業務判斷了。

第一步:定義標簽類LoginTag.java,為標記處理程序,從session 中取出登錄標志進行判斷用戶是否登錄過:

package tag;

?

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.Tag;

import javax.servlet.jsp.tagext.TagSupport;

?

publicclass LoginTag extends TagSupport{

?

??? publicint doStartTag() throws JspException {

?????? try {

?????????? HttpSession session = pageContext.getSession();

?????????? Object obj = session.getAttribute("User");

?????????? //判斷是否從未登錄過,如果沒登錄過則轉到登錄頁;

?????????? if(obj==null){

????????????? ((HttpServletResponse)pageContext.getResponse()).sendRedirect("login.html");

????????????? returnSKIP_BODY;

?????????? }

?????? } catch (Exception e) {

?????????? e.printStackTrace();

?????? }

?????? return Tag.SKIP_BODY;

??? }

}

?

第二步:編寫login.tld

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE taglib

??????? PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

??????? "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">????

<!--

解釋:

??? tld 文件中,映射了標記名和處理程序類;

??? <tallib>元素,代表開始一個標記庫的描述

??? <tligversion>元素,代表標記庫的版本

??? <jspversion>元素,代表標記所支持的JSP 的版本

??? <shortname>為標記庫起別名,相當于注釋,無實際用途

??? <tag>元素,代表開始描述一個標記,其下子元素如下:

??? <name>——為標記處理類起的標記名

??? <tagclass>——指定標記處理類的全名(即帶包的名字)

??? <bodycontent>——標記體的類型,該示例中不需要標記體,所有設置為EMPTY,該值的其他取值在后續內容中講解

??? <tag>中的子元素

?????? <attribute>用于為標簽聲明屬性,其子元素如下:

?????????? <name>——用于指定屬性名稱

?????????? <required>——用于聲明該屬性是否為必需的,本例中聲明colorloop 兩個屬性都不是必需的。

?-->

<taglib>

??? <tlibversion>1.0</tlibversion>

??? <jspversion>1.1</jspversion>

??? <shortname>test</shortname><!-- 標簽以<myhr:XXX />形式 -->

??? <tag>

?????? <name>islogin</name><!-- 該標簽為<myhr:MyHr /> -->

?????? <tagclass>tag.LoginTag</tagclass>

?????? <bodycontent>EMPTY</bodycontent>

??? </tag>

</taglib>

?

第三步:動態調用標簽

部分內容如下:

<%@ page language="java" contentType="text/html;charset=GB2312"%>

<%@ taglib uri="/WEB-INF/myhr.tld" prefix="test" %>

….

<test:islogin/>

<h3>歡迎</h3>

….

?

?

?

4.3 TLD 文件概述

以上示例中創建了標記描述符文件*.TLD,現總結該文件的用法如下:

該文件必須放在 WEB-INF 目錄下;

該文件是XML 格式的文件,各元素及功能說明如下:

元素??? 說明

<taglib> 代表開始一個標記庫的描述

<tlibversion> 代表標記庫的版本,是自定義的

<jspversion> 代表標記所支持的JSP 的版本

<shortname> 為標記庫起別名,相當于注釋,無實際用途

<tag> ??? 代表開始描述一個標記

表11-1 標記描述符TLD 文件元素說明

其中<tag>元素中又包含若干子元素,說明如下:

元素 說明

<name> 為標記處理類起的標記名

<tagclass> 指定標記處理類的全名(即帶包的名字)

<bodycontent> 標記體的內容類型,如果為EMPTY 代表無標記體

<attribute> 用于為標簽聲明屬性

表11-2 <tag>元素的子元素

<attribute>元素為標簽聲明屬性時,需要兩個子元素:

<name> 用于指定屬性名稱

<required> 用于聲明該屬性是否為必需的

?

?

五、標簽中的標記體

5.1 標記體簡介

標簽的標記體是 JSP 頁中出現在自定義標簽的開始和結束標簽之間的數據,標記體也稱正文。操縱其正文的標簽稱為帶標記體的標簽(也稱為正文標簽)。

可以編寫標簽處理程序對標簽的標記體進行操作。要編寫標記體標簽處理程序,必須實現BodyTag 接口。BodyTag 繼承了Tag 的所有方法,而且還實現了另外兩個處理正文內容的方法,見下表:

?????????????????? 方法 ?????????????????????????? 說明

setBodyContent(BodyContent b)???????????????? bodyContent 屬性的 Setter 方法

doInitBody() ?????????????????????????????????????????? ?對正文內容進行初始化操作

?

為方便開發,在JSP 類庫中為BodyTag 接口提供了實現類:javax.servlet.jsp.tagext.BodyTagSupport。該類繼承了TagSupport 并實現了BodyTag 接口。因此,標記體標簽處理程序只需要覆蓋要使用的方法。BodyTagSupport 類中定義了一個protected bodyContent 成員變量及get/setBodyContent()方法,bodyContent 是一個緩沖區,用以保存標記體正文內容。

在一個標簽處理類中,BodyTag 的處理流程如下:

???????? 1、當容器創建一個新的標簽實例后,通過setPageContext 來設置標簽的頁面上下文。

2、使用setParent 方法設置這個標簽的上一級標簽,如果沒有上一級嵌套,設置為null。

3、設置標簽的屬性,如果沒有定義屬性,就不調用此類方法。

4、調用doStartTag 方法,這個方法可以返回以下三者之一:EVAL_BODY_INCLUDE、

EVAL_BODY_BUFFERED、SKIP_BODY,當返回EVAL_BODY_INCLUDE 時,就將標記

體直接寫到輸出流中,如果返回SKIP_BODY,就不再計算標簽的正文,如果返回EVAL_BODY_BUFFERED,就將標記體的正文包含到bodyContent 成員中。

5、調用setBodyContent 設置當前的BodyContent.

6、調用doInitBody,可以在該方法中對BodyContent 進行一些初始化操作.每次計算完Body 后調用doAfterBody,如果返回EVAL_BODY_AGAIN,表示繼續處理一次標記體,直到返回SKIP_BODY 才繼續往下執行.

7、調用doEndTag 方法,結束標簽處理.

?

5.2 一個簡單的帶標記體的標簽

?

本示例中創建了一個標簽用于在瀏覽器中輸出其標記體內容,且輸出的次數由標簽的屬性決定:

???????? 步驟一:編寫標記處理類

package tag;

?

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.BodyTagSupport;

?

/**

?*

?*doStartTag()中的返回值EVAL_BODY_INCLUDE,可以直接將標簽的正文內容輸出到瀏覽器中。

?*doAfterBody()在處理完一次正文后會自動執行,

?*該方法如果返回EVAL_BODY_AGAIN,則代表再處理一遍正文(即輸出到瀏覽器),返回SKIP_BODY代表正文處理到此結束。

?*本例中循環向瀏覽器中輸出標記體的正文,直到屬性loop的值小于1。

?*

?*/

?

publicclass TestBodyTag extends BodyTagSupport {

??? privateintloop ; //定義輸出標簽體的次數屬性,比如:2的話就表示連續重復輸出標簽體2

?

??? publicvoid setLoop(int loop) {

?????? this.loop = loop;

??? }

?

??? publicint doStartTag() throws JspException {

?????? if(loop>0){

?????????? returnEVAL_BODY_INCLUDE; //自動將標簽體包含到輸出流中,第一次將標簽體輸出到瀏覽器中.

?????? }else {

?????????? returnSKIP_BODY; //跳過標簽體,不將標簽體包含到輸出流,不處理標簽體,直接忽略.

?????? }

??? }

?

??? publicint doAfterBody() throws JspException {

?????? /**

?????? ?*doAfterBody()在處理完一次正文后會自動執行,

?????? ?*該方法如果返回EVAL_BODY_AGAIN,則代表再處理一遍正文(即輸出到瀏覽器),返回SKIP_BODY代表正文處理到此結束。

?????? ?*本例中循環向瀏覽器中輸出標記體的正文,直到屬性loop的值小于1

?????? ?*/

?????? if(loop>1){

?????????? loop--;

?????????? returnEVAL_BODY_AGAIN;

?????? }else {

?????????? returnSKIP_BODY;

?????? }

??? }

}

?

步驟二:創建標記庫描述符文件testbodytag.tld,該文件要存放在 WEB-INF/test-tld 目錄下:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE taglib

??????? PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

??????? "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">????

<!--

解釋:

??? tld 文件中,映射了標記名和處理程序類;

??? <tallib>元素,代表開始一個標記庫的描述

??? <tligversion>元素,代表標記庫的版本

??? <jspversion>元素,代表標記所支持的JSP 的版本

??? <shortname>為標記庫起別名,相當于注釋,無實際用途

??? <tag>元素,代表開始描述一個標記,其下子元素如下:

??? <name>——為標記處理類起的標記名

??? <tagclass>——指定標記處理類的全名(即帶包的名字)

??? <bodycontent>——標記體的類型,該示例中不需要標記體,所有設置為EMPTY,該值的其他取值在后續內容中講解

??? <tag>中的子元素

?????? <attribute>用于為標簽聲明屬性,其子元素如下:

?????????? <name>——用于指定屬性名稱

?????????? <required>——用于聲明該屬性是否為必需的,本例中聲明colorloop 兩個屬性都不是必需的。

?-->

<taglib>

??? <tlibversion>1.0</tlibversion>

??? <jspversion>1.1</jspversion>

??? <shortname>test</shortname><!-- 標簽以<myhr:XXX />形式 -->

??? <tag>

?????? <name>bodytag</name><!-- 該標簽為<myhr:MyHr /> -->

?????? <tagclass>tag.TestBodyTag</tagclass>

?????? <bodycontent>tagdependent</bodycontent>

?????? <attribute>

?????????? <name>loop</name>

?????????? <required>true</required>

?????? </attribute>

??? </tag>

</taglib>

?

?

?

步驟三:在JSP 中使用該標記

<%@ page language="java"?? pageEncoding="UTF-8"%>

<%@ taglib prefix="test" uri="/WEB-INF/test-tld/testbodytag.tld" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

? <head>

??? <title>測試自定義帶標簽體的標簽</title>

? </head>

? <body>

? ????? 測試帶標記體的自定義標記:<br>

? ????? <test:bodytag loop="4">

? ???????? 這是標記體<br />

? ????? </test:bodytag>

? </body>

</html>

?

運行圖:

?

?

?

?

5.3 一個簡單的帶標記體的標簽(二)

在doStartTag()方法中返回EVAL_BODY_INCLUDE,簡單地將標記體的內容直接輸出到了瀏覽器中,并未對內容進行任何處理,在一些業務中有時需要對標記體正文進行處理,以下示例演示了如何讀取標記體內容并進行處理:

???

步驟一:編寫標記處理類

package tag;

?

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.BodyContent;

import javax.servlet.jsp.tagext.BodyTagSupport;

?

/*

?* doStratTag()中的返回值EVAL_BODY_BUFFERED 代表不直接將標記體內容寫到輸出流中,

?* 而是緩存到成員變量bodyContent 中(該成員從BodyTagSupport 繼承過來),

?* EVAL_BODY_INCLUDE是直接將標記體內容寫到輸出流中

?* */

?

publicclass EqualTag extends BodyTagSupport{

?

??? private String name = "";

??? private String value = "";

??? publicvoid setName(String name) {

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

??? }

?

??? publicvoid setValue(String value) {

?????? this.value = value;

??? }

?

??? publicint doStartTag() throws JspException {

?????? System.out.println("do starttag()....");

?????? returnEVAL_BODY_BUFFERED;? //不直接將標記體內容寫到輸出流中,而是緩存到成員變量bodyContent

??? }??

?

??? publicvoid setBodyContent(BodyContent b) {

?????? System.out.println("setBodycontent()...."+b.getString()+"++");

?????? this.bodyContent = b;? //bodyContent 賦值前,bodyContent是空的

?????? System.out.println("setBodycontent()...."+bodyContent.getString()+"++");

??? }

?

??? //初始化標記體

??? publicvoid doInitBody() throws JspException {

?????? System.out.println("doInitBody()....."+bodyContent.getString()+"++");

??? }

???

??? publicint doAfterBody() throws JspException {

?????? System.out.println("doAfterBody()...."+bodyContent.getString()+"++");

?????? returnSKIP_BODY;? //停止包含

??? }

?

??? publicint doEndTag() throws JspException {? //處理標簽體內容,將標簽體的內容加租傾斜

?????? System.out.println("doEndTag()..."+bodyContent.getString()+"++");

?????? String username = (String)pageContext.getSession().getAttribute(name);? //獲得存在session的某屬性的值,該屬性值由標簽屬性提供獲取。

?????? String str = bodyContent.getString();

??????

?????? if(username.equals(value)){? //如果該值與標簽屬性相等

?????????? str = "<b><i>"+str+"</i></b>";?? //加粗傾斜,不是的話就原樣輸出

?????? }

??????

?????? try {

?????????? JspWriter out = pageContext.getOut();

?????????? out.print(str);? //將加粗傾斜后的標簽體輸出到頁面上

?????????? this.bodyContent = null;

?????? } catch (Exception e) {

?????????? e.printStackTrace();

?????? }

???

?????? returnEVAL_PAGE;

??? }

}

?

?

?

步驟二:在標記庫描述符文件testbodytag.tld,添加tag標記:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE taglib

??????? PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

??????? "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">????

<!--

解釋:

??? tld 文件中,映射了標記名和處理程序類;

??? <tallib>元素,代表開始一個標記庫的描述

??? <tligversion>元素,代表標記庫的版本

??? <jspversion>元素,代表標記所支持的JSP 的版本

??? <shortname>為標記庫起別名,相當于注釋,無實際用途

??? <tag>元素,代表開始描述一個標記,其下子元素如下:

??? <name>——為標記處理類起的標記名

??? <tagclass>——指定標記處理類的全名(即帶包的名字)

??? <bodycontent>——標記體的類型,該示例中不需要標記體,所有設置為EMPTY,該值的其他取值在后續內容中講解

??? <tag>中的子元素

?????? <attribute>用于為標簽聲明屬性,其子元素如下:

?????????? <name>——用于指定屬性名稱

?????????? <required>——用于聲明該屬性是否為必需的,本例中聲明color、loop 兩個屬性都不是必需的。

?-->

<taglib>

??? <tlibversion>1.0</tlibversion>

??? <jspversion>1.1</jspversion>

??? <shortname>test</shortname><!-- 標簽以<myhr:XXX />形式 -->

??? <tag>

?????? <name>bodytag</name><!-- 該標簽為<myhr:MyHr /> -->

?????? <tagclass>tag.TestBodyTag</tagclass>

?????? <bodycontent>tagdependent</bodycontent>

?????? <attribute>

?????????? <name>loop</name>

?????????? <required>true</required>

?????? </attribute>

??? </tag>

??? <tag>

?????? <name>equal</name>

?????? <tagclass>tag.EqualTag</tagclass>

?????? <bodycontent>tagdependent</bodycontent>

?????? <attribute>

?????????? <name>name</name>

?????????? <required>true</required>

?????? </attribute>

?????? <attribute>

?????????? <name>value</name>

?????????? <required>true</required>

?????? </attribute>

??? </tag>

</taglib>

?

?

步驟三:在JSP 中使用該標記

<%@ page language="java"?? pageEncoding="UTF-8"%>

<%@ taglib prefix="test" uri="/WEB-INF/test-tld/testbodytag.tld" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

? <head>

??? <title>測試自定義帶標簽體的標簽</title>

? </head>

? <body>

? ? <% session.setAttribute("username","tom"); %>

? ? <test:equal name="username" value="tom">session中的username的屬性值如果是tom,則這段文字加粗傾斜</test:equal>

? ? <br />

? ? <test:equal name="username" value="tom1">session中的username的屬性值如果是tom,則這段文字加粗傾斜</test:equal>

? </body>

</html>

?

?

運行界面如下:

?

?

后臺輸出如下:

do starttag()....

setBodycontent()....++

setBodycontent()....++

doInitBody().....++

doAfterBody()....session中的username的屬性值如果是tom,則這段文字加粗傾斜++

doEndTag()...session中的username的屬性值如果是tom,則這段文字加粗傾斜++

do starttag()....

setBodycontent()....++

setBodycontent()....++

doInitBody().....++

doAfterBody()....session中的username的屬性值如果是tom,則這段文字加粗傾斜++

doEndTag()...session中的username的屬性值如果是tom,則這段文字加粗傾斜++

?

?

?

另外,附上各標簽的方法的返回值綜述:

?

?

?

?

六、標簽中的子標記

一個標簽中可以再包含其他的子標記,這種標簽稱為嵌套標記。創建嵌套標簽時,標記處理類與普通標簽相似,但在doStartTag()方法中必須返回EVAL_BODY_INCLUDE,JSP 容器才會處理嵌套的子標記。

?

???????? 步驟一:編寫頂級標記處理類

package tag;

?

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.BodyTagSupport;

?

publicclass NestTag extends BodyTagSupport{

??? private String name = "";

??? private String value = "";

??? publicvoid setName(String name) {

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

??? }

?

??? publicvoid setValue(String value) {

?????? this.value = value;

??? }

?

??? publicint doStartTag() throws JspException {

?????? String username = (String)pageContext.getSession().getAttribute(name);

?????? if(username.equals(value)){

?????????? returnEVAL_BODY_INCLUDE; //自動將標簽體包含到輸出流(因為頂級標簽的標簽體是一子標簽,還要進行該子標簽的標簽處理)

?????? }else{

?????????? returnSKIP_BODY; //跳過標簽體,不處理

?????? }

??? }

?

???

}

?

步驟二:在標記庫描述符文件testbodytag.tld,添加tag標記:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE taglib

??????? PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

??????? "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">????

<!--

解釋:

??? tld 文件中,映射了標記名和處理程序類;

??? <tallib>元素,代表開始一個標記庫的描述

??? <tligversion>元素,代表標記庫的版本

??? <jspversion>元素,代表標記所支持的JSP 的版本

??? <shortname>為標記庫起別名,相當于注釋,無實際用途

??? <tag>元素,代表開始描述一個標記,其下子元素如下:

??? <name>——為標記處理類起的標記名

??? <tagclass>——指定標記處理類的全名(即帶包的名字)

??? <bodycontent>——標記體的類型,該示例中不需要標記體,所有設置為EMPTY,該值的其他取值在后續內容中講解

??? <tag>中的子元素

?????? <attribute>用于為標簽聲明屬性,其子元素如下:

?????????? <name>——用于指定屬性名稱

?????????? <required>——用于聲明該屬性是否為必需的,本例中聲明color、loop 兩個屬性都不是必需的。

?-->

<taglib>

??? <tlibversion>1.0</tlibversion>

??? <jspversion>1.1</jspversion>

??? <shortname>test</shortname><!-- 標簽以<myhr:XXX />形式 -->

??? <tag>

?????? <name>bodytag</name><!-- 該標簽為<myhr:MyHr /> -->

?????? <tagclass>tag.TestBodyTag</tagclass>

?????? <bodycontent>tagdependent</bodycontent>

?????? <attribute>

?????????? <name>loop</name>

?????????? <required>true</required>

?????? </attribute>

??? </tag>

??? <tag>

?????? <name>equal</name>

?????? <tagclass>tag.EqualTag</tagclass>

?????? <bodycontent>tagdependent</bodycontent>

?????? <attribute>

?????????? <name>name</name>

?????????? <required>true</required>

?????? </attribute>

?????? <attribute>

?????????? <name>value</name>

?????????? <required>true</required>

?????? </attribute>

??? </tag>

??? <tag>

?????? <name>nest</name>

?????? <tagclass>tag.NestTag</tagclass>

?????? <bodycontent>JSP</bodycontent>? <!-- 該聲明標記體是其他標記,也可以是Jsp標準標記 -->

?????? <attribute>

?????????? <name>name</name>

?????????? <required>true</required>

?????? </attribute>

?????? <attribute>

?????????? <name>value</name>

?????????? <required>true</required>

?????? </attribute>

??? </tag>

</taglib>

?

?

步驟三:在JSP 中使用該標記

<%@ page language="java"?? pageEncoding="UTF-8"%>

<%@ taglib prefix="test" uri="/WEB-INF/test-tld/testbodytag.tld" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

? <head>

??? <title>測試嵌套的標簽</title>

? </head>

? <body>

? ? <% session.setAttribute("username","tom"); %>

? ? ?

? ? <test:nest name="username" value="tom">

? ????? <test:bodytag loop="3">

? ???????? session中的用戶名是tom<br/>

? ????? </test:bodytag>

? ? </test:nest>

? </body>

</html>

?

運行界面如下:

?

?

?

?

?

總結

以上是生活随笔為你收集整理的JSP自定义标签学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

免费久久片| 中文字幕在线看 | 国产粉嫩在线 | 日本精油按摩3 | 国产精品久久视频 | 亚洲综合干 | 免费黄色在线网站 | 天天综合视频在线观看 | 亚洲激情婷婷 | 97视频免费 | av网站在线免费观看 | 亚洲综合在线播放 | 国产中文字幕在线观看 | 97在线观看视频 | 日韩在线观看中文字幕 | 最近中文字幕免费av | 国产麻豆果冻传媒在线观看 | 婷婷伊人综合亚洲综合网 | 国产精品高潮在线观看 | 日韩av免费网站 | 人成电影网| 国产福利在线免费 | 欧美另类巨大 | 狠狠操综合| 久久综合久久综合久久综合 | 国产青草视频在线观看 | 久久久在线 | 国产激情电影综合在线看 | 在线免费观看成人 | 天天色天天射天天操 | 中文字幕在线网址 | av一区二区三区在线播放 | av夜夜操| 九色自拍视频 | 欧美日韩精品在线一区二区 | 99在线播放 | 国产在线观看不卡 | 最近免费中文字幕大全高清10 | 欧美在线视频精品 | 久久综合欧美精品亚洲一区 | 日韩成片| 99精品在线免费视频 | 久久精美视频 | 一区二区三区在线播放 | 91资源在线| 免费看片在线观看 | 91在线播 | 亚洲v精品 | 精品免费视频. | 亚洲永久字幕 | 国产香蕉97碰碰久久人人 | 福利视频在线看 | 国产午夜一区 | 99精品免费观看 | 青青河边草免费观看 | 在线三级av | 亚洲精品国产精品久久99 | 免费裸体视频网 | 国产精品亚 | 中文字幕有码在线 | 国内外成人在线 | 久久综合九色综合欧美就去吻 | 手机成人av | 公与妇乱理三级xxx 在线观看视频在线观看 | 亚洲一区二区精品3399 | 亚洲激情在线 | 国产精品成人一区二区三区 | 亚洲精品在线观看中文字幕 | 91麻豆精品国产91 | 成人免费在线看片 | 99精品欧美一区二区三区 | 日韩久久影院 | 欧美日产在线观看 | 日韩电影久久 | 国产精品福利av | 亚洲国产资源 | 麻豆91在线看 | 国产明星视频三级a三级点| 亚洲综合五月 | 99亚洲国产 | 91网站免费观看 | japanesexxxhd奶水 91在线精品一区二区 | 免费网站看v片在线a | 韩日视频在线 | 欧美一区二区三区在线播放 | 九九日九九操 | 国产在线传媒 | 欧美xxxxx在线视频 | 中文字幕在线观看完整 | 国产999视频| 亚洲国产欧美在线人成大黄瓜 | 成人a免费 | 欧美巨大荫蒂茸毛毛人妖 | 999久久国精品免费观看网站 | 亚洲一区二区天堂 | 国产高清区 | 久久视频在线 | 国产精品入口a级 | 国产精品夜夜夜一区二区三区尤 | 国产高清中文字幕 | 久久久国产精品亚洲一区 | 亚洲乱码久久 | 久久精品视频免费观看 | 久久久久免费精品国产 | 中文av日韩 | 美女国产免费 | 激情影音 | 婷婷射五月 | 亚洲男男gaygay无套 | 天天综合成人网 | aa一级片 | 亚洲一级片 | 久草在线一免费新视频 | www.福利视频 | 国产96在线观看 | 亚洲综合成人av | 日本久久久久久久久久久 | 国产欧美最新羞羞视频在线观看 | 免费97视频 | 麻豆国产网站 | 欧美日韩不卡一区二区 | 日韩午夜av| 欧美日韩免费在线视频 | 色在线亚洲 | 一级一片免费观看 | 樱空桃av| 精品日韩中文字幕 | 亚洲码国产日韩欧美高潮在线播放 | 欧美激情精品 | 五月婷婷综 | 天天狠狠操 | 欧美成亚洲 | 黄色性av | www.天天干.com| 国产色拍拍拍拍在线精品 | www.操.com| 久草精品视频在线播放 | 成人黄色毛片视频 | 欧美一级激情 | 日韩一区精品 | 超碰97成人 | 91超级碰 | 色av网站 | www.天天操.com| 欧美色婷 | 久久久国产精华液 | 黄色一区三区 | 69国产精品视频免费观看 | 深爱激情亚洲 | 激情综合五月天 | 国产一区二区电影在线观看 | 久久精品一区二区国产 | 天天曰天天射 | 日韩国产精品久久 | 国产精成人品免费观看 | 精品久久久久亚洲 | 99视频精品在线 | 亚洲蜜桃在线 | 综合久久久久久 | 99精品国产一区二区三区不卡 | 精品欧美日韩 | 国产一区免费在线观看 | 美女黄视频免费 | 91麻豆精品国产91 | avove黑丝| 免费观看一级成人毛片 | 97超碰人人澡人人 | 男女激情网址 | 国产香蕉视频在线播放 | 日韩视频免费观看高清完整版在线 | 成人一级黄色片 | 国产精品久久久久久高潮 | 亚洲天天在线日亚洲洲精 | 99精品久久久久久久 | 成人久久久久久久久久 | 精品国产一区二区三区在线观看 | 91在线视频网址 | 国产高清不卡一区二区三区 | 国产精品中文字幕av | 欧美日韩一区二区在线观看 | 国产色在线视频 | 久久论理| 在线国产精品视频 | 国产韩国精品一区二区三区 | 在线观看中文字幕 | 久视频在线 | 在线激情影院一区 | 91成人破解版 | 久久夜夜夜 | 日韩69av | 国产精品初高中精品久久 | 亚州人成在线播放 | 麻豆高清免费国产一区 | 色偷偷网站视频 | 激情五月在线视频 | 人人cao| 国产成人精品综合久久久久99 | 91视频久久久久 | 在线观看中文字幕视频 | 中文在线免费看视频 | 国产在线2020 | 久久亚洲影院 | 欧美一二三专区 | 日韩网站在线观看 | 亚洲国产成人久久 | 日韩视频图片 | 久久久久久久久久久久av | 一区二区欧美激情 | 久草精品视频在线观看 | 91亚洲欧美激情 | 久久av电影 | 免费a网| 久久99国产精品自在自在app | 日韩av影视在线观看 | 精品久久久久久亚洲 | 国产视频精品久久 | 欧美精品九九99久久 | 蜜臀av网址 | 中文字幕av免费在线观看 | 日韩高清一区二区 | 一级片免费在线 | 国产黑丝一区二区 | 激情av五月婷婷 | 中文字幕在线观看日本 | 欧美性爽爽 | 欧美国产日韩一区二区 | 91精品国产福利在线观看 | 精品国产自在精品国产精野外直播 | 91视频在线播放视频 | 亚洲精品中文在线观看 | 日韩经典一区二区三区 | 国产精品午夜免费福利视频 | 91麻豆精品国产91久久久久 | 国产精品av久久久久久无 | 欧美精品中文 | 91视频高清免费 | 精品在线播放视频 | 日韩精品一区二区三区在线视频 | 国产明星视频三级a三级点| av解说在线观看 | 天天激情综合 | 国产成人精品区 | 在线久热 | 免费观看黄色12片一级视频 | 亚洲激情电影在线 | 国产精品久久久久久999 | 91麻豆精品国产91久久久久久 | 国产最顶级的黄色片在线免费观看 | 欧美日韩不卡一区二区三区 | 超级碰碰免费视频 | 婷婷精品在线视频 | 久久论理 | 夜夜视频| 久久激情五月激情 | 97精品国自产拍在线观看 | 99精品国产成人一区二区 | 日韩视频图片 | 色综合久久中文字幕综合网 | 99操视频| 狠狠色2019综合网 | 天天操天天操天天操天天操天天操 | 免费v片| 亚洲成人精品久久 | 免费在线色 | 97精品超碰一区二区三区 | 最新不卡av | 91亚洲精品国产 | 在线91色| 五月婷婷视频在线观看 | 久久久久久久久久网 | 91天堂素人约啪 | 99热在线观看免费 | 91漂亮少妇露脸在线播放 | 欧美日韩高清不卡 | av电影中文字幕在线观看 | 亚洲影视九九影院在线观看 | 国产 色 | 欧美日韩国产在线观看 | 激情五月网站 | 美女黄网久久 | 天天亚洲综合 | 视频一区二区在线观看 | 91香蕉视频好色先生 | 深爱激情婷婷网 | 国产精品美女久久久久久久 | 一级电影免费在线观看 | 欧美一区二区免费在线观看 | 最新av免费在线观看 | 亚洲欧美日韩国产一区二区 | 射九九 | 狠狠色丁婷婷日日 | 色婷婷欧美 | av线上免费观看 | 欧美日韩后 | 一区二区三区在线免费观看视频 | 蜜臀av夜夜澡人人爽人人 | 亚洲一区在线看 | 精品国产乱码一区二 | 久久免费看片 | 久久婷婷精品 | 毛片精品免费在线观看 | 欧美日韩高清在线观看 | 成年人免费在线 | 香蕉影视 | 夜夜夜影院 | 国产xxxx做受性欧美88 | 欧美久久久久久久久久久久 | 特黄特黄的视频 | 五月婷色 | 国产精品video爽爽爽爽 | 免费在线观看污网站 | av一区二区三区在线观看 | 国产成人亚洲精品自产在线 | 国产精品一区二区在线免费观看 | 欧美一区二区三区免费看 | 国产69精品久久99不卡的观看体验 | 亚洲精品国产精品国自产观看浪潮 | 亚洲永久精品一区 | 国产拍揄自揄精品视频麻豆 | 国产色婷婷在线 | 在线观看黄网 | 日韩av看片 | 免费黄色网止 | 国产一级高清 | 欧美日韩xxx | 成人精品一区二区三区电影免费 | 一区二区三区在线免费 | 国产一二三四在线观看视频 | 亚州精品在线视频 | 99久久久久成人国产免费 | 麻豆影视在线播放 | 成人免费在线观看av | 国产精品九九久久久久久久 | 欧美一级免费高清 | 国产成人l区| www.亚洲精品在线 | 91在线视频导航 | av+在线播放在线播放 | av免费在线网 | av免费播放| 国内精品久久久久影院日本资源 | 超碰人人草人人 | 欧美激情精品久久久久久变态 | av在线中文 | 91观看视频 | 国产激情小视频在线观看 | 国产成人1区 | 精品国产乱码久久久久 | 99爱精品视频| 久久久精品网 | 久久精品播放 | 狠狠干电影 | 91热这里只有精品 | 黄色大片国产 | 亚洲精品午夜aaa久久久 | 蜜桃传媒一区二区 | 日韩欧美精品在线 | 欧美日韩3p | 成人h电影 | 久久久久久久久久久电影 | 日韩精品在线视频免费观看 | 国产香蕉视频在线观看 | av大片网址 | 久久激情五月激情 | 色婷婷九月 | 婷婷丁香激情网 | 亚洲一区不卡视频 | 美女黄频在线观看 | 亚洲视频999 | 黄色一集片 | 欧美一级性生活视频 | 特级aaa毛片 | 国产精品18久久久久久久久 | 亚洲精品毛片一级91精品 | 日韩免费电影在线观看 | 久色伊人 | 免费久久久久久 | 欧美做受高潮电影o | 日韩免费电影一区二区 | 日韩 在线观看 | 久久久久成人精品亚洲国产 | 久久久久久毛片精品免费不卡 | 韩国一区在线 | 久久久久久久久久亚洲精品 | 少妇高潮冒白浆 | 精品国产一区二区三区久久 | 日韩免费电影在线观看 | 亚洲精品男女 | 久草免费在线观看 | 欧美一级黄大片 | 精品国产网址 | 国产精品男女视频 | 国外调教视频网站 | 欧美国产亚洲精品久久久8v | 热久久这里只有精品 | 亚洲午夜精品久久久久久久久 | 日韩黄色一级电影 | 亚洲国内在线 | 综合亚洲视频 | 揉bbb玩bbb少妇bbb | 免费在线观看91 | 亚洲精品国产精品久久99 | 狠狠干婷婷 | 国产中文字幕在线观看 | 久久电影日韩 | 成人黄色免费观看 | 国产在线精品观看 | 91人人插| 99这里只有久久精品视频 | 国产精品理论视频 | 色网站视频| 日韩免费一级a毛片在线播放一级 | 欧美性生活一级片 | www.97视频| 日韩欧美网址 | 成人在线你懂得 | 日韩免费视频在线观看 | 91精品视频免费看 | 国色天香第二季 | 久久黄网站 | 国产成人精品综合久久久 | 久久综合欧美精品亚洲一区 | 96久久精品 | 在线国产视频观看 | 日韩精品一区二区三区高清免费 | 激情av资源| 成人黄在线观看 | 夜夜夜夜爽| 超碰在线公开免费 | 色91在线 | 久久精品首页 | 国产高清久久久久 | 视频一区在线免费观看 | 992tv在线 | 欧美性色综合 | 亚洲三级在线免费观看 | 天天射综合网视频 | av一区二区三区在线观看 | 日韩免费一区二区三区 | 亚洲一区天堂 | 亚洲视频在线视频 | 91精品国产自产在线观看 | 国产精品专区在线 | 成人av免费看 | 久久av在线播放 | 久久九九视频 | 日本黄色大片免费看 | 99精品乱码国产在线观看 | 亚洲精品在线观看中文字幕 | 亚洲精品久久久久久中文传媒 | 亚洲国产一区在线观看 | 成人免费观看大片 | 欧美日韩三区二区 | 日本 在线 视频 中文 有码 | 激情www | 一区二区三区四区精品视频 | 日本久久成人 | 中文字幕在线字幕中文 | 中文字幕在线播放一区 | 欧美一区二区三区四区夜夜大片 | 在线视频观看你懂的 | 国产精品精| 国产亚洲综合性久久久影院 | 91毛片在线 | 国产糖心vlog在线观看 | av电影不卡在线 | 婷婷网站天天婷婷网站 | 亚洲日本va午夜在线电影 | 国产乱对白刺激视频在线观看女王 | 中文字幕在线字幕中文 | 亚洲午夜精品电影 | 欧美在线视频第一页 | 97视频免费在线看 | 91中文字幕永久在线 | 久久字幕 | 91av视频在线免费观看 | 午夜视频在线观看一区 | 中文国产字幕在线观看 | 精品国产乱码久久久久久久 | 在线播放视频一区 | 毛片网站免费 | 成人毛片网 | 久操视频在线播放 | 在线久草视频 | 激情五月婷婷综合 | 久久国产精品99久久人人澡 | 国产中文字幕久久 | 在线之家免费在线观看电影 | 日日碰狠狠躁久久躁综合网 | 三级av中文字幕 | 国内免费的中文字幕 | 国产精品国产三级国产不产一地 | 毛片久久久 | 国产99久久久久久免费看 | 一级黄色毛片 | 欧美a免费 | 2019免费中文字幕 | 国产另类xxxxhd高清 | 黄色成人影院 | 天天综合入口 | 亚洲国内精品在线 | 99在线精品视频观看 | 欧洲一区二区在线观看 | 麻豆免费在线视频 | 亚洲免费视频观看 | 国产精品一区二区免费 | 欧美有色| 久久精品国产免费看久久精品 | 久久99精品国产91久久来源 | 欧美激情在线看 | 91精品国产电影 | 精品国产一二区 | 一区二区激情 | 三级av在线 | 一区二区三区在线观看中文字幕 | 人人澡人人澡人人 | 色综合久久中文综合久久牛 | 丁香婷婷激情五月 | 中文在线8资源库 | 91高清视频在线 | 97在线超碰 | www国产亚洲| 激情五月六月婷婷 | 国产在线观 | 成人毛片在线观看 | av福利免费 | 国产成人一区在线 | 久久99在线观看 | 黄色一区二区在线观看 | 黄色软件大全网站 | 亚洲高清av | 91福利专区 | 久久精品99精品国产香蕉 | av电影在线不卡 | 亚洲精品国产综合99久久夜夜嗨 | 国产日韩欧美精品在线观看 | 亚洲天天看 | 三级黄色大片在线观看 | 麻豆视频免费版 | 国产精品欧美精品 | 国产999视频| 国产999精品久久久久久绿帽 | 色噜噜噜噜 | 天天爱天天操天天射 | 天天操天天射天天插 | 精品播放 | 日韩中文在线电影 | 福利一区二区三区四区 | 亚洲激情国产精品 | 91亚洲网| 高清av免费观看 | 欧美日韩中文在线视频 | 日韩免费观看一区二区三区 | 国产小视频91 | 成人在线播放av | 中国一级片在线播放 | 久久久久久黄 | 久久精品99 | 欧美一级片免费观看 | 伊人春色电影网 | 亚洲电影免费 | 天天天天天天操 | 国产精品久久久久久久久费观看 | .国产精品成人自产拍在线观看6 | 91av官网| 国产69精品久久久久9999apgf | 婷婷免费在线视频 | 午夜精品一区二区三区在线视频 | 中文字幕在线一区二区三区 | 国产高清不卡av | 国产69久久 | 亚洲天堂网在线观看视频 | 日韩午夜三级 | 精品国模一区二区三区 | 99精品欧美一区二区蜜桃免费 | 亚洲最大av网 | 亚洲精品免费在线视频 | 久久99精品久久久久久清纯直播 | 久久精品三 | 在线成人免费电影 | 午夜视频黄 | 国产精品18久久久久vr手机版特色 | 国产成人久久精品77777 | 天天弄天天操 | 天天干天天干天天干天天干天天干天天干 | 久草网在线观看 | 国产美女视频免费 | 国产黄在线 | 日韩免费在线网站 | 在线成人性视频 | 17videosex性欧美 | 亚洲精品美女久久 | 韩国一区二区av | 综合网天天射 | 婷婷伊人网 | 综合婷婷 | 三级黄色理论片 | 91尤物国产尤物福利在线播放 | 久久夜色精品国产欧美一区麻豆 | 黄色小网站在线观看 | av在线播放快速免费阴 | 亚洲视频2 | 亚洲成aⅴ人片久久青草影院 | 成人黄大片 | 日韩欧美一级二级 | 一级片免费观看 | 国产成人在线精品 | 日日干网 | 亚洲人精品午夜 | 麻豆小视频在线观看 | 激情欧美日韩一区二区 | 欧美精品成人在线 | 激情动态| 色婷婷国产 | 午夜影院一级 | 亚洲成av| 久久综合久久伊人 | 啪嗒啪嗒免费观看完整版 | 久久久精品欧美一区二区免费 | 亚洲成人av在线播放 | 丰满少妇一级 | 91精品国产乱码久久桃 | 97国产一区| 国产精品久99| 日韩网站在线播放 | 久久性生活片 | 精品国产一区二区三区久久影院 | 国产一级在线免费观看 | 精品久久1| av在线播放网址 | 亚洲天堂精品视频在线观看 | 黄视频网站大全 | 日韩一区二区三区免费视频 | 亚洲精品国偷拍自产在线观看 | 成人看片 | 国产精品普通话 | 国产亚洲无 | 欧美a级片免费看 | 日韩二区三区在线观看 | 91亚洲精品国偷拍自产在线观看 | 西西4444www大胆无视频 | av在线播放免费 | www黄色com| 蜜臀久久99精品久久久酒店新书 | 91九色porn在线资源 | 国产 欧美 日本 | 手机av在线网站 | 玖玖玖在线 | 99视频网址| 国产原创在线视频 | 色欧美综合| 肉色欧美久久久久久久免费看 | 少妇做爰k8经典 | 99国产在线 | 欧美成a人片在线观看久 | 黄色www在线观看 | 97视频久久久 | 久久精品亚洲综合专区 | 日韩av中文| 一级特黄av | 五月婷激情 | 欧美精彩视频在线观看 | 在线黄色国产电影 | 久久99久久99精品免费看小说 | 草久久久久久久 | 在线观看 国产 | 国产精品不卡 | 91av在| 超碰人人超 | 91片在线观看| 在线精品视频免费观看 | 久久国产午夜精品理论片最新版本 | 天天伊人网| 成人小视频免费在线观看 | 97超碰中文字幕 | 一区二区三区在线视频111 | 久久成人亚洲欧美电影 | 91在线播放综合 | 91一区二区三区久久久久国产乱 | 在线观看日本高清mv视频 | av再线观看 | 99热9 | 激情网婷婷 | 81国产精品久久久久久久久久 | 日韩美女免费线视频 | 99超碰在线播放 | japanesexxxhd奶水| 中文字幕免费高清在线 | 国产一二区免费视频 | 在线网址你懂得 | 99久久免费看 | 国产精品3 | 超级碰碰碰碰 | 一区二区三区在线播放 | 国产视频美女 | 成人在线电影观看 | 国产成年免费视频 | 国产精品欧美日韩 | 黄色在线观看免费网站 | 久久久久久国产精品免费 | 久久专区| 黄色一级大片在线观看 | 国产福利午夜 | 人成午夜视频 | av成人免费在线观看 | 免费亚洲婷婷 | 日本在线免费看 | 欧美成人免费在线 | www.av免费观看 | 欧美精品久久久久久久亚洲调教 | 在线中文字幕一区二区 | 亚洲蜜桃在线 | 97福利在线| 在线不卡a | 青青河边草免费直播 | 在线观看一区二区视频 | 在线播放精品一区二区三区 | 久影院 | 96香蕉视频 | 狠狠狠色丁香综合久久天下网 | 国产原创中文在线 | 欧美久久电影 | 婷婷色狠狠 | 国产精品九九久久99视频 | 免费成人黄色av | 天堂av色婷婷一区二区三区 | 国产免费大片 | 狠狠色狠狠色综合日日92 | 99久久精品国产亚洲 | 日韩中文幕| 97操操操 | 日韩丝袜 | 五月天天天操 | 日韩高清黄色 | 91片在线观看| 欧美片网站yy | www.操.com| 成人午夜片av在线看 | 不卡精品 | 亚洲色图27p | 综合成人在线 | 国产精品成人自产拍在线观看 | 六月丁香激情综合色啪小说 | 这里有精品在线视频 | 亚洲精品视频免费观看 | 91av精品 | av在线专区| 日韩黄色软件 | 欧美大片大全 | 欧美性色xo影院 | 欧美日韩精品在线播放 | av网站免费看 | av视屏在线播放 | 一区免费观看 | 久青草影院| 久久福利影视 | 少妇av片 | 久久久久久久久久久福利 | 在线午夜| 在线免费观看av网站 | 久久午夜电影院 | 亚洲精品一区二区在线观看 | 婷婷色 亚洲 | 亚洲精品乱码久久久久久蜜桃91 | 97人人超| 成人欧美在线 | 久草在线视频免费资源观看 | 狠狠操狠狠操 | 日韩av片无码一区二区不卡电影 | 久久看免费视频 | 国产69精品久久久久99尤 | 国产成人三级在线 | 日韩专区在线播放 | 国产精品一区二区吃奶在线观看 | 精品久久久久免费极品大片 | 五月色综合 | 亚洲国产三级在线观看 | 99久久精品免费看国产免费软件 | 国产91影视 | 国产麻豆精品久久一二三 | 日本不卡视频 | 久色小说 | 久久深夜福利免费观看 | 超碰在线免费97 | 麻豆影视网站 | 在线日本v二区不卡 | 国产色视频一区 | 亚洲黄色在线免费观看 | 超碰在线中文字幕 | 中文字幕在线字幕中文 | 国产精品扒开做爽爽的视频 | 婷婷免费在线视频 | 少妇激情久久 | 91视频国产高清 | 91香蕉视频在线下载 | 久久99热这里只有精品 | 亚洲高清国产视频 | 国产精品av久久久久久无 | 在线国产能看的 | 精品一区二区在线免费观看 | 中文字幕在线观看视频免费 | 精品国产欧美一区二区三区不卡 | www.婷婷com| 精品亚洲国产视频 | 男女精品久久 | 中文字幕在线资源 | 国产系列在线观看 | 国产护士在线 | 日韩中文在线播放 | 在线免费观看黄色 | 中文字幕成人网 | 美女网站视频色 | 欧美专区亚洲专区 | 国产在线观看二区 | 久久国产精品免费看 | 亚洲精品一区二区三区新线路 | 五月的婷婷 | 日韩免费高清在线观看 | 欧美射射射| 天天操天天艹 | 在线观看亚洲成人 | 久久久久久毛片 | 麻豆传媒视频观看 | 在线综合色 | 精品久久1| 欧美综合在线观看 | 国产五月色婷婷六月丁香视频 | 日韩av资源在线观看 | 西西www4444大胆在线 | 久久高清 | 在线观看免费一级片 | 欧美精品久久久久久久亚洲调教 | 久久视频 | 中文字字幕在线 | 天堂网一区二区三区 | 视频在线观看入口黄最新永久免费国产 | 日韩专区在线观看 | 国产精品一区二区三区四区在线观看 | 中文字幕免费不卡视频 | 免费久久精品视频 | 毛片3| 欧美资源 | 国产日韩欧美精品在线观看 | 亚洲影院一区 | 国产一区免费视频 | 国产一区国产二区在线观看 | 久久亚洲二区 | 欧美一级片播放 | 亚洲国产精品成人va在线观看 | 国产精品九九热 | 国语自产偷拍精品视频偷 | 日韩精品免费在线观看 | 黄色特一级片 | 丁香婷婷激情网 | 亚洲一区二区三区四区精品 | 久久久国产精品网站 | 天堂av在线中文在线 | 亚洲日本中文字幕在线观看 | av黄色在线播放 | 天海翼一区二区三区免费 | 美女天天操| 日韩在线视频二区 | 国产精品第 | avav99| 99产精品成人啪免费网站 | 国产成人久久精品77777 | 精品国产乱码久久久久久天美 | 蜜臀av夜夜澡人人爽人人桃色 | 欧美激情精品久久久久久 | 77国产精品 | 国产成人a亚洲精品 | 久久久久成人免费 | 国产流白浆高潮在线观看 | 亚洲在线精品 | 夜夜躁狠狠躁 | 日韩 在线 | 中文久久精品 | 国产精品免费一区二区三区 | 欧美一级黄色片 | 天天色视频| 天天操夜夜逼 | 国产美女网站在线观看 | 99精品热 | 日韩免费高清在线观看 | 中文字幕第一页在线 | 日日日日干 | 91中文字幕在线观看 | 欧美日韩国产精品久久 | 808电影| 99精品美女 | 国产精品女人久久久久久 | 精品美女在线视频 | 国产视频在线免费观看 | 亚洲日韩中文字幕在线播放 | 久久精品视频中文字幕 | 天天摸天天舔 | 中文字幕在线观看不卡 | 免费看一级片 | 天天综合网在线观看 | 天天爽人人爽 | 精品福利在线视频 | 久久99国产精品二区护士 | 91av原创 | 91国内产香蕉 | 五月激情天 | 久草在线资源网 | 九色视频网站 | 天天天天射 | av黄免费看 | 久久三级视频 | 天天爱综合 | 国产精品成人av在线 | 亚洲国产mv | 久久久国产99久久国产一 | 日韩av看片 | 99精品国产一区二区三区麻豆 | 亚洲午夜久久久久久久久电影网 | 国产精品午夜免费福利视频 | 97香蕉超级碰碰久久免费软件 | 五月天天天操 | 91免费在线播放 | 免费人人干 | 一区二区三区四区五区在线 | 欧美性做爰猛烈叫床潮 | 色97在线| 久久久一本精品99久久精品66 | 一二三精品视频 | 在线看片视频 | 日韩二区三区在线观看 | 国产一级免费在线 | 69欧美视频 | 中文字幕精品一区二区精品 | 亚洲国产中文字幕 | 超碰97中文 | 国产黄在线免费观看 | 成年人看片网站 | 69久久夜色精品国产69 | 中文字幕在线观看免费高清完整版 | 97高清视频| 国产专区在线播放 | 欧美成年网站 | 国产成人一区二区三区免费看 | 午夜国产福利视频 | av噜噜噜在线播放 | 免费毛片一区二区三区久久久 | 91天天操 | 日日爱网站 | 在线观看国产日韩 | 久久视频在线观看免费 | 国产精品第2页 | 精品一区二区三区四区在线 | 天天爽夜夜爽人人爽曰av | 久久99热精品 | 中文字幕二区 | 4hu视频| 91丨九色丨勾搭 | 国产91成人在在线播放 | 日韩在线观看网址 | 中文字幕在线看视频国产中文版 | 女女av在线 | 99热国产在线中文 | 中文字幕资源在线 | 欧美一级黄色视屏 | 国产精品无av码在线观看 | 国产成人免费高清 | 人人看人人 | 免费观看成年人视频 | 国产不卡在线看 | 亚洲精品午夜久久久 | 在线观看爱爱视频 | 久久精品国产精品亚洲精品 | av免费网页 | 六月丁香久久 | 91精品播放| 少妇bbw揉bbb欧美 | 日日爽天天操 | 欧美日韩中文在线 | 久久99国产精品免费网站 | 色av色av色av | 久热色超碰 | 丁香av| 五月婷婷视频在线 | 久久久91精品国产一区二区精品 | 国产一级黄色片免费看 | 成人a在线观看高清电影 | 国产中文字幕一区二区三区 | 精品国产乱码久久久久久浪潮 | 丁香在线观看完整电影视频 | 国产久草在线观看 | 国产精品久久久久久麻豆一区 | 久久成人高清视频 | 97电影院在线观看 | 国产精品免费一区二区 | 在线观看精品一区 | 91成人精品在线 | 国产精品久久久一区二区三区网站 | 99热精品免费观看 | 国产在线污 |