亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

JAVAWEB開發之JSTL標簽庫的使用、 自定義EL函數、自定義標簽(帶屬性的、帶標簽體的)

2024-04-27 15:09:56
字體:
來源:轉載
供稿:網友

JSTL

 JSTL簡介:JSTL的全稱:jsp Standard Tag Library,JSP標準標簽庫JSTL的作用:  提供給java Web開發人員一個標準通用的標簽函數庫  和EL來取代傳統直接在頁面上嵌入Java程序(Scripting)的做法,以提高程序可讀性、維護性和方便性JSTL的版本:   JSTL的主要版本是1.0、1.1和1.2(區別不大)   1.0版本EL表達式還沒有納入官方規范

   1.1和1.2版本EL表達式已經納入了官方規范

JSTL1.1 下載相應的jar包JSTL的下載   JSTL主要由Apache組織的Jakarta PRoject實現   http://tomcat.apache.org/taglibs/standard/   容器必須支持Servlet2.4且JSP2.0以上的版本   JavaEE1.4JSTL導入jar包   解壓縮后將lib中的jstl.jar、standard.jar 復制到WEB應用程序的WEB-INF/lib下JSTL標簽庫核心標簽庫(core)---c(重點)xml(x:操作xml的標簽庫)SQL(sql標簽庫)FMT(fmt:國際化標簽庫)JSTL函數(EL函數)elJSTL快速入門   導入jar包(jstl.jar和standard.jar)         其中jstl.jar是編譯后的Java類文件,standard.jar定義的是標準接口   新建JSP的頁面        在頁面中引入核心標簽庫        <%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"  %>   JSTL標簽庫關于導入版本的問題        http://java.sun.com/jsp/core    1.1或者1.2版本(使用該版本)        http://java.sun.com/jstl/core     1.0版本(不支持EL表達式)

<c:out>標簽

輸出常量或者域范圍中的變量(value屬性,使用EL表達式)輸出默認值(default屬性)默認HTML標簽不轉義(escapeXml)
屬性名是否支持EL屬性類型屬性描述
valuetrueObject指定要輸出的內容
escapeXmltrueBoolean指定是否將>、<、&、'、" 等特殊字符進行HTML編碼轉換后再進行輸出。默認值是true。
defaulttrueObject指定如果value屬性的值為null時所輸出的默認值
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片<!-- c:out 輸出數據到瀏覽器 -->  <c:out value="Hello c out "></c:out>  Hello c out   <!-- 輸出一個變量 -->  <c:set var="m" value="10" scope="page"/>  <c:out value="${m}"></c:out>  ${m }  <!-- 轉義HTML 默認轉義,通過設置escapeXml 為false 不進行轉義-->  <c:out value="<a href='xxx'>link</a>" />  ${fn:escapeXml("<a href='xxx'>link</a>") }  <!-- 允許輸出默認值 ,如果city不存在,輸出北京-->  <c:out value="${city}" default="北京"></c:out>  ${empty city?"北京":city } 在WebRoot下新建jstl文件夾,在文件夾下新建out.jsp實例代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  <!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>    <h4>傳統方式</h4>  <%= "Hello" %>  <%      int a = 10;      request.setAttribute("name", "xy");  %>  <%= a %>      <h4>JSTL的方式 </h4>  <c:out value="Hello"></c:out>  <c:out value="${name }"></c:out>  <!-- "" -->  <c:out value="${ city }" default="北京"></c:out>  <c:out value="<a href='#'>超鏈接</a>" escapeXml="false"/>  <c:out value="<a href='#'>超鏈接2</a>" escapeXml="true"/>    </body>  </html>  

<c:set>標簽

向4個域中存入值。(var value scope屬性)設置Web域中的java.util.Map 類型的屬性對象或JavaBean類型的屬性對象的屬性(target  property  value屬性)
屬性名是否支持EL屬性類型屬性描述
valuetrueObject用于指定屬性
varfalseString用于指定要設置的Web域屬性的名稱
scopefalseString用于指定屬性所在的Web域
targettrueObject用于指定要設置屬性的對象,這個對象必須是JavaBean對象或java.util.Map對象
propertytrueString用于指定當前要為對象設置的屬性名稱
在WebRoot/jstl下新建set.jsp代碼如下:
<%@page import="cn.itcast.vo.User"%>  <%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>        <!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>    <h4>傳統方式</h4>  <%      pageContext.setAttribute("name", "10", pageContext.REQUEST_SCOPE);        %>    <%      User user = new User();      user.setUsername("美美");      user.setPassWord("123");      request.setAttribute("user", user);  %>  ${ user.username }    <h4>JSTL方式</h4>  <c:set var="i" value="10" scope="request" ></c:set>  ${ i }    <c:set target="${ user }" property="username"  value="小鳳"></c:set>  ${ user.username }    </body>  </html>  

<c:catch>標簽

<c:catch>標簽用于捕獲嵌套在標簽中的內容拋出的異常,其語法格式如下:<c:catch [var="varName"]> nested actions </c:catch>var屬性用于標識<c:catch>標簽捕獲的異常對象,它將保存在page這個web域中。關鍵代碼:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ page contentType="text/html;charset=gb2312" %><c:catch var="myex“ ><%10/0;%></c:catch>異常:<c:out value="${myex}" />  ${myex}<br />異常 myex.getMessage:<c:out value="${myex.message}" /><br />異常 myex.getCause:<c:out value="${myex.cause}" /><br />異常 myex.getStackTrace:<c:out value="${myex.stackTrace}" />在WebRoot/jstl下新建catch.jsp 實例代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>        <!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>    <h4>傳統方式</h4>  <%      try{                }catch(Exception e){          e.printStackTrace();      }  %>    <h4>JSTL的方式</h4>  <c:catch var="e">      <%          int a = 10/0;      %>  </c:catch>  ${ e.message }    </body>  </html>  

<c:choose>

<c:choose>標簽用于指定多個條件選擇的組合邊界,它必須與<c:when>和<c:otherwise>標簽一起使用。使用<c:choose>,<c:when>,<c:otherwise>三個標簽,可以構造類似于"if-else if-else"的復雜條件判斷結構<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ page contentType="text/html;charset=gb2312" %><c:set value="${param.count}" var="count“  /> pageContext(count,2)<c:choose><c:when test="${count == 0}">對不起,沒有符合您要求的記錄。</c:when><c:otherwise>符合您要求的記錄共有${count}條.</c:otherwise></c:choose>在WebRoot/jstl目錄下新建choose.jsp代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>        <!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>    <h4>獲取參數</h4>  <%= request.getParameter("username") %>    <h4>傳統方式</h4>  <%      int a = 10;      if(a >= 10 ){          out.print("a >= 10");      }else if(a < 10){          out.print("a < 10");      }else{          out.print("其他");      }  %>    <h4>JSTL方式</h4>  <c:set var="i" value="10" scope="page"></c:set>  <c:choose>      <c:when test="${ i ge 10 }">          i >= 10      </c:when>      <c:when test="${ i lt 10 }">          i < 10      </c:when>      <c:otherwise>          其他      </c:otherwise>  </c:choose>          </body>  </html>  

<c:forEach>標簽

<c:forEach>標簽用于對一個集合對象中的元素進行循環迭代操作,或者按指定的次數重復迭代執行標簽體中的內容
屬性名是否支持EL屬性類型屬性描述
varfalseString指定將當前迭代到的元素保存到page這個域中的屬性名稱
varStatusfalseString記住用于保存迭代信息的對象
itemstrue任何支持的類型將要迭代的集合對象
begintrueint如果指定items屬性,就從集合中的第begin個元素開始進行迭代,begin的索引值從0開始編號,如果沒有指定items屬性,就從begin指定的值開始迭代,直到end值時結束迭代
endtrueint與begin屬性類似
steptrueint指定迭代的步長,即迭代因子的迭代增量
<c:forEach>遍歷集合遍歷數組或者集合:   var:代表遍歷的每一個元素   items:要迭代的集合對象   獲取遍歷的內容:${ xxx }遍歷Map集合:   var:代表key與value的關系entry   items:要迭代的map集合   獲取遍歷的內容:${ xxx.key } ----${ xxx.value }遍歷對象集合:   var:代表遍歷的每一個對象   items:要迭代的集合   獲取遍歷的內容: ${ xxx.對象的屬性 }

<c:forEach>迭代數據

從1遍歷到10:   var:定義變量   begin:從哪開始   end:到哪結束   step:迭代步長(相當于x+=step)計算從1加到10的和:   定義變量sum,值為0   通過forEach循環1到10,每循環一次加到另一個變量中   在循環中間定義變量,每次計算到該變量中<c:set var="sum" value="0" scope="page"></c:set><c:forEach begin="1" end="10" step="1" var="i">     <c:set var="sum" value="${sum + i}" scope="page"></c:set></c:forEach>${sum }varStatus屬性:記錄迭代相關的信息:
屬性類型意義
indexnumber現在指到成員的索引
countnumber總共指到成員的總數
firstboolean現在指到的成員是否是第一個成員
lastboolean現在指到的成員是否是最后一個成員
遍歷10到100的偶數,每到第三個數,顯示紅色:<c:forEach begin="10" end="100" step="2" var="i" varStatus="status"><c:if test="${status.count % 3 == 0}"><font color="red">${i }</font></c:if><c:if test="${status.count % 3 != 0}"><font color="blue">${i }</font></c:if></c:forEach>在WebRoot/jstl目錄下新建forEach.jsp實例代碼如下:
<%@page import="cn.itcast.vo.User"%>  <%@page import="java.util.HashMap"%>  <%@page import="java.util.Map"%>  <%@page import="java.util.ArrayList"%>  <%@page import="java.util.List"%>  <%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>        <!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>    <h4>遍歷數組</h4>  <%      String [] arrs = {"美美","小鳳","芙蓉","小蒼"};      request.setAttribute("arrs", arrs);  %>  <!-- for(String s : arrs){ }  -->  <c:forEach var="s" items="${ arrs }">      ${ s }  </c:forEach>    <h4>遍歷集合</h4>  <%      List<String> list = new ArrayList<String>();      list.add("美美");      list.add("小鳳");      list.add("芙蓉");      list.add("小澤");      request.setAttribute("list", list);  %>  <c:forEach var="s" items="${ list }">      ${ s }  </c:forEach>    <h4>遍歷Map集合</h4>  <%      Map<String,String> map = new HashMap<String,String>();      map.put("aa", "美美");      map.put("bb", "小鳳");      map.put("cc", "芙蓉");      request.setAttribute("map", map);  %>  <c:forEach var="entry" items="${ map }">      ${ entry.key } -- ${ entry.value }  </c:forEach>    <h4>遍歷對象的集合</h4>  <%      List<User> uList = new ArrayList<User>();      uList.add(new User("美美","123"));      uList.add(new User("小風","234"));      uList.add(new User("芙蓉","345"));      request.setAttribute("uList", uList);  %>  <c:forEach var="user" items="${ uList }">      ${ user.username } -- ${ user.password }  </c:forEach>      <h4>迭代數據</h4>  <h4>迭代從1到10</h4>  <c:forEach var="i" begin="1" end="10" step="2">      ${ i }  </c:forEach>      <h4>計算從1加到100的和</h4>  <c:set var="sum" value="0" scope="page"></c:set>  <c:forEach var="i" begin="1" end="100" step="1" varStatus="status">      <c:set var="sum" value="${ sum + i }"></c:set>  </c:forEach>  ${ sum }      <h4>遍歷10到100的偶數,每到第3個數,顯示紅色</h4>  <c:forEach var="i" begin="10" end="100" step="2" varStatus="status">      <c:choose>          <c:when test="${ status.first }">              <font color="blue">${ i }</font>          </c:when>          <c:when test="${ status.count % 3 eq 0 }">              <font color="red">${ i }</font>          </c:when>          <c:otherwise>              ${ i }          </c:otherwise>      </c:choose>  </c:forEach>    </body>  </html>  

 <c:forTokens>

用來切分字符串
名稱說明EL類型必須默認值
var用來存放現在指到的成員NString
items被迭代的字符串YString
delims定義用來分割字符串的字符NString
varStatus用來存放現在指到的相關成員信息NString
begin開始的位置Yint0
end結束的位置Yint最后一個成員
<c:set var="s" value="aaa,bbb,ccc" scope="page"></c:set><c:forTokens items="${s}" delims="," var="e">${e }</c:forTokens>語法格式:<c:forTokens items=要切分的字符串delims=按著什么格式切分var=定義變量[varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> //body內容</c:forTokens>在WebRoot/jstl目錄下新建forTokens.jsp代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>      <!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>    <h4>分隔字符串</h4>  <c:set var="i" value="aa,bb,cc" scope="page"></c:set>  <c:forTokens items="${i }" delims="," var="x">      ${ x }  </c:forTokens>    </body>  </html>  

<c:param>標簽

在JSP頁面進行URL的相關操作時,經常要在URL地址后面附加一些參數。<c:param>標簽可以嵌套在<c:import>、<c:url>或<c:redirect>標簽內,為這些標簽所使用的URL地址附加參數。<c:param>標簽在為一個URL地址附加參數時,將自動對參數值進行URL編碼,例如:如果傳的參數值為“中國”,則將其轉換為“%d6%d0%b9%fa”后再附加到URL地址后面,這也就是使用<c:param>標簽的最大好處示例:<c:param name="name"  value="value" />

<c:import>標簽

名稱說明EL類型必須默認值
url一文件被包含的地址YString
context項目虛擬路徑YString
var儲存被包含的文件的內容(以String類型存入)YString
scopevar變量的JSP范圍NStringpage
charEncoding被包含文件的內容的編碼方式YString
varReader儲存被包含的文件的內容(以Reader類型存入)NString
<!-- 引入foreach.jsp 效果類似包含--><c:import url="/jstl/foreach.jsp" context="/day8"></c:import><hr/><!-- 引入不顯示,將內容保存另一個變量中 --><c:import url="/jstl/foreach.jsp" context="/day8" var="content" scope="page"></c:import>${content }<c:import url="http://java.sun.com" ><c:param name="test" value="1234" /></c:import>在WebRoot/jstl/下新建 import.jsp(包含choose.jsp 并在choose.jsp 中獲取參數)實例代碼如下:
<!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>    <h4>JSTL方式</h4>  <c:import url="/jstl/choose.jsp" context="/day13" var="i" scope="page">      <c:param name="username" value="meimei"></c:param>  </c:import>    ${ i }      </body>  </html>  

<c:url>標簽

<c:url>標簽用于在JSP頁面中構造一個URL地址,其主要目的是實現URL重寫。URL重寫就是將會話標識以參數形式附加在URL地址后面。(類似于session追蹤 尤其是當瀏覽器禁用cookie后,就是說實現了session追蹤的功能)
屬性名是否支持EL屬性類型屬性描述
valuetrueString指定要構造的URL
varfalseString指定將構造出的URL結果保存到Web域中的屬性名稱
scopefalseString指定將構造出的URL結果保存在哪個域中
在WebRoot/jstl/下新建url.jsp 
<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>        <!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>    <h4>JSTL方式</h4>  <c:url var="i" value="/jstl/choose.jsp" scope="request" context="/day13">      <c:param name="username" value="xiaofeng"></c:param>  </c:url>  <c:set var="s" value="劉勛" scope="session"></c:set>  <a href="${ i }">choose</a> <br>  i= ${i } <br>  <%      String url = "/day12/index.jsp";      url = response.encodeURL(url);  %>    <!-- 將/day8/index.jsp 進行url重寫,保存page范圍 myurl中 -->  <c:url value="/index.jsp" context="/day13" var="myurl" scope="page" />    url=  <%=url %> <br>  myurl= ${myurl } <br>    <!-- 通過c:url 結合 c:param 對中文完成URL編碼 -->  <c:url value="/login" context="/day13" var="myurl2" scope="page">      <c:param name="username" value="張三"></c:param>  </c:url>  myurl2= ${myurl2 } <br>    </body>  </html> 修改choose.jsp 如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>        <!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>  <c:out value="${s }"></c:out>  <h4>獲取參數</h4>  <%= request.getParameter("username") %>    <h4>傳統方式</h4>  <%      int a = 10;      if(a >= 10 ){          out.print("a >= 10");      }else if(a < 10){          out.print("a < 10");      }else{          out.print("其他");      }  %>    <h4>JSTL方式</h4>  <c:set var="i" value="10" scope="page"></c:set>  <c:choose>      <c:when test="${ i ge 10 }">          i >= 10      </c:when>      <c:when test="${ i lt 10 }">          i < 10      </c:when>      <c:otherwise>          其他      </c:otherwise>  </c:choose>          </body>  </html>  禁用瀏覽器的cookie后,運行如下:點擊choose跳轉到choose.jsp

<c:redirect>標簽

<c:redirect>標簽用于實現請求重定向
屬性名是否支持EL屬性類型屬性描述
urltrueString指定要轉發或重定向到的目標資源的URL地址
contexttrueString當要使用相對路徑重定向到同一個服務器下的其他WEB應用程序中的資源時,context屬性指定其他WEB應用程序的名稱
注意:如果重定向第三方的網站時要使用絕對路徑(不能再使用Context)<% // 以前重定向// response.sendRedirect("/day12/index.jsp");%><c:redirect url="/index.jsp" context="/day12"></c:redirect>在WebRoot/jstl下新建redirect.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>        <!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>    <h4>JSTL方式</h4>    <c:redirect url="/jstl/choose.jsp" context="/day13">      <c:param name="username" value="furong"></c:param>  </c:redirect>    </body>  </html>  

 EL函數庫

JSTL中的常用EL函數

EL函數是用來操作字符串的由于在JSP頁面中顯示數據時,經常需要對顯示的字符串進行處理,SUN公司針對一些常見處理定義了一套EL函數庫供開發者使用。這些EL函數在JSTL開發包中進行描述,因此在JSP頁面中使用SUN公司的EL函數庫,需要導入JSTL開發包,并在頁面中導入EL函數庫,如下所示:  在頁面中使用JSTL定義的EL函數:  <%@taglib  uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"  %> (可以在fn.tld文件中查看)

 fn:toLowerCase 

fn:toLowerCase函數將一個字符串中包含的所有字符轉換為小寫形式,并返回轉換后的字符串,它接收一個字符串類型的參數,例如:  fn:toLowerCase("Www.IT315.org")的返回值為字符串"www.it315.org"  fn.toLowerCase("") 的返回值為空字符串

fn:toUpperCase

fn:toUpperCase函數將一個字符串中包含的所有字符轉換為大寫形式,并返回轉換后的字符串,它接收一個字符串類型的參數。例如:  fn:toUpperCase("www.IT315.org")的返回值為字符串"WWW.IT315.ORG"  fn:toUpperCase("")的返回值為空字符串

fn:trim

fn:trim函數刪除一個字符串的首尾的空格,并返回刪除空格后的結果字符串,它接收一個字符串類型的參數。需要注意的是,fn:trim函數不能刪除字符串中間位置的空格 例如:fn:trim("   www.it3 15.org ")的返回值字符串是"www.it 315.org"

fn:length

    fn:length函數返回一個集合或數組大小,或返回一個字符串中包含的字符的個數,返回值是int類型。fn:length函數接收一個參數,這個參數可以是<c:forEach>標簽的items屬性支持的任何類型,包括任意類型的數組、java.util.Collection、java.util.Iterator、java.util.Enumeration、java.util.Map等類的實例對象和字符串。   如果fn:length函數的參數為null或者是元素個數為0的集合或數組對象,則函數返回0;如果參數是空字符串,則函數返回0;

fn:split

   fn:split函數以指定字符串作為分隔符,將一個字符串分割成數組并返回這個字符串數組。   fn:split函數接收兩個字符串類型的參數,第一個參數表示要分割的字符串,第二個參數表示作為分隔符的字符串。   例如:fn:split("www.it315.org",".")[1]的返回值為字符串"it315"

fn:join

fn:join函數以一個字符串作為分隔符,將一個字符串數組中的所有元素合并為一個字符串并返回合并后的結果字符串。fn:join函數接收兩個參數,第一個參數是要操作的字符串數組,第二個參數是作為分隔符的字符串。如果fn:join函數的第二個參數是空字符串,則fn:join函數的返回值直接將元素連接起來。例如: 假設stringArray是保存在Web域中的一個屬性,它表示一個值為{"www","it315","org"}的字符串數組,則fn:join(stringArray,".")返回字符串"www.it315.org"fn:join(fn:split("www,it315,org",","),".") 的返回值為字符串"www.it315.org"

fn:indexOf

fn:indexOf 函數返回指定字符串在一個字符串中第一次出現的索引值,返回值為int類型。fn:indexOf函數接收兩個字符串類型的參數,如果第一個參數字符串中包含第二個參數字符串,那么不管第二個參數字符串在第一個參數字符串中出現幾次,fn:indexOf函數總是返回第一次出現的索引值;如果第一個參數中不包含第二個參數,則fn:indexOf函數返回-1。如果第二個參數為空字符串,則fn:indexOf函數總是返回0。例如:fn:indexOf("www.it315.org","t3") 的返回值為5

fn:contains

    fn:contains函數檢測一個字符串中是否包含指定的字符串,返回值為布爾類型。fn:contains函數在比較兩個字符串是否相等時是大小寫敏感的。    fn:contains函數接收兩個字符串類型的參數,如果第一個字符串中包含第二個參數字符串返回true,否則返回false。如果第二個參數的值為空字符串,則fn:contains函數總是返回true。實際上,fn:contains(string,substring)等價于fn:indexOf(string,sunstring)!= -1忽略大小寫的EL函數:fn:containsIgnoreCase

fn:startsWith

fn:startsWith 函數用于檢測一個字符串是否以指定的字符串開始的,返回值為布爾類型。fn:startsWith 函數接收兩個字符串類型的參數,如果第一個參數字符串以第二個參數字符串開始,則函數返回true,否則函數返回false。如果第二個參數為空字符串,則fn:startsWith函數總是返回true。例如:fn:startsWith("www.it315.org","it315")的返回值為false與之對應的EL函數:fn:endsWith

fn:replace

fn:replace函數將一個字符串中包含的指定字符串替換為其他的指定字符串,并返回替換后的結果字符串。fn:replace("www it315 org"," ",".")的返回值為字符串"www.it315.org"

fn:substring

fn:substring 函數用于截取一個字符串的子字符串并返回截取到的子字符串。fn:substring函數接收三個參數,第一個參數是用于指定要操作的源字符串,第二個參數是用于指定截取子字符串開始的索引值,第三個參數是用于指定截取子字符串結束的索引值,第二個參數和第三個參數都是int類型,其值都從0開始例如:fn:substring("www.it315.org",4,9)的返回值為字符串"it315"

fn:substringAfter

fn:substringAfter函數用于截取并返回一個字符串中的指定字符串第一次出現之后的子字符串。fn:substringAfter函數接收兩個字符串類型的參數,第一個參數表示要操作的源字符串,第二個參數表示指定的子字符串。fn:substringAfter("www.it315.org",".")的返回值為字符串"it315.org"與之對應的EL函數為:fn:substringBefore

自定義EL函數開發步驟

 EL自定義函數開發與應用包括以下三個步驟:編寫一個Java類,方法必須是靜態方法。在WEB-INF目錄下新建一個tld的文件。   沒有標簽的提示,復制http://java.sun.com/xml/ns/j2ee , 合并名稱   設置2.0,設置url和shortname編寫標簽庫描述符(tld)文件,在tld文件配置自定義函數   使用function標簽配置自定義函數。   使用name標簽配置方法名(可以任意)   使用function-class標簽配置類的全路徑   使用function-signature 標簽配置返回值類型(中間有空格)方法名稱(參數類型)在JSP頁面中導入和自定義函數

開發EL function注意事項

編寫標簽庫描述文件后,需要將它放置到<web應用>/WEB-INF目錄中或WEB-INF目錄下的除了classes和lib目錄之外的任意子目錄中。TLD文件中的<uri>元素用指定該TLD文件的URI,在JSP文件中需要通過這個URI來引入該標簽庫描述文件。<function>元素用于描述一個EL自定義函數,其中:   <name>子元素用于指定EL自定義函數的名稱。   <funtion-class>子元素用于指定完整的Java類名。   <function-signature>子元素用于指定Java類中的靜態方法的簽名,方法簽名必須指明方法的返回類型以及各個參數的類型,各個參數之間用逗號分隔。實例如下:在src下新建一個cn.itcast.el的包,在包內新建ElDemo1.java代碼如下:
package cn.itcast.el;    public class ElDemo1 {            public static String sayHello(String name){          return "hello "+name;      }        }  在WebRoot/WEB-INF下新建myfn的tld文件 并進行配置:配置后的代碼如下:
<?xml version="1.0" encoding="UTF-8"?>  <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">   <tlib-version>1.0</tlib-version>   <short-name>myfn</short-name>   <uri>http://www.itcast.cn/1110/myfn</uri>      <!-- 配置自定義的EL函數 -->   <function>      <!-- 配置方法名稱 -->      <name>sayHi</name>      <!-- 方法所在的類 -->      <function-class>cn.itcast.el.ElDemo1</function-class>      <!-- 配置方法的簽名 -->      <function-signature>java.lang.String sayHello(java.lang.String)</function-signature>   </function>     </taglib>  在WebRoot根目錄下新建el文件夾,在里面新建demo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>        <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>    <%@ taglib uri="http://www.itcast.cn/1110/myfn" prefix="myfn" %>        <!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>    ${ fn:length("abcdefg") }    ${ fn:toUpperCase("abcdefg") }    ${ myfn:sayHi("小風") }    </body>  </html>  

自定義標簽

自定義標簽簡介

自定義標簽主要用于移除JSP頁面中的Java代碼,提高代碼的復用性使用自定義標簽移除jsp頁面在奇偶那個的Java代碼,只需要完成以下步驟: 編寫一個實現Tag接口的Java類(標簽處理器)編寫標簽庫描述符(tld)文件,在tld文件中對標簽處理器類描述成一個標簽參考Tomcat中example項目中的JSP部分因為企業業務需求是多種多樣的,所以常見開源框架只能提供通用的Java代碼功能,如果實現既定業務邏輯功能,需要自定義標簽。通過自定義標簽(簡化復雜業務開發)

簡單標簽

由于傳統標簽使用三個標簽接口來完成不同的功能,顯得過于繁瑣,不利于標簽技術的推廣,SUN公司為降低標簽技術的學習難度,在JSP2.0中定義了一個更為簡單、便于編寫和調用的SimpleTag接口來實現標簽的功能。實現SimpleTag接口的標簽通常稱為簡單標簽。SimpleTag方法介紹setJspContext方法:用于把JSP頁面的pageContext對象傳遞給標簽處理器對象。setParent方法:用于把父標簽處理器對象傳遞給當前標簽處理器對象。getParent方法:用于獲得當前標簽的父標簽處理對象。setJspBody方法:用于把代表標簽體的JspFragment對象傳遞給標簽處理器對象。即傳入標簽體緩存對象(封裝了標簽體內容)doTag方法:用于完后所有標簽邏輯,包括輸出、迭代、修改標簽體內容等。在doTag方法中可以拋出javax.servlet.jsp.SkipPageException異常,用于通知WEB容器不再執行JSP頁面中位于結束標記后面的內容,這等效于在傳統標簽的doEndTag方法中返回Tag.SKIP_PAGE常量的情況。簡單標簽庫開發常用功能,實現SimpleTag接口標簽類(SimpleTag JSP2.0 之后為了簡化標簽開發提供的)編寫簡單的標簽類,只需要繼承SimpleTagSupport類  setJspContext 傳入pageContext對象  setParent 傳入父標簽對象  setJSPBody 傳入標簽體緩存對象(封裝了標簽體內容)  doTag (執行標簽,在該方法中編寫標簽代碼邏輯)在setJSPBody方法中傳入對象JSPFragment,該對象封裝了標簽體內容,控制標簽體內容輸出最重要方法invoke(Writer out) 意義將標簽體內容輸出到指定字符輸出流中。注意:在簡單標簽庫中<bodyContent>不能寫JSP,而必須寫scriptless

SimpleTag接口方法的執行順序:

當web容器開始執行標簽時,會調用如下方法完成標簽的初始化:WEB容器調用標簽處理器對象的setJspContext方法,將代表JSP頁面的pageContext對象傳遞給標簽處理器對象。WEB容器調用標簽處理器對象的setParent方法,將父標簽處理器對象傳遞給這個標簽處理器對象。注意,只有在標簽存在父標簽的情況下,WEB容器才會調用這個方法。如果調用標簽時設置了屬性,容器將調用每個屬性對應的setter方法把屬性值傳遞給標簽處理器對象。如果標簽的屬性值是EL表達式,則WEB容器首先計算表達式的值,然后把值傳遞給標簽處理器對象。如果簡單標簽有標簽體,容器將調用setJSPBody方法把代表標簽體的JspFragment對象傳遞進來。 執行標簽時: 容器調用標簽處理器的doTag() 方法,開發人員在方法內通過操作JspFragment對象,就可以實現是否執行、迭代、修改標簽體的目的。

JSPFragment類

(1)javax.servlet.jsp.tagext.JspFragment類是在JSP2.0中定義的,它的實例對象代表JSP頁面中的一段符合JSP語法規范的JSP片段,這段JSP片段中不能包含JSP腳本元素。(2)WEB容器在處理簡單標簽的標簽體時,會把標簽體內容用一個JspFragment對象表示,并調用標簽處理器對象的setJSPBody方法把JspFragment對象傳遞給標簽處理器對象。JspFragment類中只定義了兩個方法,如下所示:      getJspContext方法:用于返回代表調用頁面的JspContext對象——pageContext      public abstract void invoke(java.io.Writer  out) 輸出標簽內容           用于執行JspFragment對象所代表的JSP代碼片段           參數out用于指定將JspFragment對象的執行結果寫入到哪個輸出流對象中,如果傳遞給參數out的值為null,則            將執行結果寫入到JspContext.getOut()方法返回的輸出流對象中。(簡而言之,可以理解為寫給瀏覽器)

   invoke方法詳解

JspFragment.invoke方法是JspFragment最重要的方法,利用這個方法可以控制是否執行和輸出標簽體的內容、是否迭代執行標簽體的內容或對標簽體的執行結果進行修改后再輸出。例如:在標簽處理器中如果沒有調用JspFragment.invoke方法,其結果就相當于忽略標簽體內容;在標簽體處理器中重復調用JspFragment.invoke方法,則標簽體內容會被重復執行;若想在標簽處理器中修改標簽體內容,只需在調用invoke方法時指定一個可取出結果數據的輸出流對象(例如:StringWriter),讓標簽體的執行結果輸出到該輸出流對象中,然后從該輸出流對象中取出數據進行修改后在輸出到目標設備,即可達到修改標簽體的目的。例:控制標簽后的jsp頁面是否執行   doTag       throw new SkipPageException   TLD配置     <tag>       <name>demo2</name>       <tag-class>simple.MyTag2</tag-class>        <body-content>empty</body-content>      </tag>  

自定義標簽入門

需求:自定義標簽<myc:print>在頁面中輸出hello步驟一:編寫標簽類       編寫一個類,繼承SimpleTagSupport       重寫兩個方法,doTag()和setJspContext(JspContext pc)       通過JspContext 對象可以獲取out對象向外輸出內容步驟二:提供tld文件進行配置       通過<tag>標簽配置自定義標簽       配置標簽名稱<name>print</name>       配置標簽的類<tag-class>xxx.xxx.xxx</tag-class>       配置標簽體的內容<body-content>empty</body-content>步驟三:在JSP頁面中引入該標簽庫

 自定義帶有標簽體的標簽

需求:自定義標簽<myc:out>在頁面中輸出內容步驟一:編寫標簽類      編寫一個類,繼承SimpleTagSupport      重寫兩個方法,doTag()和setJspContext(JspContext pc)      在doTag()中通過getJspBody()獲取JspFragment標簽體,調用invoke(null)步驟二:提供tld文件進行配置      通過<tag>標簽配置自定義標簽      配置標簽名稱<name>out</name>      配置標簽的類<tag-class>xxx.xxx.xxx</tag-class>      配置標簽體的內容<body-content>scriptless</body-content>步驟三:在JSP的頁面中引入該標簽庫

Body-content的配置

<body-content>元素的可選值有:empty:不能有標簽體內容JSP:標簽體內容可以是任何東西:EL、JSTL、<%= %>、<%%>,以及HTML;但不建議使用Java代碼段,SimpleTag已經不再支持使用<body-content>JSP</body-content>scriptless:標簽體內容不能是Java代碼段,但可以是EL、JSTL等。tagdependent:標簽體內容不做運算,由標簽處理類自行處理,無論標簽體內容是EL、JSP、JSTL,都不會做運算。

自定義帶有屬性的標簽

需求:自定義標簽<myc:if>在頁面中輸出內容步驟一:編寫標簽類     編寫一個類,繼承SimpleTagSupport類。     提供頁面的屬性,設置成boolean類型。并提供set方法,頁面的屬性與類中的屬性名稱必須相同。     重寫doTag()方法,判斷屬性是否為true,通過getJspBody()獲取JspFragment標簽體,調用invoke(null)步驟二:提供tld文件進行配置     通過<tag>標簽配置自定義標簽     配置標簽名稱<name>if</name>     配置標簽的類<tag-class>xxx.xxx.xxx</tag-class>     配置標簽體的內容<body-content>scriptless</body-content>     配置屬性<attribute>在屬性中配置其他信息</attribute>步驟三:在JSP頁面中引入標簽庫attribute的配置(1)配置屬性名稱       <name>test</name>(2)屬性是否是必須的       <required>true</required>(3)配置是否支持EL表達式       <rtexprvalue>true</rtexprvalue>(4)配置屬性的類型       <type>boolean</type>

在TLD中描述標簽屬性attribute

元素名是否必須指定描述
description用于指定屬性的描述信息
name用于指定屬性的名稱。屬性名稱是大小寫敏感的,并且不能以jsp、_jsp、java和sun開頭
required用于指定在JSP頁面中調用自定義標簽時是否必須設置這個屬性。其取值包括true和false,默認值是false,true表示必須設置,否則可以設置也可以不設置該屬性。
rtexprvaluertexprvalue是runtime expression value(運行時表達式)的英文簡寫,用于指定屬性值是一個靜態值或動態值。其取值包括true和false,默認值是false,false表示只能為該屬性指定靜態文本值,例如"123"; true表示可以為該屬性指定一個JSP動態元素,動態元素的結果作為屬性值,例如JSP表達式<%=value %>
type用于指定屬性值的Java類型。默認是String
<tag>元素的<attribute>子元素用于描述自定義標簽的一個屬性,自定義標簽所具有的每個屬性都要對應一個<attribute>元素 。<attribute><description>description</description><name>aaaa</name><required>true</required><rtexprvalue>true</rtexprvalue><type>ObjectType</type></attribute>實例如下:在WEB項目的src目錄下新建cn.itcast.tag包,在包內新建三個標簽實現類TagDemo1.java (沒有標簽體的自定義標簽) 
package cn.itcast.tag;    import java.io.IOException;    import javax.servlet.jsp.JspContext;  import javax.servlet.jsp.JspException;  import javax.servlet.jsp.PageContext;  import javax.servlet.jsp.tagext.SimpleTagSupport;    /**  * 對外輸出Hello  * @author Administrator  *  */  public class TagDemo1 extends SimpleTagSupport{            private PageContext pc;            public void doTag() throws JspException, IOException {          pc.getOut().write("Hello");      }            /**      * 服務器默認先執行該方法      */      public void setJspContext(JspContext pc) {          this.pc = (PageContext) pc;      }    }  TagDemo2.java (有標簽體 處理標簽體內容):
package cn.itcast.tag;    import java.io.IOException;  import java.io.StringWriter;    import javax.servlet.jsp.JspContext;  import javax.servlet.jsp.JspException;  import javax.servlet.jsp.PageContext;  import javax.servlet.jsp.tagext.JspFragment;  import javax.servlet.jsp.tagext.SimpleTagSupport;    /**  * 帶有標簽主體  * @author Administrator  *  */  public class TagDemo2 extends SimpleTagSupport{            private PageContext pc;            public void doTag() throws JspException, IOException {          JspFragment jf = getJspBody();          StringWriter sw = new StringWriter();          //通過invoke方法將標簽體內容寫入到參數Writer對象sw中          jf.invoke(sw);          // 獲取標簽體內容          String content = sw.toString().toUpperCase();          pc.getOut().print(content);      }            public void setJspContext(JspContext pc) {          this.pc = (PageContext)pc;      }  }  TagDemo3.java (有屬性 有標簽體的自定義標簽)
package cn.itcast.tag;    import java.io.IOException;    import javax.servlet.jsp.JspException;  import javax.servlet.jsp.tagext.SimpleTagSupport;    /**  * 類似<c:if>標簽,帶有屬性的  * @author Administrator  *  */  public class TagDemo3 extends SimpleTagSupport{            private boolean test;            public void setTest(boolean test) {          this.test = test;      }            public void doTag() throws JspException, IOException {          if(test){              getJspBody().invoke(null);          }      }        }  在WebRoot/WEB-INF 目錄下新建myc.tld文件配置內容如下:
<?xml version="1.0" encoding="UTF-8"?>  <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">   <tlib-version>1.0</tlib-version>   <short-name>myc</short-name>   <uri>http://www.itcast.cn/1110/myc</uri>      <!-- 配置自定義標簽 -->   <tag>      <!-- 配置標簽名稱 -->      <name>print</name>      <!-- 配置標簽的類 -->      <tag-class>cn.itcast.tag.TagDemo1</tag-class>      <!-- 配置標簽主體 -->      <body-content>empty</body-content>   </tag>      <!-- 配置自定義標簽 -->   <tag>      <!-- 配置標簽名稱 -->      <name>out</name>      <!-- 配置標簽的類 -->      <tag-class>cn.itcast.tag.TagDemo2</tag-class>      <!-- 配置標簽主體 -->      <body-content>scriptless</body-content>   </tag>      <!-- 配置自定義標簽 -->   <tag>      <!-- 配置標簽名稱 -->      <name>if</name>      <!-- 配置標簽的類 -->      <tag-class>cn.itcast.tag.TagDemo3</tag-class>      <!-- 配置標簽主體 -->      <body-content>scriptless</body-content>      <!-- 配置屬性 -->      <attribute>          <!-- 配置屬性名稱 -->          <name>test</name>          <!-- 屬性是否是必須的 -->          <required>true</required>          <!-- 是否支持EL表達式 -->          <rtexprvalue>true</rtexprvalue>          <!-- 屬性的類型 -->          <type>boolean</type>      </attribute>   </tag>     </taglib>  在WebRoot下新建tag文件夾,新建tag.jsp 測試自定義標簽內容
<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>        <%@ taglib uri="http://www.itcast.cn/1110/myc" prefix="myc" %>      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>        <!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>    <myc:print/>    <myc:out>      liuxun1993  </myc:out>    <c:set var="i" value="10"></c:set>  <myc:if test="${ i eq 10 }">      美美  </myc:if>      </body>  </html>  啟動服務器,運行結果如下:轉自http://blog.csdn.net/u013087513/article/details/54847678


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性视频1819p久久| 91九色视频导航| 亚洲国产欧美一区二区丝袜黑人| 中文字幕自拍vr一区二区三区| 北条麻妃一区二区三区中文字幕| 深夜福利亚洲导航| 国产日韩专区在线| 亚洲美腿欧美激情另类| 日韩在线观看免费全集电视剧网站| 亚洲国产精品va在线观看黑人| 日韩国产欧美精品在线| 九九精品在线视频| 国产视频综合在线| 2020国产精品视频| 国产精品久久久久久久9999| 亚洲成人激情小说| 成人做爰www免费看视频网站| 欧美老少配视频| 国产mv久久久| 日韩国产精品视频| 国产精品久久久久久久久粉嫩av| 欧美电影免费观看大全| 精品动漫一区二区三区| 国产精品一区二区久久国产| 国产日韩精品在线观看| 中文字幕欧美精品在线| 欧美另类99xxxxx| 岛国视频午夜一区免费在线观看| 亚洲精品日韩在线| 欧美福利在线观看| 欧美午夜精品久久久久久浪潮| 国产91在线视频| 欧美日韩亚洲视频一区| 亚洲免费成人av电影| 国产亚洲欧洲黄色| 国产精品女视频| 青青a在线精品免费观看| 日韩精品极品在线观看播放免费视频| 欧美电影在线观看完整版| 91大神福利视频在线| 国产成人久久久精品一区| 国产91在线播放精品91| 国产精品久久久久aaaa九色| 亚洲成人久久网| 57pao成人永久免费视频| 国产精品自拍网| 在线日韩第一页| 亚洲第一男人av| 亚洲美女精品久久| 久久久久久有精品国产| 精品成人乱色一区二区| 久久天天躁狠狠躁老女人| 久久久久九九九九| 7m第一福利500精品视频| 992tv成人免费视频| 欧美夫妻性生活视频| 日韩动漫免费观看电视剧高清| 国内精品视频在线| 亚洲二区在线播放视频| 97视频com| 国产精品久久久久久久久借妻| 亚洲免费高清视频| 夜夜嗨av一区二区三区四区| 国产精品va在线播放我和闺蜜| 欧美激情综合亚洲一二区| 亚洲最大福利网站| 欧美电影在线观看高清| 91精品国产综合久久久久久久久| 亚洲人成人99网站| 激情懂色av一区av二区av| 青青a在线精品免费观看| 欧美电影免费观看大全| 亚洲人成电影网站色| 亚洲一区二区日本| 日韩精品视频在线观看网址| 免费97视频在线精品国自产拍| 神马国产精品影院av| 日韩视频免费在线观看| 欧美又大又硬又粗bbbbb| 亚洲天堂网在线观看| 亚洲日韩欧美视频一区| 91精品在线播放| 97福利一区二区| 国产成人亚洲精品| 欧美大胆a视频| 国产成人极品视频| 久精品免费视频| 中文在线不卡视频| 第一福利永久视频精品| 色狠狠久久aa北条麻妃| 91久久嫩草影院一区二区| 国产91精品青草社区| 亚洲国产成人精品久久久国产成人一区| 欧美黄色片视频| 国色天香2019中文字幕在线观看| 亚洲欧美一区二区三区情侣bbw| 国产日韩欧美视频| 日韩视频免费在线观看| 国产精品自拍网| 中日韩美女免费视频网址在线观看| 97精品欧美一区二区三区| 亚洲大胆美女视频| 欧美二区乱c黑人| 久久久久久这里只有精品| 国产精品高潮在线| 国产主播喷水一区二区| 91免费精品国偷自产在线| 中文字幕国产亚洲2019| 一本一本久久a久久精品牛牛影视| 久久青草精品视频免费观看| 91亚洲精品久久久久久久久久久久| 91亚洲va在线va天堂va国| 亚洲免费视频网站| 97热在线精品视频在线观看| 麻豆国产精品va在线观看不卡| 国产69精品久久久| 日韩在线免费av| 亚洲精品电影网在线观看| 红桃av永久久久| 韩国19禁主播vip福利视频| 久久久亚洲精选| 国产一区二区三区直播精品电影| 亚洲欧美精品在线| 亚洲电影在线观看| 日韩av综合中文字幕| 日韩精品免费电影| 欧美日韩免费在线观看| 国产丝袜一区二区三区免费视频| 成人免费视频a| 黄色一区二区三区| 欧美日韩美女在线| 成人午夜在线观看| 国产热re99久久6国产精品| 国语自产偷拍精品视频偷| 国产精品一区二区久久久久| 亚洲精品色婷婷福利天堂| 欧洲成人性视频| 亚洲人成亚洲人成在线观看| 欧美日韩亚洲国产一区| 亚洲精品成人av| 久久精品国产亚洲精品| 插插插亚洲综合网| 亚洲一区二区久久久| 国产一区二区视频在线观看| 成人欧美一区二区三区在线湿哒哒| 国产精品看片资源| 国产精品欧美在线| 亚洲男人第一av网站| 午夜精品久久久久久久久久久久久| 亚洲欧美日韩久久久久久| 中文字幕日韩欧美| 精品福利免费观看| 国产成人精品视频在线观看| 亚洲激情电影中文字幕| 久久久久久久999精品视频| 91亚洲一区精品| 精品久久久中文| 毛片精品免费在线观看| 精品国产一区二区三区久久久狼| 久久夜色精品国产亚洲aⅴ| 亚洲欧美激情一区| 欧美成人精品一区| 欧美在线视频观看免费网站| 97视频在线观看亚洲|