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

歡迎訪問 生活随笔!

生活随笔

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

javascript

JSP 技巧整理

發布時間:2023/12/20 javascript 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSP 技巧整理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1 JSP 標準標簽庫(JSTL)
    • 1.1 時間戳顯示
    • 1.2 引用其他jsp文件
    • 1.3 spring支持的表單標簽
  • 2 JavaScript 插件
    • 2.1 jQuery Validation 表單驗證框架
      • 頁面引用
      • 默認校驗規則說明
      • 使用案例
        • 初始化
        • 自定義校驗規則
        • 封裝校驗器
    • 2.2 jQuery iCheck 單選/復選美化插件
      • 頁面引用
      • 激活 iCheck
      • 回調事件
      • 方法
      • 案例代碼
        • 全選
        • 判斷是否選中
    • 2.3 jQuery Datatables 表格插件
      • 頁面引用
      • 分頁查詢案例
        • 服務端
          • MyBatis 映射文件關鍵代碼
          • 定義數據訪問接口
          • 定義通用的分頁展示對象
          • Dao實現代碼
          • Controller層關鍵代碼
        • 客戶端
        • 以上內容參考以下文檔完成
    • 2.4 jQuery TreeTable 樹形表格插件
      • 頁面引用
      • 接口
        • 配置參數
        • 屬性說明
        • 使用方法
        • HTML 結構代碼
        • 注意事項
        • 演示效果
    • 2.4 jQuary DateTime 時間工具類
    • 2.5 jQuery zTree 樹插件
      • 頁面引用
      • 使用方法
      • HTML 結構代碼
      • 服務器關鍵代碼
      • 演示效果
    • 2.6 jQuery Dropzone 拖拽上傳插件
      • 頁面引用
      • 啟用 Dropzone
      • 配置 Dropzone
        • 配置參數
        • 國際化
        • 常用事件
      • 使用案例
      • 服務端支持
        • POM
        • 配置 spring-mvc.xml
        • Controller關鍵代碼
    • 2.7 jQuary wangEditor 富文本編輯器
      • 什么是富文本編輯器
      • 頁面引入
      • 啟用 wangEditor
      • 效果演示
      • 服務端圖片上傳支持
        • 控制器關鍵代碼參考
    • 2.7 jQuery nth-tabs 多功能選項卡插件
      • 2.7.1 其他依賴
      • 2.7.2 使用說明
        • 2.7.2.1 CSS
        • 2.7.2.2 JS
        • 2.7.2.3 html
        • 2.7.2.4 初始化
        • 2.7.2.5 添加一個選項卡
        • 2.7.2.6 添加一個不可關閉的選項卡
        • 2.7.2.7 添加多個選項卡
        • 2.7.2.8 刪除一個選項卡
        • 2.7.2.9 刪除其他選項卡
        • 2.7.2.10 刪除所有選項卡
        • 2.7.2.11 切換到指定選項卡
        • 2.7.2.12 定位到當前選項卡
        • 2.7.2.13 左滑動
        • 2.7.2.14 右滑動
        • 2.7.2.15 獲取左右滑動步值
        • 2.7.2.16 獲取當前選項卡ID
        • 2.7.2.17 獲取所有選項卡寬度
        • 2.7.2.18 獲取所有選項卡
      • 2.7.3 附:群里提供的版本
        • 2.7.3.1 CSS
        • 2.7.3.2 JS
        • 2.7.3.3 html
        • 2.7.3.4 初始化
        • 2.7.3.5 添加一個選項卡

1 JSP 標準標簽庫(JSTL)

1.1 時間戳顯示

  • 用 taglib 引用 fmt標簽庫
  • <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  • 顯示時間戳
  • <fmt:formatDate value="${user.created}" pattern="yyyy-MM-dd HH:mm:ss"/> <fmt:formatDate value="Sat Aug 01 12:28:39 CST 2015" pattern="yyyy-MM-dd HH:mm:ss"/>
  • formateDate屬性
  • value要顯示的日期是無
    typeDATE, TIME, 或 BOTHdate
    dateStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
    timeStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
    pattern自定義格式模式
    timeZone顯示日期的時區默認時區
    var存儲格式化日期的變量名顯示在頁面
    scope存儲格式化日志變量的范圍頁面

    1.2 引用其他jsp文件

    <jsp:include page="includes/footer.jsp"/>

    1.3 spring支持的表單標簽

    《走向單體地獄(八):Spring MVC 》
    中的 Spring MVC 表單標簽庫 和 Spring MVC @ModelAttribute聯合應用

    2 JavaScript 插件

    2.1 jQuery Validation 表單驗證框架

    頁面引用

    <!-- jQuery Validation 1.14.0 --> <script src="/static/assets/plugins/jquery-validation/js/jquery.validate.js"></script> <script src="/static/assets/plugins/jquery-validation/js/additional-methods.js"></script> <script src="/static/assets/plugins/jquery-validation/js/localization/messages_zh.js"></script>

    默認校驗規則說明

    規則取值說明
    requiredtrue必輸字段
    remotecheck.php使用 ajax 方法調用 check.php 驗證輸入值
    emailtrue必須輸入正確格式的電子郵件
    `url``true必須輸入正確格式的網址
    daterue必須輸入正確格式的日期
    dateISOtrue必須輸入正確格式的日期(ISO),例如:2009-06-23,1998/01/22 只驗證格式,不驗證有效性
    numbertrue必須輸入合法的數字(負數,小數)
    digitstrue必須輸入整數
    creditcard必須輸入合法的信用卡號
    equalTo#field輸入值必須和 #field 相同
    accept輸入擁有合法后綴名的字符串(上傳文件的后綴)
    maxlengthn輸入長度最多是n的字符串(漢字算一個字符)
    minlengthm輸入長度最小是10的字符串(漢字算一個字符)
    rangelength[n,m]輸入長度必須介于 n 和 m 之間的字符串")(漢字算一個字符)
    range[n,m]輸入值必須介于 n和 m 之間
    maxn輸入值不能大于 n
    minm輸入值不能小于 m

    使用案例

    初始化

    給input元素的class 添加校驗class

    <input path="username" class="form-control required" placeholder="用戶名" />

    定義初始化方法并調用即可

    /*** 初始化 jquery validation*/ var handlerInitValidate = function () {$("#inputForm").validate({errorElement: 'span', //定義錯誤元素為span 位于 #inputForm 表單中errorClass: 'help-block', //定義錯誤樣式的class為 help-blockerrorPlacement: function (error, element) {//定義觸發錯誤后的action error是上面定義的錯誤元素 element是錯誤觸發元素既input元素element.parent().parent().attr("class", "form-group has-error"); //替換樣式error.insertAfter(element); //把error元素插入input元素后面}}); };

    自定義校驗規則

    //手機號校驗規則 $.validator.addMethod("mobile", function(value, element) {var length = value.length;var mobile = /^(((13[0-9]{1})|(15[0-9]{1}))+\d{8})$/;return this.optional(element) || (length == 11 && mobile.test(value)); }, "手機號碼格式錯誤");

    封裝校驗器

    /*** 函數對象 之所以要聲明對象,是利用了對象的閉包特性,保證安全性*/ var Validate = function () {/*** 初始化 jquery validation*/var handlerInitValidate = function () {$("#inputForm").validate({errorElement: 'span', //定義錯誤元素為span 位于 #inputForm 表單中errorClass: 'help-block', //定義錯誤樣式的class為 help-blockerrorPlacement: function (error, element) {//定義觸發錯誤后的action error是上面定義的錯誤元素 element是錯誤觸發元素既input元素element.parent().parent().attr("class", "form-group has-error"); //替換樣式error.insertAfter(element); //把error元素插入input元素后面}});};/*** 增加自定義驗證規則*/var handlerInitCustomValidate = function () {$.validator.addMethod("mobile", function(value, element) {var length = value.length;var mobile = /^(((13[0-9]{1})|(15[0-9]{1}))+\d{8})$/;return this.optional(element) || (length == 11 && mobile.test(value));}, "手機號碼格式錯誤");};/*** return 外面的都是私有方法,return里面的都是公共方法*/return {/*** 初始化*/init: function () {handlerInitCustomValidate();handlerInitValidate();}}}();$(document).ready(function () {Validate.init(); });

    2.2 jQuery iCheck 單選/復選美化插件

    頁面引用

    CSS 部分

    <!-- iCheck for checkboxes and radio inputs --> <link rel="stylesheet" href="/static/assets/plugins/iCheck/all.css">

    JS 部分

    <!-- iCheck 1.0.1 --> <script src="/static/assets/plugins/iCheck/icheck.min.js"></script>

    激活 iCheck

    默認情況下 iCheck 是不生效的,需要使用 JS 代碼激活,此過程可以指定 iCheck 的皮膚,案例代碼如下:
    CSS 部分

    <input type="checkbox" class="minimal" />

    JS 部分

    // 激活 iCheck $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({checkboxClass: 'icheckbox_minimal-blue',radioClass : 'iradio_minimal-blue' });

    回調事件

    iCheck 提供了大量回調事件,都可以用來監聽 change 事件

    事件名稱使用時機
    ifClicked用戶點擊了自定義的輸入框或與其相關聯的 label
    ifChanged輸入框的 checked 或 disabled 狀態改變了
    ifChecked輸入框的狀態變為 checked
    ifUncheckedchecked 狀態被移除
    ifDisabled輸入框狀態變為 disabled
    `ifEnableddisabled 狀態被移除
    ifCreated輸入框被應用了 iCheck 樣式
    ifDestroyediCheck 樣式被移除

    使用 on()方法綁定事件:

    $('input').on('ifChecked', function(event){alert(event.type + ' callback'); });

    方法

    下面這些方法可以用來通過編程方式改變輸入框狀態(可以使用任何選擇器):

    • $(‘input’).iCheck(‘check’);:將輸入框的狀態設置為 checked
    • $(‘input’).iCheck(‘uncheck’);:移除 checked 狀態
    • $(‘input’).iCheck(‘toggle’);:toggle checked state
    • $(‘input’).iCheck(‘disable’);:將輸入框的狀態設置為 disabled
    • $(‘input’).iCheck(‘enable’);:移除 disabled 狀態
    • $(‘input’).iCheck(‘update’);:apply input changes, which were done outside the plugin
    • $(‘input’).iCheck(‘destroy’);:移除 iCheck 樣式

    案例代碼

    全選

    _checkboxMaster = $(".checkbox-master");//主選框 _checkbox = $("tbody").find("[type='checkbox']").not("[disabled]");//所有子選框 _checkboxMaster.on("ifClicked", function (e) {//全選事件// 當前狀態已選中,點擊后應取消選擇if (e.target.checked) {_checkbox.iCheck("uncheck");}// 當前狀態未選中,點擊后應全選else {_checkbox.iCheck("check");} });

    判斷是否選中

    _checkbox.each(function () {// 判斷是否選中var delFlag = $(this).is(":checked");if (delFlag) {_idArray.push($(this).attr("id"));} });

    2.3 jQuery Datatables 表格插件

    中文網站:http://www.datatables.club/
    實例索引:http://www.datatables.club/example/
    參考手冊:http://www.datatables.club/manual/
    幫助文檔:http://www.datatables.club/reference/

    頁面引用

    CSS 部分

    <!-- DataTables --> <link rel="stylesheet" href="/static/assets/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css">

    JS 部分

    <!-- DataTables --> <script src="/static/assets/bower_components/datatables.net/js/jquery.dataTables.min.js"></script> <script src="/static/assets/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>

    使用,啟用 0 配置模式

    $('#dataTable').DataTable();

    分頁查詢案例

    服務端

    MyBatis 映射文件關鍵代碼

    DataTables 分頁需要提供查詢數據的總筆數,以下為查詢總筆數的關鍵代碼:

    <select id="count" resultType="java.lang.Integer">SELECT COUNT(*) FROM tb_user </select>

    這里我們使用 MySQL 作為數據庫,由于需要傳入分頁參數,這里我們還使用了 Map 作為查詢參數類型,以下為 MySQL 分頁查詢的關鍵代碼:

    <select id="page" resultType="TbUser" parameterType="java.util.Map">SELECT<include refid="tbUserColumns" />FROMtb_user AS a LIMIT #{page}, #{pageSize} </select>
    定義數據訪問接口
    /*** 分頁查詢* @param params* @return*/ List<TbUser> page(Map<String, Object> params);/*** 查詢總數* @return*/ int count();
    定義通用的分頁展示對象

    創建一個名為 PageInfo 的分頁數據展示對象,代碼如下:

    package com.funtl.my.shop.commons.dto;import com.funtl.my.shop.commons.persistence.BaseEntity;import java.io.Serializable; import java.util.List;/*** 分頁展示對象* <p>Title: PageInfo</p>* <p>Description: </p>** @author Lusifer* @version 1.0.0* @date 2018/6/21 5:17*/ public class PageInfo<T extends BaseEntity> implements Serializable {private int draw; //標識private int recordsTotal; //未過濾數據總數private int recordsFiltered; //過濾后的數據總數private List<T> data; //返回數據private String error; //錯誤提示public int getDraw() {return draw;}public void setDraw(int draw) {this.draw = draw;}public int getRecordsTotal() {return recordsTotal;}public void setRecordsTotal(int recordsTotal) {this.recordsTotal = recordsTotal;}public int getRecordsFiltered() {return recordsFiltered;}public void setRecordsFiltered(int recordsFiltered) {this.recordsFiltered = recordsFiltered;}public List<T> getData() {return data;}public void setData(List<T> data) {this.data = data;}public String getError() {return error;}public void setError(String error) {this.error = error;} }
    Dao實現代碼
    @Override public PageInfo<TbUser> page(Map<String, Object> params) {PageInfo<TbUser> pageInfo = new PageInfo<>();int count = tbUserDao.count();List<TbUser> tbUsers = tbUserDao.page(params);pageInfo.setRecordsTotal(count);pageInfo.setRecordsFiltered(count);pageInfo.setData(tbUsers);return pageInfo; }
    Controller層關鍵代碼
    /*** 分頁查詢** @param request* @return*/ @ResponseBody @RequestMapping(value = "page", method = RequestMethod.GET) public PageInfo<TbUser> page(HttpServletRequest request) {String draw = request.getParameter("draw");int start = Integer.parseInt(request.getParameter("start"));int length = Integer.parseInt(request.getParameter("length"));Map<String, Object> params = new HashMap<>();params.put("page", start);params.put("pageSize", length);PageInfo<TbUser> pageInfo = tbUserService.page(params);pageInfo.setDraw(draw == null ? 0 : Integer.parseInt(draw));return pageInfo; }

    客戶端

    使用 DataTables 分頁功能,需要開啟一些列的相關配置,分頁的數據結果是由 Ajax 請求獲取并解析 JSON格式數據自動封裝進表格的,代碼如下:

    $("#dataTable").DataTable({// 是否開啟本地分頁"paging": true,// 是否開啟本地排序"ordering": false,// 是否顯示左下角信息"info": true,// 是否允許用戶改變表格每頁顯示的記錄數"lengthChange": false,// 是否顯示處理狀態(排序的時候,數據很多耗費時間長的話,也會顯示這個)"processing": true,// 是否允許 DataTables 開啟本地搜索"searching": false,// 是否開啟服務器模式"serverSide": true,// 控制 DataTables 的延遲渲染,可以提高初始化的速度"deferRender": true,// 增加或修改通過 Ajax 提交到服務端的請求數據"ajax": {"url": "/user/page"},// 分頁按鈕顯示選項"pagingType": "full_numbers",// 設置列的數據源"columns": [{"data": function (row, type, val, meta) {return '<input id="' + row.id + '" type="checkbox" class="minimal" />';}},{"data": "id"},{"data": "username"},{"data": "phone"},{"data": "email"},{"data": "updated"},{"data": function (row, type, val, meta) {return '<a href="#" type="button" class="btn btn-sm btn-default"><i class="fa fa-search"></i> 查看</a>&nbsp;&nbsp;&nbsp;' +'<a href="#" type="button" class="btn btn-sm btn-primary"><i class="fa fa-edit"></i> 編輯</a>&nbsp;&nbsp;&nbsp;' +'<a href="#" type="button" class="btn btn-sm btn-danger"><i class="fa fa-trash-o"></i> 刪除</a>'}}],// 表格重繪的回調函數,激活iCheck插件"drawCallback": function (settings) {App.initCheckbox();},// 國際化"language": {"sProcessing": "處理中...","sLengthMenu": "顯示 _MENU_ 項結果","sZeroRecords": "沒有匹配結果","sInfo": "顯示第 _START_ 至 _END_ 項結果,共 _TOTAL_ 項","sInfoEmpty": "顯示第 0 至 0 項結果,共 0 項","sInfoFiltered": "(由 _MAX_ 項結果過濾)","sInfoPostFix": "","sSearch": "搜索:","sUrl": "","sEmptyTable": "表中數據為空","sLoadingRecords": "載入中...","sInfoThousands": ",","oPaginate": {"sFirst": "首頁","sPrevious": "上頁","sNext": "下頁","sLast": "末頁"},"oAria": {"sSortAscending": ": 以升序排列此列","sSortDescending": ": 以降序排列此列"}} })

    以上內容參考以下文檔完成

    配置選項:http://www.datatables.club/reference/option/
    服務器處理:http://www.datatables.club/manual/server-side.html
    設置列的數據源:https://datatables.net/reference/option/columns.data
    國際化:http://www.datatables.club/manual/i18n.html

    2.4 jQuery TreeTable 樹形表格插件

    treeTable 是跨瀏覽器、性能很高的 jQuery 的樹表組件,它使用非常簡單,只需要引用 jQuery 庫和一個 js 文件,接口也很簡單。

    優點:

    • 兼容主流瀏覽器:支持 IE6 和 IE6+, Firefox, chrome, Opera, Safari
    • 接口簡潔:在普通表格的基礎上增加父子關系的自定義標簽就可以
    • 組件性能高:內部實現了只綁定了 table 的事件、使用了 css sprite 合并圖片等
    • 提供兩種風格:通過參數來設置風格

    頁面引用

    CSS 部分

    <link rel="stylesheet" href="/static/assets/plugins/treeTable/themes/vsStyle/treeTable.min.css" />

    JS 部分

    <script src="/static/assets/plugins/treeTable/jquery.treeTable.min.js"></script>

    接口

    配置參數

    參數取值類型說明
    themestring主題,有兩個選項:default、vsStyle. 默認:default
    expandLevelint樹表的展開層次. 默認:1
    columnlint可控制列的序號. 默認:0,即第一列
    onSelectlfunction擁有 controller 自定義屬性的元素的點擊事件,return false 則中止展開
    beforeExpandlfunction展開子節點前觸發的事件

    屬性說明

    屬性取值類型說明
    idstring行的 id
    pIdstring父行的 id
    controllerbool指定某一個元素是否可以控制行的展開
    hasChild:bool指定某一個 tr 元素是否有孩子(動態加載需用到)
    isFirstOnebool指定某一個 tr 元素是否是第一個孩子(自動生成屬性,只讀)
    isLastOnebool指定某一個 tr 元素是否是最后一個孩子(自動生成屬性,只讀)
    prevIdstring前一個兄弟節點的 id(自動生成屬性,只讀)
    depthstring當前行的深度(自動生成屬性,只讀)

    使用方法

    $(function () {$("#treeTable").treeTable({expandLevel: 2,column: 1}); });

    HTML 結構代碼

    <table id="treeTable1" style="width:100%"><tr><td style="width:200px;">標題</td><td>內容</td></tr><tr id="1"><td><span controller="true">1</span></td><td>內容</td></tr><tr id="2" pId="1"><td><span controller="true">2</span></td><td>內容</td></tr><tr id="3" pId="2"><td>3</td><td>內容</td></tr><tr id="4" pId="2"><td>4</td><td>內容</td></tr><tr id="5" pId="4"><td>4.1</td><td>內容</td></tr><tr id="6" pId="1" hasChild="true"><td>5</td><td>注意這個節點是動態加載的</td></tr><tr id="7"><td>8</td><td>內容</td></tr> </table>

    注意事項

    這里的 HTML 結構是經過排序的,每行數據必須緊跟其子類目的數據項,結構類似于:

    類目 1類目 1-1類目 1-2... 類目 2類目 2-1 類目 3 類目 4

    服務端排序代碼如下:

    // 調用方法,0 為約定好的根節點 sortList(sourceList, targetList, 0L);/*** 排序* @param sourceList 數據源集合* @param targetList 排序后的集合* @param parentId 當前的父級類目 ID*/ private void sortList(List<TbContentCategory> sourceList, List<TbContentCategory> targetList, Long parentId) {for (TbContentCategory sourceContentCategory : sourceList) {if (sourceContentCategory.getParentId().equals(parentId)) {targetList.add(sourceContentCategory);// 判斷有沒有子節點,有則繼續追加if (sourceContentCategory.getParent()) {for (TbContentCategory tbContentCategory : sourceList) {if (tbContentCategory.getParentId().equals(sourceContentCategory.getId())) {sortList(sourceList, targetList, sourceContentCategory.getId());break;}}}}} }

    演示效果

    2.4 jQuary DateTime 時間工具類

    使用時只需要調用 DateTime函數對象中return的公共方法即可

    /*** 日期時間工具類* @type {{dateFormat}}*/ var DateTime = function () {var patterns = {PATTERN_ERA: 'G', // Era 標志符 Era strings. For example: "AD" and "BC"PATTERN_YEAR: 'y', // 年PATTERN_MONTH: 'M', // 月份PATTERN_DAY_OF_MONTH: 'd', // 月份的天數PATTERN_HOUR_OF_DAY1: 'k', // 一天中的小時數(1-24)PATTERN_HOUR_OF_DAY0: 'H', // 24 小時制,一天中的小時數(0-23)PATTERN_MINUTE: 'm', // 小時中的分鐘數PATTERN_SECOND: 's', // 秒PATTERN_MILLISECOND: 'S', // 毫秒PATTERN_DAY_OF_WEEK: 'E', // 一周中對應的星期,如星期一,周一PATTERN_DAY_OF_YEAR: 'D', // 一年中的第幾天PATTERN_DAY_OF_WEEK_IN_MONTH: 'F', // 一月中的第幾個星期(會把這個月總共過的天數除以7,不夠準確,推薦用W)PATTERN_WEEK_OF_YEAR: 'w', // 一年中的第幾個星期PATTERN_WEEK_OF_MONTH: 'W', // 一月中的第幾星期(會根據實際情況來算)PATTERN_AM_PM: 'a', // 上下午標識PATTERN_HOUR1: 'h', // 12 小時制 ,am/pm 中的小時數(1-12)PATTERN_HOUR0: 'K', // 和 h 類型PATTERN_ZONE_NAME: 'z', // 時區名PATTERN_ZONE_VALUE: 'Z', // 時區值PATTERN_WEEK_YEAR: 'Y', // 和 y 類型PATTERN_ISO_DAY_OF_WEEK: 'u',PATTERN_ISO_ZONE: 'X'};var week = {'ch': {"0": "\u65e5","1": "\u4e00","2": "\u4e8c","3": "\u4e09","4": "\u56db","5": "\u4e94","6": "\u516d"},'en': {"0": "Sunday","1": "Monday","2": "Tuesday","3": "Wednesday","4": "Thursday","5": "Friday","6": "Saturday"}};/*** 獲取當前時間* @returns {string}*/var handlerGetCurrentTime = function () {var today = new Date();var year = today.getFullYear();var month = today.getMonth() + 1;var day = today.getDate();var hours = today.getHours();var minutes = today.getMinutes();var seconds = today.getSeconds();var timeString = year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;return timeString;};/*** 比較時間大小* time1 > time2 return 1* time1 < time2 return -1* time1 == time2 return 0* @param time1* @param time2* @returns {number}*/var handlerCompareTime = function (time1, time2) {if (Date.parse(time1.replace(/-/g, "/")) > Date.parse(time2.replace(/-/g, "/"))) {return 1;} else if (Date.parse(time1.replace(/-/g, "/")) < Date.parse(time2.replace(/-/g, "/"))) {return -1;} else if (Date.parse(time1.replace(/-/g, "/")) == Date.parse(time2.replace(/-/g, "/"))) {return 0;}};/*** 是否閏年* @param year* @returns {boolean}*/var handlerIsLeapYear = function (year) {return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);};/*** 獲取某個月的天數,從 0 開始* @param year* @param month* @returns {*}*/var handlerGetDaysOfMonth = function (year, month) {return [31, (this.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];};/*** 獲取某個月的天數,從 0 開始* @param year* @param month* @returns {number}*/var handlerGetDaysOfMonth2 = function (year, month) {// 將天置為 0,會獲取其上個月的最后一天month = parseInt(month) + 1;var date = new Date(year, month, 0);return date.getDate();};/*** 距離現在幾天的日期:負數表示今天之前的日期,0 表示今天,整數表示未來的日期* 如 -1 表示昨天的日期,0 表示今天,2 表示后天* @param days* @returns {string}*/var handlerFromToday = function (days) {var today = new Date();today.setDate(today.getDate() + days);var date = today.getFullYear() + "-" + (today.getMonth() + 1) + "-" + today.getDate();return date;};/*** 格式化日期時間* @param dateTime 需要格式化的日期時間* @param pattern 格式化的模式,如 yyyy-MM-dd hh(HH):mm:ss.S a k K E D F w W z Z* @returns {*}*/var handlerFormat = function (dateTime, pattern) {var date = new Date(dateTime);if (pattern == null || pattern.length == 0) {return date.toLocaleString();}return pattern.replace(/([a-z])\1*/ig, function (matchStr, group1) {var replacement = "";switch (group1) {case patterns.PATTERN_ERA: //Gbreak;case patterns.PATTERN_WEEK_YEAR: //Ycase patterns.PATTERN_YEAR: //yreplacement = date.getFullYear();break;case patterns.PATTERN_MONTH: //Mvar month = date.getMonth() + 1;replacement = (month < 10 && matchStr.length >= 2) ? "0" + month : month;break;case patterns.PATTERN_DAY_OF_MONTH: //dvar days = date.getDate();replacement = (days < 10 && matchStr.length >= 2) ? "0" + days : days;break;case patterns.PATTERN_HOUR_OF_DAY1: //k(1~24)var hours24 = date.getHours();replacement = hours24;break;case patterns.PATTERN_HOUR_OF_DAY0: //H(0~23)var hours24 = date.getHours();replacement = (hours24 < 10 && matchStr.length >= 2) ? "0" + hours24 : hours24;break;case patterns.PATTERN_MINUTE: //mvar minutes = date.getMinutes();replacement = (minutes < 10 && matchStr.length >= 2) ? "0" + minutes : minutes;break;case patterns.PATTERN_SECOND: //svar seconds = date.getSeconds();replacement = (seconds < 10 && matchStr.length >= 2) ? "0" + seconds : seconds;break;case patterns.PATTERN_MILLISECOND: //Svar milliSeconds = date.getMilliseconds();replacement = milliSeconds;break;case patterns.PATTERN_DAY_OF_WEEK: //Evar day = date.getDay();replacement = week['ch'][day];break;case patterns.PATTERN_DAY_OF_YEAR: //Dreplacement = dayOfTheYear(date);break;case patterns.PATTERN_DAY_OF_WEEK_IN_MONTH: //Fvar days = date.getDate();replacement = Math.floor(days / 7);break;case patterns.PATTERN_WEEK_OF_YEAR: //wvar days = dayOfTheYear(date);replacement = Math.ceil(days / 7);break;case patterns.PATTERN_WEEK_OF_MONTH: //Wvar days = date.getDate();replacement = Math.ceil(days / 7);break;case patterns.PATTERN_AM_PM: //avar hours24 = date.getHours();replacement = hours24 < 12 ? "\u4e0a\u5348" : "\u4e0b\u5348";break;case patterns.PATTERN_HOUR1: //h(1~12)var hours12 = date.getHours() % 12 || 12; //0轉為12replacement = (hours12 < 10 && matchStr.length >= 2) ? "0" + hours12 : hours12;break;case patterns.PATTERN_HOUR0: //K(0~11)var hours12 = date.getHours() % 12;replacement = hours12;break;case patterns.PATTERN_ZONE_NAME: //zreplacement = handlerGetZoneNameValue(date)['name'];break;case patterns.PATTERN_ZONE_VALUE: //Zreplacement = handlerGetZoneNameValue(date)['value'];break;case patterns.PATTERN_ISO_DAY_OF_WEEK: //ubreak;case patterns.PATTERN_ISO_ZONE: //Xbreak;default:break;}return replacement;});};/*** 計算一個日期是當年的第幾天* @param date* @returns {number}*/var handlerDayOfTheYear = function (date) {var obj = new Date(date);var year = obj.getFullYear();var month = obj.getMonth(); //從0開始var days = obj.getDate();var daysArr = [31, (this.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];for (var i = 0; i < month; i++) {days += daysArr[i];}return days;};/*** 獲得時區名和值* @param dateObj* @returns {{name: string, value: string}}*/var handlerGetZoneNameValue = function (dateObj) {var date = new Date(dateObj);date = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));var arr = date.toString().match(/([A-Z]+)([-+]\d+:?\d+)/);var obj = {'name': arr[1],'value': arr[2]};return obj;};return {getCurrentTime: function () {return handlerGetCurrentTime();},compareTime: function (time1, time2) {return handlerCompareTime(time1, time2);},isLeapYear: function (year) {return handlerIsLeapYear(year);},getDaysOfMonth: function (year, month) {return handlerGetDaysOfMonth(year, month);},getDaysOfMonth2: function (year, month) {return handlerGetDaysOfMonth2(year, month);},fromToday: function (days) {return handlerFromToday(days);},format: function (dateTime, pattern) {return handlerFormat(dateTime, pattern);},dayOfTheYear: function (date) {return handlerDayOfTheYear(date);},getZoneNameValue: function (dateObj) {return handlerGetZoneNameValue(dateObj);}} }();

    2.5 jQuery zTree 樹插件

    zTree 是一個依靠 jQuery 實現的多功能 “樹插件”。優異的性能、靈活的配置、多種功能的組合是 zTree 最大優點,具體用法請參考官方文檔。

    頁面引用

    CSS 部分

    <link rel="stylesheet" href="/static/assets/plugins/jquery-ztree/css/zTreeStyle/zTreeStyle.min.css" />

    JS 部分

    <script src="/static/assets/plugins/jquery-ztree/js/jquery.ztree.core-3.5.min.js"></script>

    使用方法

    開啟 zTree 異步加載數據的功能,案例代碼如下:

    var setting = {view: {// 禁止多選selectedMulti: false},async: {// 開啟異步加載功能enable: true,// 遠程訪問地址url: "/content/category/tree/data",// 選擇父節點時會自動將節點中的參數傳回服務器再重新取結果autoParam: ["id"]} };// 初始化 zTree 控件 $.fn.zTree.init($("#myTree"), setting); // 綁定事件 $("#btnModalOk").bind("click", function () {// 獲取 zTree 控件var zTree = $.fn.zTree.getZTreeObj("myTree");// 獲取已選中的節點var nodes = zTree.getSelectedNodes();if (nodes.length == 0) {alert("請先選擇一個父節點");}else {var node = nodes[0];alert(node.id);} });

    HTML 結構代碼

    <ul id="myTree" class="ztree"></ul>

    服務器關鍵代碼

    Controller 層

    @ResponseBody @RequestMapping(value = "tree/data", method = RequestMethod.POST) public List<TbContentCategory> treeData(String id) {if (id == null) {id = "0";}List<TbContentCategory> tbContentCategories = tbContentCategoryService.selectByPid(Long.parseLong(id));return tbContentCategories; }

    Dao 層
    查找pid為傳入id的List

    <select id="selectByPid" resultType="TbContentCategory">SELECTa.id,a.name,a.status,a.sort_order AS sortOrder,a.is_parent AS isParent,a.created,a.updated,IFNULL (b.id, '0') AS "parent.id",IFNULL (b.name, '/') AS "parent.name"FROMtb_content_category AS aLEFT JOIN tb_content_category AS b ON a.parent_id = b.idWHERE a.parent_id = #{parentId} </select>

    演示效果

    2.6 jQuery Dropzone 拖拽上傳插件

    Dropzone 是一個開源的 JavaScript 庫,提供文件的異步上傳功能,并支持拖拽上傳功能

    頁面引用

    CSS 部分,其中 basic.min.css 提供了官網的炫酷上傳效果

    <link rel="stylesheet" href="/static/assets/plugins/dropzone/min/dropzone.min.css" /> <link rel="stylesheet" href="/static/assets/plugins/dropzone/min/basic.min.css" />

    JS 部分

    <script src="/static/assets/plugins/dropzone/min/dropzone.min.js"></script>

    啟用 Dropzone

    只需要一個 div 元素,用 JavaScript 代碼啟用即可

    HTML 結構如下:

    <div id="dropz" class="dropzone"></div>

    JavaScript 啟用代碼如下:

    var myDropzone = new Dropzone("#dropz", {url: "/upload",dictDefaultMessage: '拖動文件至此或者點擊上傳', // 設置默認的提示語句paramName: "dropzFile", // 傳到后臺的參數名稱init: function () {this.on("success", function (file, data) {// 上傳成功觸發的事件});} });

    其中 url 是必須的值,指明文件上傳提交到哪個頁面。其他的值都是可選的,如果使用默認值的話可以省略。

    配置 Dropzone

    此插件的特色就在于非常靈活,提供了許多可選項、事件等。下面分類介紹常用的配置項。

    配置參數

    參數說明
    url最重要的參數,指明了文件提交到哪個頁面
    method默認為 post,如果需要,可以改為 put
    paramName相當于 元素的 name 屬性,默認為 file
    maxFilesize最大文件大小,單位是 MB
    maxFiles默認為 null,可以指定為一個數值,限制最多文件數量
    addRemoveLinks默認 false。如果設為 true,則會給文件添加一個刪除鏈接
    acceptedFiles指明允許上傳的文件類型,格式是逗號分隔的 MIME type 或者擴展名。例如:image/*, application/pdf, .psd, .obj
    uploadMultiple指明是否允許 Dropzone 一次提交多個文件。默認為 false。如果設為 true,則相當于 HTML 表單添加 multiple 屬性
    headersl如果設定,則會作為額外的 header 信息發送到服務器。例如:{“custom-header”: “value”}
    initl一個函數,在 Dropzone 初始化的時候調用,可以用來添加自己的事件監聽器
    forceFallbackFallback 是一種機制,當瀏覽器不支持此插件時,提供一個備選方案。默認為 false。如果設為 true,則強制 fallback
    fallback一個函數,如果瀏覽器不支持此插件則調用

    國際化

    參數說明
    dictDefaultMessage沒有任何文件被添加的時候的提示文本
    dictFallbackMessageallback 情況下的提示文本
    dictInvalidInputType文件類型被拒絕時的提示文本
    dictFileTooBig文件大小過大時的提示文本
    dictCancelUpload取消上傳鏈接的文本
    dictCancelUploadConfirmation取消上傳確認信息的文本
    dictRemoveFile移除文件鏈接的文本
    dictMaxFilesExceeded超過最大文件數量的提示文本

    常用事件

    以下事件接收 file 為第一個參數

    事件說明
    addedfile添加了一個文件時發生
    removedfile一個文件被移除時發生。你可以監聽這個事件并手動從服務器刪除這個文件
    uploadprogress上傳時按一定間隔發生這個事件。第二個參數為一個整數,表示進度,從 0 到 100。第三個參數是一個整數,表示發送到服務器的字節數。當一個上傳結束時,Dropzone 保證會把進度設為 100。注意:這個函數可能被以同一個進度調用多次
    success文件成功上傳之后發生,第二個參數為服務器響應
    complete當文件上傳成功或失敗之后發生
    canceled當文件在上傳時被取消的時候發生
    maxfilesreached當文件數量達到最大時發生
    maxfilesexceeded當文件數量超過限制時發生

    以下事件接收一個 file list 作為第一個參數(僅當 uploadMultiple 被設為 true 時才會發生)

    事件說明
    successmultiple成功上傳
    completemultiple上傳完畢
    cancelmultiple上傳失敗

    特殊事件

    事件說明
    totaluploadprogress第一個參數為總上傳進度,第二個參數為總字節數,第三個參數為總上傳字節數。

    使用案例

    var myDropzone = new Dropzone("#dropz", {url: "/upload", // 文件提交地址method: "post", // 也可用putparamName: "file", // 默認為filemaxFiles: 1,// 一次性上傳的文件數量上限maxFilesize: 2, // 文件大小,單位:MBacceptedFiles: ".jpg,.gif,.png,.jpeg", // 上傳的類型addRemoveLinks: true,parallelUploads: 1,// 一次上傳的文件數量//previewsContainer:"#preview", // 上傳圖片的預覽窗口dictDefaultMessage: '拖動文件至此或者點擊上傳',dictMaxFilesExceeded: "您最多只能上傳1個文件!",dictResponseError: '文件上傳失敗!',dictInvalidFileType: "文件類型只能是*.jpg,*.gif,*.png,*.jpeg。",dictFallbackMessage: "瀏覽器不受支持",dictFileTooBig: "文件過大上傳文件最大支持.",dictRemoveLinks: "刪除",dictCancelUpload: "取消",init: function () {this.on("addedfile", function (file) {// 上傳文件時觸發的事件});this.on("success", function (file, data) {// 上傳成功觸發的事件});this.on("error", function (file, data) {// 上傳失敗觸發的事件});this.on("removedfile", function (file) {// 刪除文件時觸發的方法});} });

    服務端支持

    前端工作做完后,后臺需要提供文件上傳支持,我們使用 Spring MVC 來接收上傳的文件

    POM

    Spring MVC 上傳文件需要 commons-fileupload:commons-fileupload 依賴支持,pom.xml 文件如下:

    <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.2</version> </dependency>

    配置 spring-mvc.xml

    需要 Spring 注入 multipartResolver 視圖解析器實例,spring-mvc.xml 增加如下配置:

    <!-- 上傳文件攔截,設置最大上傳文件大小 10M = 10*1024*1024(B) = 10485760 bytes --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="10485760"/> </bean>

    Controller關鍵代碼

    package com.funtl.my.shop.web.admin.web.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.UUID;/*** 文件上傳控制器* <p>Title: UploadController</p>* <p>Description: </p>** @author Lusifer* @version 1.0.0* @date 2018/6/27 0:42*/ @Controller public class UploadController {@ResponseBody@RequestMapping(value = "upload", method = RequestMethod.POST)public Map<String, Object> upload(MultipartFile dropzFile, HttpServletRequest request) {Map<String, Object> result = new HashMap<>();// 獲取上傳的原始文件名String fileName = dropzFile.getOriginalFilename();// 設置文件上傳路徑String filePath = request.getSession().getServletContext().getRealPath("/static/upload");// 獲取文件后綴String fileSuffix = fileName.substring(fileName.lastIndexOf("."), fileName.length());// 判斷并創建上傳用的文件夾File file = new File(filePath);if (!file.exists()) {file.mkdir();}// 重新設置文件名為 UUID,以確保唯一file = new File(filePath, UUID.randomUUID() + fileSuffix);try {// 寫入文件dropzFile.transferTo(file);} catch (IOException e) {e.printStackTrace();}// 返回 JSON 數據,這里只帶入了文件名result.put("fileName", file.getName());return result;} }

    2.7 jQuary wangEditor 富文本編輯器

    輕量級 web 富文本編輯器,配置方便,使用簡單。支持 IE10+ 瀏覽器。

    官網:http://www.wangEditor.com
    文檔:http://www.kancloud.cn/wangfupeng/wangeditor3/332599
    源碼:http://github.com/wangfupeng1988/wangEditor

    什么是富文本編輯器

    富文本編輯器,Rich Text Editor, 簡稱 RTE, 它提供類似于 Microsoft Word 的編輯功能,容易被不會編寫 HTML 的用戶并需要設置各種文本格式的用戶所喜愛。它的應用也越來越廣泛。最先只有 IE 瀏覽器支持,其它瀏覽器相繼跟進,在功能的豐富性來說,還是 IE 強些。雖然沒有一個統一的標準,但對于最基本的功能,各瀏覽器提供的 API 基本一致,從而使編寫一個跨瀏覽器的富文本編輯器成為可能。

    頁面引入

    CSS 部分

    <link rel="stylesheet" href="/static/assets/plugins/wangEditor/wangEditor.min.css" />

    JS 部分

    <script src="/static/assets/plugins/wangEditor/wangEditor.min.js"></script>

    啟用 wangEditor

    只需要一個 div 元素,用 JavaScript 代碼啟用即可
    HTML 結構如下:

    <div id="editor"></div>

    JavaScript 啟用代碼如下:

    var E = window.wangEditor; var editor = new E('#editor'); editor.create();

    效果演示

    配置完成后,在瀏覽器端顯示如下:

    服務端圖片上傳支持

    配置方式同 Dropzone 圖片上傳插件,參考官方手冊完成

    控制器關鍵代碼參考

    package com.funtl.my.shop.web.admin.web.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.UUID;/*** 文件上傳控制器* <p>Title: UploadController</p>* <p>Description: </p>** @author Lusifer* @version 1.0.0* @date 2018/6/27 14:32*/ @Controller public class UploadController {private static final String UPLOAD_PATH = "/static/upload/";/*** 文件上傳** @return*/@ResponseBody@RequestMapping(value = "upload", method = RequestMethod.POST)public Map<String, Object> upload(MultipartFile editorFile, HttpServletRequest request) {Map<String, Object> result = new HashMap<>();// 獲取文件后綴String fileName = editorFile.getOriginalFilename();String fileSuffix = fileName.substring(fileName.lastIndexOf("."));// 文件存放路徑String filePath = request.getSession().getServletContext().getRealPath(UPLOAD_PATH);// 判斷路徑是否存在,不存在則創建文件夾File file = new File(filePath);if (!file.exists()) {file.mkdir();}// 將文件寫入目標file = new File(filePath, UUID.randomUUID() + fileSuffix);try {editorFile.transferTo(file);} catch (IOException e) {e.printStackTrace();}// 獲取服務端路徑String serverPath = String.format("%s://%s:%s%s%s", request.getScheme(), request.getServerName(), request.getServerPort(), request.getContextPath(), UPLOAD_PATH);// 返回給 wangEditor 的數據格式result.put("errno", 0);result.put("data", new String[]{serverPath + file.getName()});return result;} } 相比 Dropzone 圖片上傳插件 一節,控制器代碼的主要差別在于接口返回的數據格式,官方要求的格式如下:{// errno 即錯誤代碼,0 表示沒有錯誤。// 如果有錯誤,errno != 0,可通過下文中的監聽函數 fail 拿到該錯誤碼進行自定義處理"errno": 0,// data 是一個數組,返回若干圖片的線上地址"data": ["圖片1地址","圖片2地址","……"] }

    2.7 jQuery nth-tabs 多功能選項卡插件

    2.7.1 其他依賴

    滾動條:jquery.scrollbar
    字體圖標:font-awesome

    2.7.2 使用說明

    整體基于Bootstrap整合

    2.7.2.1 CSS

    <link href="https://cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.bootcss.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet"> <link href="https://cdn.bootcss.com/jquery.scrollbar/0.2.11/jquery.scrollbar.min.css" rel="stylesheet"> <link href="css/nth.tabs.min.css" rel="stylesheet">

    2.7.2.2 JS

    <script src="https://cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script> <script src="https://cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> <script src="https://cdn.bootcss.com/jquery.scrollbar/0.2.11/jquery.scrollbar.min.js"></script> <script src="js/nth.tabs.min.js"></script>

    2.7.2.3 html

    <div class="nth-tabs" id="custom-id"></div>

    2.7.2.4 初始化

    nthTabs = $("#custom-id").nthTabs();

    2.7.2.5 添加一個選項卡

    nthTabs.addTab({id:'a',title:'孫悟空',content:'看我七十二變', });

    2.7.2.6 添加一個不可關閉的選項卡

    nthTabs.addTab({id:'a',title:'孫悟空',content:'看我七十二變',allowClose:false, });

    2.7.2.7 添加多個選項卡

    nthTabs.addTab({id:'a',title:'孫悟空',content:'看我七十二變', }).addTab({id:'b',title:'孫悟空二號',content:'看我七十三變', });

    2.7.2.8 刪除一個選項卡

    nthTabs.delTab('id');

    2.7.2.9 刪除其他選項卡

    nthTabs.delOtherTab();

    2.7.2.10 刪除所有選項卡

    nthTabs.delAllTab();

    2.7.2.11 切換到指定選項卡

    nthTabs.setActTab(id);

    2.7.2.12 定位到當前選項卡

    nthTabs.locationTab();

    2.7.2.13 左滑動

    $('.roll-nav-left').click();

    2.7.2.14 右滑動

    $('.roll-nav-right').click();

    2.7.2.15 獲取左右滑動步值

    nthTabs.getMarginStep();

    2.7.2.16 獲取當前選項卡ID

    nthTabs.getActiveId();

    2.7.2.17 獲取所有選項卡寬度

    nthTabs.getAllTabWidth();

    2.7.2.18 獲取所有選項卡

    nthTabs.nthTabs.getTabList();

    2.7.3 附:群里提供的版本

    群里提供的版本是為了適應 AdminLTE 而修改的版本,使用方式略有不同

    2.7.3.1 CSS

    <link href="https://cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.bootcss.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet"> <link href="https://cdn.bootcss.com/jquery.scrollbar/0.2.11/jquery.scrollbar.min.css" rel="stylesheet"> <link href="css/nth.tabs.css" rel="stylesheet">

    主要修改了 nth.tabs.css 部分樣式以適應 AdminLTE

    2.7.3.2 JS

    <script src="https://cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script> <script src="https://cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> <script src="https://cdn.bootcss.com/jquery.scrollbar/0.2.11/jquery.scrollbar.min.js"></script> <script src="js/nth.tabs.min.js"></script> <script src="js/nth-tabs.js"></script>

    主要增加了 nth-tabs.js 這個二次封裝的自定義工具類

    var NthTabs = function () {var nthTabs;var handleInit = function () {nthTabs = $("#editor-tabs").nthTabs();};var handleHome = function (src) {nthTabs.addTab({id: "home",title: "首頁",content: '<iframe name="iframe0" width="100%" height="737" src="' + src + '" frameborder="0"></iframe>',allowClose: false,active: true});};var handleAddTab = function (id, title, src) {// 判斷選項卡是否存在var hasTab = false;var nthTabList = nthTabs.getTabList();for (var i = 0 ; i < nthTabList.length ; i++) {var nthTab = nthTabList[i];if (nthTab.id == "#" + id) {nthTabs.setActTab(id);hasTab = true;break;}}// 選項卡已存在,返回if (hasTab) {return;}nthTabs.addTab({id: id,title: title,content: '<iframe name="iframe' + id + '" width="100%" height="737" src="' + src + '" frameborder="0"></iframe>'});nthTabs.setActTab(id);};return {init: function () {handleInit();},home: function (src) {handleHome(src)},addTab: function (id, title, src, allowClose, active) {handleAddTab(id, title, src, allowClose, active);}}; }();jQuery(document).ready(function () {NthTabs.init(); });

    2.7.3.3 html

    <div class="nth-tabs common-bg" id="editor-tabs"></div>

    2.7.3.4 初始化

    $(function () {NthTabs.home("/path"); });

    2.7.3.5 添加一個選項卡

    NthTabs.addTab('id', 'name', '/path');

    總結

    以上是生活随笔為你收集整理的JSP 技巧整理的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    精品999在线观看 | 日韩特级黄色片 | 亚洲国产精品日韩 | 四虎影视4hu4虎成人 | 在线观看中文字幕2021 | 国产剧在线观看片 | 免费成人av | 成年人视频在线免费 | 午夜视频在线观看一区二区三区 | 少妇高潮冒白浆 | 日本久热 | 日韩欧美专区 | 天天干天天想 | 中文字幕有码在线播放 | 欧美精品v国产精品v日韩精品 | 九九国产视频 | 国产黄色理论片 | 91色吧 | 91探花国产综合在线精品 | 国产999精品久久久久久绿帽 | 亚洲粉嫩av | 成人一区二区在线 | 日本精品视频一区二区 | 亚洲欧美国内爽妇网 | 99精品视频在线播放观看 | 久久午夜精品影院一区 | 色狠狠操| 日韩专区av | 黄色在线观看污 | 欧美片一区二区三区 | 少妇搡bbbb搡bbb搡忠贞 | 国产护士hd高朝护士1 | 九九综合在线 | 日本久久久久久久久久久 | 欧美另类网站 | 欧美激情第十页 | 国产亚洲午夜高清国产拍精品 | 中文字幕在线播放一区 | 国产精品久久久久久久久久直播 | 精品免费国产一区二区三区四区 | 午夜精品影院 | 成人免费视频网站在线观看 | 江苏妇搡bbbb搡bbbb | 亚洲人成免费 | 波多野结衣视频一区 | 欧美在线视频第一页 | 一区在线电影 | 成人av网址大全 | 色婷婷狠狠18 | 狠狠色噜噜狠狠狠合久 | 7777精品伊人久久久大香线蕉 | 99综合电影在线视频 | 久久躁日日躁aaaaxxxx | 日本久久成人中文字幕电影 | 久久久久久久免费看 | 亚洲久草在线 | 成年人黄色大片在线 | 婷婷精品视频 | 欧美a在线免费观看 | 天天色天天射天天操 | 欧美精品久久久久久久久久白贞 | 日本精品在线 | 国产免费黄视频在线观看 | 五月天综合网站 | 亚洲午夜精品久久久久久久久久久久 | 久久69精品 | 夜夜夜夜爽 | 久久九九精品久久 | 伊人网综合在线观看 | 免费麻豆视频 | 久久视频免费看 | 999成人 | 久久久久草 | 久久国产美女视频 | 国产手机在线视频 | 国产精品高清在线观看 | 丁香综合av | 日韩一级黄色片 | 精品国产欧美一区二区三区不卡 | 国产精品一级在线 | 日精品| 日韩视频在线不卡 | 国产一区二区久久 | 亚洲成av片人久久久 | 97av在线| 久久视频这里有久久精品视频11 | 欧美一进一出抽搐大尺度视频 | 99久久99热这里只有精品 | 日韩乱理 | 成人av资源在线 | 成av人电影 | 99色国产| 91成人黄色 | 搡bbbb搡bbb视频| 亚洲精品小视频 | 麻豆免费精品视频 | 国产福利不卡视频 | 在线99视频 | www.eeuss影院av撸 | 国产一区二区午夜 | 久久精品小视频 | 91精品电影| 国内精品久久久久久久久久久久 | 在线观看的av | 久久午夜精品视频 | 精品国产一区二区三区四区在线观看 | 免费网站在线观看人 | 日韩中文字幕网站 | 久久人人射| 国产成人精品午夜在线播放 | 国产操在线 | 69国产盗摄一区二区三区五区 | 国产精品video爽爽爽爽 | 国产91精品一区二区 | 国产成人一级 | 亚洲人片在线观看 | 欧美日韩不卡一区 | 国产午夜三级一二三区 | 99热在线网站 | 夜夜躁狠狠躁日日躁视频黑人 | 国产九色在线播放九色 | 91麻豆.com | 日韩三级久久 | 色婷婷六月| 天天操天天爱天天爽 | 午夜精品视频福利 | 中文字幕免费高清 | 午夜精品电影一区二区在线 | 久久精品超碰 | 国产高清在线免费视频 | 欧美精品一二 | 国产精品亚洲精品 | a在线免费观看视频 | 国产精品麻豆果冻传媒在线播放 | 成人免费精品 | 91精品国产成人www | 久久艹精品 | 国产精品二区在线观看 | 国内视频在线观看 | 在线看国产精品 | 手机看片| 国产99免费视频 | 久久精品视频网 | 99国产成+人+综合+亚洲 欧美 | 亚州中文av | 国产日产精品一区二区三区四区 | 国产日韩欧美在线一区 | www黄色| 香蕉精品视频在线观看 | 黄色片网站av | 成人精品视频久久久久 | 欧美日韩精品免费观看视频 | av专区在线 | 久久久久成人精品 | 精品欧美一区二区在线观看 | 亚洲精品高清一区二区三区四区 | 中文字幕av免费观看 | 中文字幕 在线看 | www.久久久精品 | 二区三区毛片 | 在线天堂日本 | 在线小视频你懂得 | 精品国产欧美一区二区三区不卡 | 天天操夜夜爱 | 最新不卡av | 亚洲国产中文字幕在线观看 | 91精品国产成人 | 国产精品24小时在线观看 | 黄色的片子 | 亚洲精品国产高清 | 久久婷婷开心 | 亚洲爱av| www.伊人网 | 久久综合欧美精品亚洲一区 | 日韩免费电影一区二区 | 精品二区视频 | 国产视频2021| 天天爽天天碰狠狠添 | 久久精品国产精品亚洲 | 天天干,天天射,天天操,天天摸 | 国产三级午夜理伦三级 | 久久国内精品 | 丝袜美腿av | 国产成人综合图片 | 久久精品一区八戒影视 | 久久综合色播五月 | 国产麻豆精品久久一二三 | 一级理论片在线观看 | 亚洲黄色成人网 | 国产精品成人aaaaa网站 | 超碰97网站 | 亚在线播放中文视频 | 国产精品地址 | 日韩激情视频在线观看 | 久久综合五月婷婷 | 久久综合久色欧美综合狠狠 | av色图天堂网 | 国产精品国产亚洲精品看不卡 | 天天干,天天射,天天操,天天摸 | 欧美精品一区二区蜜臀亚洲 | 在线观看中文字幕视频 | 色偷偷88欧美精品久久久 | 亚洲片在线 | 久久99国产精品自在自在app | 日韩精品免费一区二区三区 | 天天天干天天天操 | 欧美一二区视频 | 国产精品入口麻豆www | 日韩av男人的天堂 | 国产高清无线码2021 | 国产一区二区精品久久 | 国产午夜不卡 | 国产精品久久伊人 | 日韩大片在线免费观看 | 美女视频国产 | 久草在线视频首页 | 91久草视频 | 97成人在线 | 在线观看av中文字幕 | 日韩欧美aaa | 成人在线免费小视频 | 天天射天天干天天爽 | 国产精久久久久久久 | 成人国产精品久久久久久亚洲 | 中文字幕二区 | 国产盗摄精品一区二区 | 成人网在线免费视频 | 精品免费视频123区 午夜久久成人 | 午夜精品电影 | 国产色在线视频 | 中文字幕色在线视频 | 99性视频 | 超级碰碰免费视频 | 国产精品久久久777 成人手机在线视频 | 国产黄色成人av | 欧美日本不卡高清 | 97精品国产91久久久久久久 | 中文字幕 国产视频 | 在线www色 | 国产91在线观看 | 精品人人爽 | 欧美成人影音 | 国产美女精品视频免费观看 | 精品一二三四五区 | 欧美日韩国产一区二 | 91大神免费在线观看 | 九月婷婷色 | 亚洲综合在线五月 | 超碰97在线资源站 | 97精品国产97久久久久久 | 亚洲精品欧洲精品 | 91传媒视频在线观看 | 色噜噜狠狠狠狠色综合 | 91精品一区二区三区蜜桃 | 久久久久久久久久久久久久电影 | 国产精品久久久久久久久久东京 | 日韩欧美在线国产 | 丁香婷婷综合五月 | 亚洲一级性 | 色综合久久88色综合天天人守婷 | 亚洲综合小说电影qvod | 国产精品激情 | 国产一区成人 | 国产99久久99热这里精品5 | 国产高清视频在线免费观看 | 成人h电影在线观看 | 黄色片网站大全 | 在线观看国产一区 | 婷婷在线色 | 久久国产成人午夜av影院潦草 | 午夜精品一区二区三区在线视频 | 麻豆传媒在线免费看 | 中文字幕在线免费97 | 婷婷在线视频 | 男女啪啪视屏 | 日韩国产精品久久 | 免费精品在线视频 | 天天综合日日夜夜 | 午夜久久福利 | 精品国产片 | 高清国产午夜精品久久久久久 | 色资源在线| 丰满少妇对白在线偷拍 | 亚洲资源 | 在线观看91久久久久久 | 人人爽影院 | 国产成人精品在线播放 | 国产成人精品午夜在线播放 | 国产精品观看在线亚洲人成网 | 免费裸体视频网 | 日韩欧美精品在线视频 | 亚洲爱视频 | 成年人在线观看视频免费 | 亚洲理论在线观看 | 中文永久免费观看 | 久久成视频 | 欧美精品一区二区蜜臀亚洲 | 日韩一区二区免费播放 | 久久久免费看片 | 久久影视网 | 天天操 夜夜操 | 黄色中文字幕在线 | 国产精品成人自产拍在线观看 | 天天操福利视频 | 国产在线播放一区二区三区 | 日韩网站在线免费观看 | 日本最新中文字幕 | 日日夜夜狠狠 | 天天爱天天射天天干天天 | 日韩欧美在线一区 | 精品欧美一区二区精品久久 | 日韩在线观看第一页 | 欧美日韩中文在线视频 | 成人免费视频网 | 国产一级大片在线观看 | 精品女同一区二区三区在线观看 | 国产成本人视频在线观看 | 国产免费国产 | 色婷婷激情电影 | 中文在线字幕免费观看 | 国产又粗又猛又黄又爽的视频 | 国产精品伦一区二区三区视频 | 国产免费久久久久 | 久久香蕉国产精品麻豆粉嫩av | 日韩欧美高清在线观看 | 日本中文字幕一二区观 | 国产高清专区 | 夜夜澡人模人人添人人看 | 日韩视频一区二区三区在线播放免费观看 | 日本中文字幕视频 | 国产一区二区三区四区大秀 | 最近中文字幕视频完整版 | 丰满少妇在线观看网站 | 在线国产一区二区 | 伊人六月 | 中文字幕在线一区二区三区 | 久草在线资源观看 | 黄色免费观看网址 | 精品久久美女 | 美女免费av| 97成人在线| 精品国产一区二区三区久久久 | 亚洲国产精品推荐 | 婷婷干五月 | 深爱五月激情网 | 免费情缘 | 国产精品18久久久久久首页狼 | 国产资源在线免费观看 | 在线精品视频在线观看高清 | 久久精品1区 | 天堂av免费 | 日韩专区一区二区 | 九九久久久久久久久激情 | 亚洲涩涩涩 | 99免在线观看免费视频高清 | 天堂av影院 | 人人躁 | av再线观看 | 日韩精品视频一二三 | av在线电影播放 | 91最新国产 | 亚洲人人网 | 黄色亚洲精品 | 精品国模一区二区 | 中文字幕第一 | 中文字幕一区二区三区在线观看 | 亚洲国产色一区 | www.狠狠操 | 少妇按摩av | 天天干天天射天天爽 | 五月婷婷亚洲 | 涩涩网站在线看 | 日韩.com | 国产色啪 | 欧美日韩一区二区三区视频 | 久久久久免费观看 | 香蕉手机在线 | 欧美性极品xxxx做受 | 91精品久久久久久粉嫩 | 五月婷在线 | 最近免费中文视频 | 成人av资源网 | 亚洲精品看片 | 久久99热这里只有精品国产 | 久久国产精品成人免费浪潮 | 夜夜干夜夜 | 99久久毛片| 亚洲91在线 | 中文字幕区 | 狠狠色丁香婷婷综合最新地址 | 免费成人短视频 | 亚洲闷骚少妇在线观看网站 | 中文字幕婷婷 | 欧美激情综合色综合啪啪五月 | 美女黄频在线观看 | 青春草免费视频 | 成人福利在线 | 国产精品永久在线观看 | 精品久久久久久亚洲综合网站 | 久久久精品免费看 | 99精品在线观看视频 | 国产精品久久久久永久免费看 | 国产精品久久久久影视 | www.少妇| 2021国产视频 | 97视频免费观看 | 日韩最新av在线 | bbbbb女女女女女bbbbb国产 | 日日夜夜艹 | 亚洲最新av网站 | 国产亚洲精品福利 | 国产123av| 91在线在线观看 | 国产亚洲激情视频在线 | 久久精品久久99精品久久 | 蜜臀av在线一区二区三区 | 91香蕉视频好色先生 | 日本精品视频在线播放 | 国产精品麻 | 国产精品免费麻豆入口 | 黄毛片在线观看 | 亚洲国产日韩欧美在线 | 日本黄色黄网站 | 国产一区二区三区高清播放 | 亚洲做受高潮欧美裸体 | 日韩精品视频免费专区在线播放 | 亚洲精品电影在线 | 日本久久久久久 | 91视视频在线直接观看在线看网页在线看 | 欧美福利网站 | 亚洲欧洲一区二区在线观看 | 美女福利视频网 | 国产精品视频 | 91av在线视频播放 | 国产成人精品久久久 | 中文字幕一区2区3区 | 日韩在线观看网站 | 夜夜躁天天躁很躁波 | 欧美日韩国产精品爽爽 | 成人毛片在线观看 | 亚洲人视频在线 | 国产粉嫩在线 | 国产精品成人自产拍在线观看 | 国内精品久久久久 | 国模精品在线 | 国产一区私人高清影院 | 亚洲精品色 | 日韩欧美xx | 国产精品久久久久久久99 | 国内精品久久久久久久久久清纯 | 中文字幕免费一区二区 | 色婷婷av在线 | 碰碰影院| 国产色视频一区 | 国内视频一区二区 | 视频 天天草 | 中文字幕一区二区三区四区在线视频 | 97在线看| 亚洲精品一区二区久 | 成人午夜黄色影院 | 久久综合免费 | 日本aaaa级毛片在线看 | 国产精品久久久视频 | 国产在线精品区 | 精品欧美一区二区精品久久 | 国产96在线 | 激情久久小说 | 天天操月月操 | 九九有精品 | 亚洲国产成人精品在线观看 | 久草在线视频网 | 日韩精品免费一区二区在线观看 | 中文字幕在线成人 | 天天添夜夜操 | 久久视频免费在线 | 国产精品视屏 | 午夜精品久久久久久久99热影院 | 久草在线视频网 | 天天爽人人爽夜夜爽 | 91久久偷偷做嫩草影院 | 国产色视频网站 | 午夜美女视频 | 精品国产一区二区三区免费 | 毛片播放网站 | 精品在线观看一区二区 | 24小时日本在线www免费的 | 免费看的黄色录像 | 91豆花在线观看 | 日韩精品一区二区三区视频播放 | 婷婷射五月 | 国产午夜精品一区二区三区四区 | 人人藻人人澡人人爽 | 久久久午夜剧场 | 中文字幕在线看视频国产中文版 | 人人插人人费 | 国产a网站 | 视频在线观看91 | 欧美淫视频 | av在线之家电影网站 | 91看片网址 | 久久综合狠狠综合久久综合88 | 婷婷六月网| 玖玖在线视频观看 | 国产精品大片免费观看 | 亚洲精品乱码久久久久 | 很黄很黄的网站免费的 | 免费www视频| 国产精彩视频一区 | 天天摸天天舔天天操 | 黄色片软件网站 | 色婷婷播放 | 夜夜操狠狠干 | 日韩国产欧美视频 | 国产高清视频在线播放一区 | 婷婷激情小说网 | 天堂中文在线视频 | 亚洲黄色免费 | www.色午夜.com | 亚洲国产精品va在线 | www.夜夜操| 久草网视频在线观看 | 玖玖在线观看视频 | 免费高清在线视频一区· | 狠狠色丁香婷婷 | 日韩中文字幕免费视频 | av动态图片 | 色婷婷亚洲精品 | 国产高清视频免费在线观看 | 精品一二三区视频 | av免费片 | 九九热免费视频在线观看 | 久久草在线视频国产 | 天堂在线v | 国产精品久久久久一区二区三区 | 中文字幕在线观看一区 | 日本视频精品 | 久久亚洲影视 | 成人在线黄色 | 婷婷丁香久久五月婷婷 | 久久蜜臀一区二区三区av | 1000部国产精品成人观看 | 国产又粗又硬又爽视频 | 97精品国自产拍在线观看 | 在线精品视频在线观看高清 | www.天天色.com | 久久久免费播放 | 久久久久久久久久久高潮一区二区 | 人人爱爱人人 | 深爱激情综合 | www99久久 | 国产日韩精品一区二区三区在线 | 国产麻豆精品久久 | 国产一区二区三区在线免费观看 | 久久久国产精品一区二区三区 | 亚洲人在线7777777精品 | 日韩精品一区电影 | 亚洲精品美女久久久久网站 | 日日夜夜操操 | 免费h漫在线观看 | 日韩网站在线 | 亚洲精品久久在线 | 在线观看视频h | 成人av资源站 | 国产精品18久久久久久久 | 一区二区高清在线 | 国产一区二区在线免费播放 | 亚洲精品美女久久久 | 在线看日韩av | 亚洲黄色小说网址 | 日韩在线观看你懂得 | 91成人在线观看喷潮 | 精品国产1区2区 | 一区二区三区在线视频111 | 久久夜色电影 | 视频在线观看一区 | 久久久久免费电影 | 欧美日韩午夜爽爽 | 狠狠狠狠狠操 | 亚洲国产日韩一区 | 久久一区二 | 91丨九色丨国产在线 | 在线v片| 婷婷久月 | 丁香婷婷色月天 | 日本免费久久高清视频 | 欧美日韩在线观看一区二区三区 | 91亚洲狠狠婷婷综合久久久 | 91伊人影院| 又污又黄网站 | 午夜在线观看 | 日韩精品中文字幕在线不卡尤物 | 久久久久久久久免费 | 日韩久久一区二区 | 国产精品久久久久久久7电影 | 探花国产在线 | 国产精品一区二区三区在线免费观看 | 国产精品第十页 | 国产一区二区在线看 | 国产精品毛片一区二区三区 | 99热精品久久 | 狠狠精品| 精品美女久久 | 久久精品爱视频 | 亚洲精品中文字幕视频 | 中国一级片在线播放 | 久久综合狠狠综合久久狠狠色综合 | 国产精品麻豆三级一区视频 | 激情综合网在线观看 | 亚洲人在线| 久久婷婷精品 | 在线观看中文字幕第一页 | 国产综合福利在线 | 婷婷五月色综合 | 欧美日韩一区二区在线观看 | 日韩精品视频在线观看免费 | 麻豆成人小视频 | 丁香亚洲 | 蜜臀av.com| 射射射av| 成人av免费在线观看 | 亚洲精品美女久久17c | 色91av | 天天干天天操 | 国产短视频在线播放 | 丁香六月国产 | www久久国产 | 在线观看中文字幕第一页 | 亚洲激情一区二区三区 | 久久艹综合 | 五月综合婷| 婷婷看片| 久久97超碰 | 中国一级片在线播放 | 久久的色 | 一级黄色片毛片 | 色瓜| www日韩在线 | 亚洲欧美婷婷六月色综合 | 91亚洲国产成人久久精品网站 | 亚洲精品美女在线 | 亚洲国产wwwccc36天堂 | 在线视频精品播放 | 狠狠色香婷婷久久亚洲精品 | 欧美日韩亚洲精品在线 | 在线观看免费成人av | 久久久久综合 | 中文字幕二区三区 | 处女av在线 | 亚洲天堂视频在线 | 在线视频a | 人人模人人爽 | 国产99久久久国产精品成人免费 | 最新av免费在线 | 狠狠狠色丁香婷婷综合激情 | 国产中文欧美日韩在线 | 国产高清不卡 | 免费日韩在线 | 欧美孕妇视频 | 中文字幕在线观看91 | 最新中文字幕视频 | 国产一区电影在线观看 | 五月激情婷婷丁香 | 国产成人在线综合 | 夜色.com | 久久视频这里只有精品 | 中文在线最新版天堂 | 国产精品porn | 久草成人在线 | 91免费观看网站 | 中文字幕色综合网 | 91成人在线观看喷潮 | 在线影院av| 日韩免费一级a毛片在线播放一级 | 午夜av电影院 | 97久久精品午夜一区二区 | 中文在线免费看视频 | 91视频在线免费看 | 久久久福利视频 | 综合天堂av久久久久久久 | av成人免费在线 | 99人成在线观看视频 | 高清av中文在线字幕观看1 | 久久久久久久久久网 | 99精品国产兔费观看久久99 | 97超视频免费观看 | 成人在线视频在线观看 | 色婷婷激情四射 | 国产香蕉视频 | 中文理论片 | 日韩久久精品一区二区 | 99精品视频在线免费观看 | 人人看人人做人人澡 | av免费在线观 | 久久av不卡 | 粉嫩aⅴ一区二区三区 | 亚洲成色777777在线观看影院 | 在线免费观看欧美日韩 | 国产成人精品一区二区三区福利 | 国产精品一区二 | 在线www色 | 欧美另类交在线观看 | 免费观看mv大片高清 | 久草精品资源 | 在线免费观看成人 | 国产永久网站 | 国内视频1区 | 波多野结衣电影一区二区三区 | 91精品国产92久久久久 | 色小说av | 中文字幕久久久精品 | japanese黑人亚洲人4k | 涩涩网站免费 | 免费黄a | 亚洲va韩国va欧美va精四季 | 欧美va电影 | 亚洲天堂精品视频在线观看 | 国产精品18毛片一区二区 | 人人狠狠综合久久亚洲婷 | 欧美精品一级视频 | 亚洲精品www. | 一区二区视频在线观看免费 | 中文字幕乱码电影 | 天天色天天综合 | 麻豆视频免费看 | 成人国产电影在线观看 | avv天堂| 色综合久久天天 | 综合久久精品 | 99精品视频免费观看 | 国内丰满少妇猛烈精品播放 | 成人免费视频网址 | 五月天九九 | 99国产在线 | 欧美成人中文字幕 | 美女免费黄网站 | av资源在线观看 | 中文字幕亚洲精品在线观看 | 日韩美在线 | 色播激情五月 | av最新资源 | 国产精品美女视频网站 | 成人免费视频在线观看 | 免费一级日韩欧美性大片 | 久久综合九色综合97_ 久久久 | 午夜精品一区二区三区在线播放 | 国产精品手机视频 | 丁香五月亚洲综合在线 | 激情小说久久 | 国产拍在线| 精品国产aⅴ一区二区三区 在线直播av | 成人h动漫精品一区二 | 正在播放国产精品 | 久久综合一本 | 国产高清 不卡 | 最近能播放的中文字幕 | 狠狠色狠狠综合久久 | www.久久爱.cn | 成人久久 | www天天干com | 欧美激情视频免费看 | 午夜精品久久久久久99热明星 | 国产二区视频在线观看 | 一区二区三区手机在线观看 | 免费黄色看片 | 最新国产在线 | 亚洲国产播放 | 国产一级特黄毛片在线毛片 | 91桃花视频 | 狠狠干 狠狠操 | 亚洲黄色大片 | 女女av在线| 日本精品在线 | 欧美日韩国产一区二区三区在线观看 | 亚洲综合视频在线 | av一二三区| 麻豆小视频在线观看 | 国产 日韩 中文字幕 | 亚洲欧美日韩国产精品一区午夜 | 久久天天躁夜夜躁狠狠85麻豆 | 亚洲手机天堂 | 91在线永久 | 深爱婷婷 | 日韩高清在线不卡 | 蜜臀久久99静品久久久久久 | 夜夜嗨av色一区二区不卡 | 精品国产成人在线 | 蜜臀av性久久久久av蜜臀妖精 | 91丨九色丨91啦蝌蚪老版 | 九九精品视频在线 | 国产精品成人av在线 | 精品一区二区av | 国产精品色 | 欧美日韩亚洲在线 | 日韩电影久久久 | 婷婷六月综合网 | 欧美一级片在线免费观看 | 狠狠色香婷婷久久亚洲精品 | 婷婷色网视频在线播放 | 国产原创在线 | 久久精品免费看 | 日韩午夜电影网 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 综合久久精品 | 久草在线免费资源站 | 精品uu | 操操日日 | 最新中文字幕视频 | 国产精品成人久久久 | 国产在线看| 久草精品免费 | 99在线观看精品 | 超碰在线97国产 | 久久精品欧美一区 | 欧美嫩草影院 | 色吧av色av| 亚洲精品tv | 综合久久久久 | 不卡的av在线播放 | 日韩高清av在线 | 成人av电影在线播放 | 欧美一区二区日韩一区二区 | 婷五月激情 | 久久丁香 | 亚洲欧美视频一区二区三区 | 国产不卡av在线 | 欧美在线视频一区二区三区 | 超碰在线91| 欧美一级性生活视频 | 中国一级片在线观看 | 日韩午夜av | 免费观看午夜视频 | 久视频在线 | 91中文字幕视频 | 黄色视屏免费在线观看 | 日韩理论在线 | 夜夜视频 | 久久99久久99精品免视看婷婷 | 国产又粗又猛又黄视频 | 奇米影视8888在线观看大全免费 | 成人影片免费 | 亚洲最大av网站 | 精品国产一二区 | 亚洲精品美女在线 | 国产免费人成xvideos视频 | 亚洲国产精品久久久久久 | 久草在线最新 | 国产伦精品一区二区三区四区视频 | 菠萝菠萝在线精品视频 | av黄色成人 | 韩国视频一区二区三区 | 国产色久 | 丝袜美腿av | 日韩精品首页 | 国内精品美女在线观看 | 97**国产露脸精品国产 | 色婷久久| 成人免费观看网址 | 久久综合久色欧美综合狠狠 | 久久这里只有精品1 | 五月天六月婷 | 免费观看黄色av | 91观看视频 | 九九免费视频 | 国产精品嫩草影视久久久 | 91视频久久久久久 | 91麻豆精品国产91久久久无需广告 | 久久精品国产一区二区三 | 91成人破解版 | 国产精品免费观看久久 | 久久精品久久精品 | 久久亚洲综合色 | 丁香5月婷婷| 特级黄色电影 | 在线视频 影院 | 日韩在线观看视频中文字幕 | 五月婷婷综合在线视频 | 日韩精品国产一区 | 亚洲在线成人精品 | 日本黄色免费网站 | 国产成人精品久久久久蜜臀 | 一级片免费观看 | 韩日电影在线观看 | 日韩欧美xxxx | 天天插天天干天天操 | 久要激情网 | 久久精品国产一区二区三 | 五月亚洲 | 日本中文字幕电影在线免费观看 | 日韩精品第1页 | 91av在线视频免费观看 | 亚洲一级性 | 亚洲国产成人av网 | 午夜精品一二三区 | 亚洲精品在线二区 | 成人h视频 | 国产精品一区二区免费视频 | 五月婷婷六月丁香激情 | 午夜色性片 | 欧美少妇bbwhd | 国内精品久久天天躁人人爽 | 蜜臀91丨九色丨蝌蚪老版 | 国产精品一区二区三区久久 | 国产视频欧美视频 | 欧美极品xxx| 久草在线视频资源 | 韩国精品在线观看 | 麻豆91在线看 | 夜夜夜影院 | 中文字幕精品一区久久久久 | 亚洲综合成人av | 五月天婷婷在线观看视频 | 国产精彩视频一区二区 | 97在线公开视频 | 国内精品久久久久国产 | 全久久久久久久久久久电影 | 久久久久国产精品免费网站 | 在线免费观看视频一区 | 九九有精品 | 国产精品美女视频网站 | 91传媒免费观看 | 亚洲小视频在线观看 | 91九色蝌蚪视频在线 | 91精品国产自产老师啪 | 黄色毛片视频免费观看中文 | 国产精品亚洲精品 | 中文字幕第一页在线vr | 午夜手机电影 | 91人人在线 | 亚洲成a人片在线www | 五月综合在线观看 | 国产资源av| 综合伊人av| 一本大道久久精品懂色aⅴ 五月婷社区 | 国产亚洲资源 | 中文字幕中文字幕在线一区 | 91精品在线观看视频 | 在线 视频 一区二区 | 亚洲综合射 | 福利一区在线视频 | 四虎在线免费观看视频 | 亚洲理论片在线观看 | 色a综合| 中文字幕高清av | 99视频精品全部免费 在线 | 国产美女在线精品免费观看 | 中文国产在线观看 | 999成人网| 92精品国产成人观看免费 | 97视频免费看 | 国产女教师精品久久av | 2023av| 久久国产影视 | 五月婷婷色播 | 亚洲黄色片在线 | 综合色播 | 亚洲最新视频在线播放 | 日本免费久久高清视频 | 欧美a级免费视频 | 欧洲不卡av | 97香蕉视频| 久久91久久久久麻豆精品 | 欧美日韩精品久久久 | 香蕉视频国产在线 | a在线视频v视频 | 久久精品女人毛片国产 | 美女在线国产 | 日韩午夜大片 | 日韩在线观看视频中文字幕 | 亚洲在线免费视频 | 人人dvd | 999电影免费在线观看 | av片中文 | 欧美精品在线观看 | 国产精品永久免费 | 国产精品12| 亚洲一区在线看 | 日韩中文字幕国产 | 中文字幕亚洲精品日韩 | 久久激情电影 | 亚洲区二区 | 国精产品一二三线999 | 亚洲成人av在线 | 精品国产乱码久久久久久天美 | 亚洲国产精品一区二区尤物区 | 欧美a√在线 | 国产精品色婷婷视频 | 日本中文字幕在线看 | 久久久私人影院 | 婷婷久久五月天 | 在线国产一区二区三区 | 久久久天堂 | 国产在线第三页 | 精品在线视频一区二区三区 | 女人高潮一级片 | 日韩啪啪小视频 | 激情婷婷亚洲 | 五月激情久久 | av在线h|