博主信息
博文 35
粉丝 0
评论 0
访问量 46883
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
jsp页面 列表 展示 ajax异步实现方法
P粉526161432
原创
829人浏览过
  1. 下面小编就为大家带来一篇jsp页面 列表 展示 ajax异步实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  4. <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
  5. <%
  6. String path = request.getContextPath();
  7. String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
  8. + path + "/";
  9. %>
  10. <!DOCTYPE html>
  11. <!--[if lt IE 7]> <html class="ie ie6 lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
  12. <!--[if IE 7]> <html class="ie ie7 lt-ie9 lt-ie8" lang="en"> <![endif]-->
  13. <!--[if IE 8]> <html class="ie ie8 lt-ie9" lang="en"> <![endif]-->
  14. <!--[if IE 9]> <html class="ie ie9" lang="en"> <![endif]-->
  15. <!--[if !IE]><!-->
  16. <html lang="en" class="no-ie">
  17. <!--<![endif]-->
  18. <head>
  19. <!-- Meta-->
  20. <meta charset="utf-8">
  21. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
  22. <meta name="description" content="">
  23. <meta name="keywords" content="">
  24. <meta name="author" content="">
  25. <title>消息中心</title>
  26. <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
  27. <!--[if lt IE 9]><script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script><script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script><![endif]-->
  28. <!-- Bootstrap CSS-->
  29. <link rel="stylesheet" href="<%=path %>/app/css/bootstrap.css">
  30. <!-- Vendor CSS-->
  31. <link rel="stylesheet" href="<%=path %>/vendor/fontawesome/css/font-awesome.min.css">
  32. <link rel="stylesheet" href="<%=path %>/vendor/animo/animate+animo.css">
  33. <!-- START Page Custom CSS-->
  34. <!-- Data Table styles-->
  35. <link rel="stylesheet" href="<%=path %>/vendor/datatable/extensions/datatable-bootstrap/css/dataTables.bootstrap.css">
  36. <link rel="stylesheet" href="<%=path %>/vendor/datatable/extensions/ColVis/css/dataTables.colVis.css">
  37. <!-- END Page Custom CSS-->
  38. <!-- App CSS-->
  39. <link rel="stylesheet" href="<%=path %>/app/css/app.css">
  40. <link rel="stylesheet" href="<%=path %>/app/css/beadmin-theme-c2.css">
  41. <link rel="stylesheet" href="<%=path %>/vendor/sweetalert/lib/sweet-alert.css" />
  42. <link rel="stylesheet" href="<%=path %>/css/page.css"/>
  43. <!-- Modernizr JS Script-->
  44. <script src="<%=path %>/vendor/modernizr/modernizr.js" type="application/javascript"></script>
  45. <!-- FastClick for mobiles-->
  46. <script src="<%=path %>/vendor/fastclick/fastclick.js" type="application/javascript"></script>.
  47. <script>
  48. var basePath = '<%=basePath %>';
  49. var pageNo = ${page.pageNo};
  50. var totalCount = ${page.totalCount};
  51. var totalPage = ${page>totalPage};
  52. var pageSize = ${page.pageSize};
  53. </script>
  54. </head>
  55. <body>
  56. <!-- START Main wrapper-->
  57. <div class="wrapper" >
  58. <!-- START Main section-->
  59. <section>
  60. <!-- START Page content-->
  61. <div class="content-wrapper" style="margin-left:-250px;margin-top:-40px;">
  62. <h3>消息中心
  63. <!-- <div style="float:right; margin-top:5px;" class="form-group">
  64. <button type="button" onclick="$('#myModal').modal({backdrop: 'static', keyboard: false});;" class="btn btn-labeled btn-success"> <span class="btn-label"><i class="fa fa-plus"></i> </span>添加</button>
  65. </div>-->
  66. <small>消息管理</small>
  67. </h3>
  68. <!-- START panel-->
  69. <!-- START DATATABLE 3-->
  70. <div class="row">
  71. <div class="col-lg-12">
  72. <div class="panel panel-default">
  73. <div class="panel-heading" style="border-bottom:1px solid #eee;">
  74. <form class="form-inline" id="searchForm" method="post" action="<%=path %>/page/messageSearch.action">
  75. <div class="form-group"> <b>创建时间: &nbsp;</b>
  76. <div class="datetimepicker input-group date mb-lg" data-pick-time="false">
  77. <input type="text" class="form-control" id="searchDateStart" name="searchDateStart" value='' disabled="disabled">
  78. <span class="input-group-addon"> <span class="fa-calendar fa"></span> </span> </div>
  79. <span style="margin-top:-8px;">—</span>
  80. <div class="datetimepicker input-group date mb-lg" data-pick-time="false">
  81. <input type="text" class="form-control" id="searchDateEnd" name="searchDateEnd" value='' disabled="disabled">
  82. <span class="input-group-addon"> <span class="fa-calendar fa"></span> </span> </div>
  83. </div>
  84. <div class="form-group">
  85. <b>接收者:&nbsp;</b>
  86. <input type="text" class="form-control mb-lg" id="receiver" name="receiver" value=''>
  87. </div>
  88. <div class="form-group"> <a style="margin:-10px 0 0 5px; float:left;" href="javascript:void(0);" class="mb-sm btn btn-primary" type="button" id="searchMessage">搜索</a> </div>
  89. <input type="hidden" id="pageNo" name="pageNo" value=''>
  90. </form>
  91. </div>
  92. <div class="table-responsive">
  93. <table class="table table-bordered table-hover dataTable no-footer" id="table-ext-1" >
  94. <thead>
  95. <tr>
  96. <th style="width:300px;">描述</th>
  97. <th class="sorting center" tabindex="0" aria-controls="datatable1" rowspan="1" colspan="1" style="width: 86px;" aria-label="Rendering engine: activate to sort column ascending">发送者</th>
  98. <th class="sorting center" tabindex="0" aria-controls="datatable1" rowspan="1" colspan="1" style="width: 86px;" aria-label="Rendering engine: activate to sort column ascending">接收者</th>
  99. <th class="sorting center" tabindex="0" aria-controls="datatable1" rowspan="1" colspan="1" style="width: 86px;" aria-label="Rendering engine: activate to sort column ascending">创建时间</th>
  100. <th class="th150 center">操作</th>
  101. </tr>
  102. </thead>
  103. <tbody id="message_body">
  104. </tbody>
  105. <tfoot>
  106. <tr> </tr>
  107. </tfoot>
  108. </table>
  109. </div>
  110. <div class="panel-footer">
  111. <div class="row">
  112. <div style="line-height:35px;" class="col-lg-3">
  113. <div class="input-group pull-left" id="message_showLines"> </div>
  114. </div>
  115. <div class="col-lg-9"></div>
  116. <div class="tcdPageCode"></div>
  117. </div>
  118. </div>
  119. </div>
  120. </div>
  121. </div>
  122. <!-- END DATATABLE 3-->
  123. </div>
  124. <!-- END Page content-->
  125. </section>
  126. <!-- END Main section-->
  127. </div>
  128. <!-- END Main wrapper-->
  129. <!-- START modal-->
  130. <div id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" class="modal" >
  131. <div class="modal-dialog" style="width:600px;">
  132. <div class="modal-content">
  133. <div class="modal-header">
  134. <button type="button" data-dismiss="modal" aria-hidden="true" class="close">×</button>
  135. <h4 id="myModalLabel" class="modal-title">新建应用</h4>
  136. </div>
  137. <div class="modal-body" style="padding-right:20px;">
  138. <form method="get" action="/" class="form-horizontal">
  139. <fieldset>
  140. <div class="form-group" style="padding-bottom:5px;">
  141. <label class="col-sm-2 control-label">名称</label>
  142. <div class="col-sm-10">
  143. <input type="text" class="form-control">
  144. </div>
  145. </div>
  146. <div class="form-group" style="margin-top:10px;">
  147. <label class="col-sm-2 control-label">描述</label>
  148. <div class="col-sm-10">
  149. <input type="text" class="form-control">
  150. </div>
  151. </div>
  152. <div class="form-group" style="margin-top:10px;">
  153. <label class="col-sm-2 control-label">URL</label>
  154. <div class="col-sm-10">
  155. <input type="text" class="form-control">
  156. </div>
  157. </div>
  158. <div class="form-group" style="margin-top:5px;">
  159. <label class="col-sm-2 control-label">类别</label>
  160. <div class="col-sm-10">
  161. <select class="form-control m-b" name="account">
  162. <option>Web</option>
  163. <option>Mobile</option>
  164. </select></div>
  165. </div>
  166. <div class="form-group" style="margin-top:5px;">
  167. <label class="col-sm-2 control-label">授权模式</label>
  168. <div class="col-sm-10">
  169. <select class="form-control m-b" name="account">
  170. <option>授权</option>
  171. <option>不授权</option>
  172. </select></div>
  173. </div>
  174. <div class="form-group" style="margin-top:10px;">
  175. <label class="col-sm-2 control-label">LOGO</label>
  176. <div class="col-sm-10">
  177. <input type="button" class="form-control">
  178. </div>
  179. </div>
  180. </fieldset>
  181. </form>
  182. </div>
  183. </fieldset>
  184. <div class="modal-footer">
  185. <button type="button" data-dismiss="modal" class="btn btn-default">取消</button>
  186. <button type="button" class="btn btn-primary">确定</button>
  187. </div>
  188. </div>
  189. </div>
  190. </div>
  191. </div>
  192. <div id="myModal2" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" class="modal">
  193. <div class="modal-dialog" style="width:650px;">
  194. <div class="modal-content">
  195. <div class="modal-header">
  196. <button type="button" data-dismiss="modal" aria-hidden="true" class="close">×</button>
  197. <h4 id="myModalLabel" class="modal-title">修改密码</h4>
  198. </div>
  199. <div class="modal-body">
  200. <form method="get" action="/" class="form-horizontal">
  201. <fieldset>
  202. <div class="form-group" style="padding-bottom:5px;">
  203. <label class="col-sm-2 control-label">原密码</label>
  204. <div class="col-sm-10">
  205. <input type="text" class="form-control">
  206. </div>
  207. </div>
  208. <div class="form-group" style="padding-bottom:5px;">
  209. <label class="col-sm-2 control-label">新密码</label>
  210. <div class="col-sm-10">
  211. <input type="password" name="password" class="form-control">
  212. </div>
  213. </div>
  214. <div class="form-group" style="padding-bottom:5px;">
  215. <label class="col-sm-2 control-label">确认密码</label>
  216. <div class="col-sm-10">
  217. <input type="password" name="password" class="form-control">
  218. </div>
  219. </div>
  220. </fieldset>
  221. </form>
  222. </div>
  223. <div class="modal-footer">
  224. <button type="button" data-dismiss="modal" class="btn btn-default">关闭</button>
  225. <button type="button" class="btn btn-primary">Save changes</button>
  226. </div>
  227. </div>
  228. </div>
  229. </div>
  230. <div id="myModal3" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" class="modal">
  231. <div class="modal-dialog" style="width:600px;">
  232. <div class="modal-content">
  233. <div class="modal-header">
  234. <button type="button" data-dismiss="modal" aria-hidden="true" class="close">×</button>
  235. <h4 id="myModalLabel" class="modal-title">编辑节目特殊单</h4>
  236. </div>
  237. <div class="modal-body">
  238. <form method="get" action="/" class="form-horizontal">
  239. <fieldset>
  240. <div class="form-group" style="padding-bottom:5px;">
  241. <label class="col-sm-2 control-label">表单标题</label>
  242. <div class="col-sm-10">
  243. <input type="text" class="form-control">
  244. </div>
  245. </div>
  246. </fieldset>
  247. </form>
  248. </div>
  249. <div class="modal-footer">
  250. <button type="button" data-dismiss="modal" class="btn btn-default">关闭</button>
  251. <button type="button" class="btn btn-primary">确定</button>
  252. </div>
  253. </div>
  254. </div>
  255. </div>
  256. <!-- END modal -->
  257. <form method="post" id="pageForm" name="pageForm"
  258. action="<%=path%>/page/message_search.action">
  259. <input type="hidden" id="pageNo" name="pageNo" value="" />
  260. </form>
  261. <!-- START Scripts-->
  262. <!-- Main vendor Scripts-->
  263. <script src="<%=path %>/vendor/jquery/jquery.min.js"></script>
  264. <script src="<%=path %>/vendor/bootstrap/js/bootstrap.min.js"></script>
  265. <!-- Plugins-->
  266. <script src="<%=path %>/vendor/chosen/chosen.jquery.min.js"></script>
  267. <script src="<%=path %>/vendor/slider/js/bootstrap-slider.js"></script>
  268. <script src="<%=path %>/vendor/filestyle/bootstrap-filestyle.min.js"></script>
  269. <!-- Animo-->
  270. <script src="<%=path %>/vendor/animo/animo.min.js"></script>
  271. <!-- Sparklines-->
  272. <script src="<%=path %>/vendor/sparklines/jquery.sparkline.min.js"></script>
  273. <!-- MomentJs and Datepicker-->
  274. <script src="<%=path %>/vendor/moment/min/moment-with-langs.js"></script>
  275. <script src="<%=path %>/vendor/datetimepicker/js/bootstrap-datetimepicker.min.js"></script>
  276. <!-- Slimscroll-->
  277. <script src="<%=path %>/vendor/slimscroll/jquery.slimscroll.min.js"></script>
  278. <!-- Store + JSON-->
  279. <script src="<%=path %>/vendor/store/store+json2.min.js"></script>
  280. <!-- ScreenFull-->
  281. <script src="<%=path %>/vendor/screenfull/screenfull.min.js"></script>
  282. <!-- START Page Custom Script-->
  283. <!-- Data Table Scripts-->
  284. <script src="<%=path %>/vendor/datatable/media/js/jquery.dataTables.min.js"></script>
  285. <script src="<%=path %>/vendor/datatable/extensions/datatable-bootstrap/js/dataTables.bootstrap.js"></script>
  286. <script src="<%=path %>/vendor/datatable/extensions/datatable-bootstrap/js/dataTables.bootstrapPagination.js"></script>
  287. <script src="<%=path %>/vendor/datatable/extensions/ColVis/js/dataTables.colVis.min.js"></script>
  288. <!-- START Page Custom Script-->
  289. <script src="<%=path %>/vendor/wizard/js/bwizard.min.js"></script>
  290. <!-- Form Validation-->
  291. <script src="<%=path %>/vendor/parsley/parsley.min.js"></script>
  292. <!-- END Page Custom Script-->
  293. <!-- App Main-->
  294. <script src="<%=path %>/app/js/app.js"></script>
  295. <script src="<%=path %>/vendor/sweetalert/lib/sweet-alert.min.js"></script>
  296. <script src="<%=path %>/script/message.js"></script>
  297. <script src="<%=path %>/page/js/page.js"></script>
  298. <!-- END Scripts-->
  299. </body>
  300. </html>
  1. 2. example.js加载的时候,再去异步请求获取页面数据(表格、分页等),再动态创建表,分页链接等
  1. $(function(){
  2. initTable();
  3. $("#searchMessage").on("click",function(){
  4. messageSearch(pageNo);
  5. });
  6. //获取message列表 "pageNo" : pageNo
  7. function initTable(){
  8. $.ajax({
  9. url : basePath + "page/message_list.action",
  10. type : "get",
  11. dataType : "json",
  12. success : function(dataMap){
  13. createTBody(dataMap);
  14. createTFoot(dataMap);
  15. },
  16. error : function(errorData){
  17. }
  18. });
  19. }
  20. //查询message
  21. function messageSearch(pageNo){
  22. var searchDateStart = $("#searchDateStart").val();
  23. var searchDateEnd = $("#searchDateEnd").val();
  24. var startDate = new Date(searchDateStart);
  25. var endDate = new Date(searchDateEnd);
  26. var num = endDate - startDate;
  27. if(num<0){
  28. $("#searchDateEnd").val('');
  29. swal({
  30. title: "结束日期不能晚于开始日期",
  31. text: "",
  32. type: "error"
  33. });
  34. return false;
  35. }
  36. var receiver = $("#receiver").val();
  37. $.ajax({
  38. url : basePath + "page/message_search.action",
  39. type : "POST",
  40. data : {
  41. "pageNo" : pageNo,
  42. "searchDateStart" : searchDateStart,
  43. "searchDateEnd" : searchDateEnd,
  44. "receiver" : receiver
  45. },
  46. dataType : "json",
  47. success : function(dataMap){
  48. createTBody(dataMap);
  49. createTFoot(dataMap);
  50. },
  51. error : function(errorData){
  52. }
  53. });
  54. }
  55. function createTBody(dataMap){
  56. if(dataMap!=null){
  57. var messageListPage = dataMap.messageListPage;
  58. var html = [];
  59. for(var i=0; i<messageListPage.length; i++){
  60. var message = messageListPage[i];
  61. var cTime = message.createtime.replace(/T/g," ");
  62. html.push('<tr class="gradeX center">');
  63. html.push('<td style="text-align:left;">'+message.content+'</td>');
  64. html.push('<td>' + message.provider + '</td>');
  65. html.push('<td>' + message.receiver + '</td>');
  66. html.push('<td>' + cTime + '</td>');
  67. html.push('<td message_id=' + message.id + '><a href="#" class="message_del btn btn-danger btn-xs">&nbsp;删除&nbsp;</a></td>');
  68. html.push('</tr>');
  69. }
  70. $("#message_body").empty().html(html.join(''));
  71. }
  72. }
  73. function createTFoot(dataMap){
  74. if(dataMap!=null){
  75. startNum = dataMap.startNum;
  76. stopNum = dataMap.stopNum;
  77. totalCount = dataMap.totalCount;
  78. pageNo = dataMap.pageNo;
  79. pageSize = dataMap.pageSize;
  80. var str = '显示 ' + startNum + '至' + stopNum + '项 , 共' + totalCount +' 项。';
  81. $("#message_showLines").html(str);
  82. }
  83. }
  84. $('#message_body').on('click','a.message_del',function(){
  85. var message_id = $(this).parent("td").attr("message_id");
  86. swal({
  87. title : "确认要删除吗?",
  88. text : "删除后将不能恢复!",
  89. type : "warning",
  90. showCancelButton : true,
  91. confirmButtonColor : "#DD6B55",
  92. confirmButtonText : "Yes, delete it!",
  93. cancelButtonText : "No, cancel plx!",
  94. closeOnConfirm : false,
  95. closeOnCancel : false
  96. }, function(isConfirm) {
  97. if (isConfirm) {
  98. $.ajax({
  99. url:basePath + "page/message_del.action",
  100. data:{
  101. "id":message_id
  102. },
  103. type:"get",
  104. dataType:"json",
  105. success:function(dataMap){
  106. if(dataMap!=null && dataMap.message=="success"){
  107. swal("删除!",
  108. "已经成功删除.",
  109. "success");
  110. initTable();
  111. }else{
  112. swal("删除!",
  113. "删除失败.",
  114. "error");
  115. }
  116. },
  117. error : function(errorMsg){
  118. swal("删除失败!",
  119. errorMsg,
  120. "error");
  121. }
  122. });
  123. } else {
  124. swal("Cancelled", "Your imaginary file is safe :)",
  125. "error");
  126. }
  127. });
  128. });
  129. $('.tcdPageCode').extendPagination({
  130. pageId : pageNo,
  131. totalCount : totalCount,
  132. showPage : 5,
  133. limit : pageSize,
  134. callback : function(pageNo, limit, totalCount) {
  135. messageSearch(pageNo);
  136. }
  137. });
  138. });
  1. 注意: 表格是动态创建的,其中的按钮绑定事件时,一定要先找到它的父节点(或祖先节点),再到指定节点,绑定事件
  2. 如上面的 $("#serviceRepo_body").on('click','a.record_view',function(){});
  1. 分页js插件(page.js), 同时引入jquery-1.11.1.min.js bootstrap.js
  1. /**
  2. * Created by Hope on 2014/12/28.
  3. */
  4. (function ($) {
  5. $.fn.extendPagination = function (options) {
  6. var defaults = {
  7. pageId:'',
  8. totalCount: '',
  9. showPage: '10',
  10. limit: '5',
  11. callback: function () {
  12. return false;
  13. }
  14. };
  15. $.extend(defaults, options || {});
  16. // alert(defaults.pageId);
  17. if (defaults.totalCount == '') {
  18. //alert('总数不能为空!');
  19. $(this).empty();
  20. return false;
  21. } else if (Number(defaults.totalCount) <= 0) {
  22. //alert('总数要大于0!');
  23. $(this).empty();
  24. return false;
  25. }
  26. if (defaults.showPage == '') {
  27. defaults.showPage = '10';
  28. } else if (Number(defaults.showPage) <= 0)defaults.showPage = '10';
  29. if (defaults.limit == '') {
  30. defaults.limit = '5';
  31. } else if (Number(defaults.limit) <= 0)defaults.limit = '5';
  32. var totalCount = Number(defaults.totalCount), showPage = Number(defaults.showPage),
  33. limit = Number(defaults.limit), totalPage = Math.ceil(totalCount / limit);
  34. if (totalPage > 0) {
  35. var html = [];
  36. html.push(' <ul class="pagination">');
  37. html.push(' <li class="previous"><a href="#">&laquo;</a></li>');
  38. html.push('<li class="disabled hidden"><a href="#">...</a></li>');
  39. if (totalPage <= showPage) {
  40. for (var i = 1; i <= totalPage; i++) {
  41. if (i == defaults.pageId) html.push(' <li class="active"><a href="#">' + i + '</a></li>');
  42. else html.push(' <li><a href="#">' + i + '</a></li>');
  43. }
  44. } else {
  45. for (var j = 1; j <= showPage; j++) {
  46. if (j == defaults.pageId) html.push(' <li class="active"><a href="#">' + j + '</a></li>');
  47. else html.push(' <li><a href="#">' + j + '</a></li>');
  48. }
  49. }
  50. html.push('<li class="disabled hidden"><a href="#">...</a></li>');
  51. html.push('<li class="next"><a href="#">&raquo;</a></li></ul>');
  52. $(this).html(html.join(''));
  53. if (totalPage > showPage) $(this).find('ul.pagination li.next').prev().removeClass('hidden');
  54. var pageObj = $(this).find('ul.pagination'), preObj = pageObj.find('li.previous'),
  55. currentObj = pageObj.find('li').not('.previous,.disabled,.next'),
  56. nextObj = pageObj.find('li.next');
  57. function loopPageElement(minPage, maxPage) {
  58. var tempObj = preObj.next();
  59. for (var i = minPage; i <= maxPage; i++) {
  60. if (minPage == 1 && (preObj.next().attr('class').indexOf('hidden')) < 0)
  61. preObj.next().addClass('hidden');
  62. else if (minPage > 1 && (preObj.next().attr('class').indexOf('hidden')) > 0)
  63. preObj.next().removeClass('hidden');
  64. if (maxPage == totalPage && (nextObj.prev().attr('class').indexOf('hidden')) < 0)
  65. nextObj.prev().addClass('hidden');
  66. else if (maxPage < totalPage && (nextObj.prev().attr('class').indexOf('hidden')) > 0)
  67. nextObj.prev().removeClass('hidden');
  68. var obj = tempObj.next().find('a');
  69. if (!isNaN(obj.html()))obj.html(i);
  70. tempObj = tempObj.next();
  71. }
  72. }
  73. function callBack(curr) {
  74. defaults.callback(curr, defaults.limit, totalCount);
  75. }
  76. currentObj.click(function (event) {
  77. event.preventDefault();
  78. var currPage = Number($(this).find('a').html()), activeObj = pageObj.find('li[class="active"]'),
  79. activePage = Number(activeObj.find('a').html());
  80. if (currPage == activePage) return false;
  81. if (totalPage > showPage) {
  82. var maxPage = currPage, minPage = 1;
  83. if (($(this).prev().attr('class'))
  84. && ($(this).prev().attr('class').indexOf('disabled')) >= 0) {
  85. minPage = currPage - 1;
  86. maxPage = minPage + showPage - 1;
  87. loopPageElement(minPage, maxPage);
  88. } else if (($(this).next().attr('class'))
  89. && ($(this).next().attr('class').indexOf('disabled')) >= 0) {
  90. if (totalPage - currPage >= 1) maxPage = currPage + 1;
  91. else maxPage = totalPage;
  92. if (maxPage - showPage > 0) minPage = (maxPage - showPage) + 1;
  93. loopPageElement(minPage, maxPage)
  94. }
  95. }
  96. activeObj.removeClass('active');
  97. $.each(currentObj, function (index, thiz) {
  98. if ($(thiz).find('a').html() == currPage) {
  99. $(thiz).addClass('active');
  100. callBack(currPage);
  101. }
  102. });
  103. });
  104. preObj.click(function (event) {
  105. event.preventDefault();
  106. var activeObj = pageObj.find('li[class="active"]'), activePage = Number(activeObj.find('a').html());
  107. if (activePage <= 1) return false;
  108. if (totalPage > showPage) {
  109. var maxPage = activePage, minPage = 1;
  110. if ((activeObj.prev().prev().attr('class'))
  111. && (activeObj.prev().prev().attr('class').indexOf('disabled')) >= 0) {
  112. minPage = activePage - 1;
  113. if (minPage > 1) minPage = minPage - 1;
  114. maxPage = minPage + showPage - 1;
  115. loopPageElement(minPage, maxPage);
  116. }
  117. }
  118. $.each(currentObj, function (index, thiz) {
  119. if ($(thiz).find('a').html() == (activePage - 1)) {
  120. activeObj.removeClass('active');
  121. $(thiz).addClass('active');
  122. callBack(activePage - 1);
  123. }
  124. });
  125. });
  126. nextObj.click(function (event) {
  127. event.preventDefault();
  128. var activeObj = pageObj.find('li[class="active"]'), activePage = Number(activeObj.find('a').html());
  129. if (activePage >= totalPage) return false;
  130. if (totalPage > showPage) {
  131. var maxPage = activePage, minPage = 1;
  132. // if ((activeObj.next().next().attr('class'))
  133. // && (activeObj.next().next().attr('class').indexOf('disabled')) >= 0) {
  134. // maxPage = activePage + 2;
  135. // if (maxPage > totalPage) maxPage = totalPage;
  136. // minPage = maxPage - showPage + 1;
  137. // loopPageElement(minPage, maxPage);
  138. // }
  139. if ((activeObj.next().next().attr('class'))
  140. && (activeObj.next().next().attr('class').indexOf('disabled')) >= 0) {
  141. maxPage = activePage + 2;
  142. if (maxPage > totalPage) maxPage = totalPage;
  143. minPage = maxPage - showPage + 1;
  144. loopPageElement(minPage, maxPage);
  145. }
  146. }
  147. $.each(currentObj, function (index, thiz) {
  148. if ($(thiz).find('a').html() == (activePage + 1)) {
  149. activeObj.removeClass('active');
  150. $(thiz).addClass('active');
  151. callBack(activePage + 1);
  152. }
  153. });
  154. });
  155. }
  156. };
  157. })(jQuery);/**
  158. * Created by Hope on 2014/12/28.
  159. */
  160. (function ($) {
  161. $.fn.extendPagination = function (options) {
  162. var defaults = {
  163. pageId:'',
  164. totalCount: '',
  165. showPage: '10',
  166. limit: '5',
  167. callback: function () {
  168. return false;
  169. }
  170. };
  171. $.extend(defaults, options || {});
  172. // alert(defaults.pageId);
  173. if (defaults.totalCount == '') {
  174. //alert('总数不能为空!');
  175. $(this).empty();
  176. return false;
  177. } else if (Number(defaults.totalCount) <= 0) {
  178. //alert('总数要大于0!');
  179. $(this).empty();
  180. return false;
  181. }
  182. if (defaults.showPage == '') {
  183. defaults.showPage = '10';
  184. } else if (Number(defaults.showPage) <= 0)defaults.showPage = '10';
  185. if (defaults.limit == '') {
  186. defaults.limit = '5';
  187. } else if (Number(defaults.limit) <= 0)defaults.limit = '5';
  188. var totalCount = Number(defaults.totalCount), showPage = Number(defaults.showPage),
  189. limit = Number(defaults.limit), totalPage = Math.ceil(totalCount / limit);
  190. if (totalPage > 0) {
  191. var html = [];
  192. html.push(' <ul class="pagination">');
  193. html.push(' <li class="previous"><a href="#">&laquo;</a></li>');
  194. html.push('<li class="disabled hidden"><a href="#">...</a></li>');
  195. if (totalPage <= showPage) {
  196. for (var i = 1; i <= totalPage; i++) {
  197. if (i == defaults.pageId) html.push(' <li class="active"><a href="#">' + i + '</a></li>');
  198. else html.push(' <li><a href="#">' + i + '</a></li>');
  199. }
  200. } else {
  201. for (var j = 1; j <= showPage; j++) {
  202. if (j == defaults.pageId) html.push(' <li class="active"><a href="#">' + j + '</a></li>');
  203. else html.push(' <li><a href="#">' + j + '</a></li>');
  204. }
  205. }
  206. html.push('<li class="disabled hidden"><a href="#">...</a></li>');
  207. html.push('<li class="next"><a href="#">&raquo;</a></li></ul>');
  208. $(this).html(html.join(''));
  209. if (totalPage > showPage) $(this).find('ul.pagination li.next').prev().removeClass('hidden');
  210. var pageObj = $(this).find('ul.pagination'), preObj = pageObj.find('li.previous'),
  211. currentObj = pageObj.find('li').not('.previous,.disabled,.next'),
  212. nextObj = pageObj.find('li.next');
  213. function loopPageElement(minPage, maxPage) {
  214. var tempObj = preObj.next();
  215. for (var i = minPage; i <= maxPage; i++) {
  216. if (minPage == 1 && (preObj.next().attr('class').indexOf('hidden')) < 0)
  217. preObj.next().addClass('hidden');
  218. else if (minPage > 1 && (preObj.next().attr('class').indexOf('hidden')) > 0)
  219. preObj.next().removeClass('hidden');
  220. if (maxPage == totalPage && (nextObj.prev().attr('class').indexOf('hidden')) < 0)
  221. nextObj.prev().addClass('hidden');
  222. else if (maxPage < totalPage && (nextObj.prev().attr('class').indexOf('hidden')) > 0)
  223. nextObj.prev().removeClass('hidden');
  224. var obj = tempObj.next().find('a');
  225. if (!isNaN(obj.html()))obj.html(i);
  226. tempObj = tempObj.next();
  227. }
  228. }
  229. function callBack(curr) {
  230. defaults.callback(curr, defaults.limit, totalCount);
  231. }
  232. currentObj.click(function (event) {
  233. event.preventDefault();
  234. var currPage = Number($(this).find('a').html()), activeObj = pageObj.find('li[class="active"]'),
  235. activePage = Number(activeObj.find('a').html());
  236. if (currPage == activePage) return false;
  237. if (totalPage > showPage) {
  238. var maxPage = currPage, minPage = 1;
  239. if (($(this).prev().attr('class'))
  240. && ($(this).prev().attr('class').indexOf('disabled')) >= 0) {
  241. minPage = currPage - 1;
  242. maxPage = minPage + showPage - 1;
  243. loopPageElement(minPage, maxPage);
  244. } else if (($(this).next().attr('class'))
  245. && ($(this).next().attr('class').indexOf('disabled')) >= 0) {
  246. if (totalPage - currPage >= 1) maxPage = currPage + 1;
  247. else maxPage = totalPage;
  248. if (maxPage - showPage > 0) minPage = (maxPage - showPage) + 1;
  249. loopPageElement(minPage, maxPage)
  250. }
  251. }
  252. activeObj.removeClass('active');
  253. $.each(currentObj, function (index, thiz) {
  254. if ($(thiz).find('a').html() == currPage) {
  255. $(thiz).addClass('active');
  256. callBack(currPage);
  257. }
  258. });
  259. });
  260. preObj.click(function (event) {
  261. event.preventDefault();
  262. var activeObj = pageObj.find('li[class="active"]'), activePage = Number(activeObj.find('a').html());
  263. if (activePage <= 1) return false;
  264. if (totalPage > showPage) {
  265. var maxPage = activePage, minPage = 1;
  266. if ((activeObj.prev().prev().attr('class'))
  267. && (activeObj.prev().prev().attr('class').indexOf('disabled')) >= 0) {
  268. minPage = activePage - 1;
  269. if (minPage > 1) minPage = minPage - 1;
  270. maxPage = minPage + showPage - 1;
  271. loopPageElement(minPage, maxPage);
  272. }
  273. }
  274. $.each(currentObj, function (index, thiz) {
  275. if ($(thiz).find('a').html() == (activePage - 1)) {
  276. activeObj.removeClass('active');
  277. $(thiz).addClass('active');
  278. callBack(activePage - 1);
  279. }
  280. });
  281. });
  282. nextObj.click(function (event) {
  283. event.preventDefault();
  284. var activeObj = pageObj.find('li[class="active"]'), activePage = Number(activeObj.find('a').html());
  285. if (activePage >= totalPage) return false;
  286. if (totalPage > showPage) {
  287. var maxPage = activePage, minPage = 1;
  288. // if ((activeObj.next().next().attr('class'))
  289. // && (activeObj.next().next().attr('class').indexOf('disabled')) >= 0) {
  290. // maxPage = activePage + 2;
  291. // if (maxPage > totalPage) maxPage = totalPage;
  292. // minPage = maxPage - showPage + 1;
  293. // loopPageElement(minPage, maxPage);
  294. // }
  295. if ((activeObj.next().next().attr('class'))
  296. && (activeObj.next().next().attr('class').indexOf('disabled')) >= 0) {
  297. maxPage = activePage + 2;
  298. if (maxPage > totalPage) maxPage = totalPage;
  299. minPage = maxPage - showPage + 1;
  300. loopPageElement(minPage, maxPage);
  301. }
  302. }
  303. $.each(currentObj, function (index, thiz) {
  304. if ($(thiz).find('a').html() == (activePage + 1)) {
  305. activeObj.removeClass('active');
  306. $(thiz).addClass('active');
  307. callBack(activePage + 1);
  308. }
  309. });
  310. });
  311. }
  312. };
  313. })(jQuery);/**
  314. * Created by Hope on 2014/12/28.
  315. */
  316. (function ($) {
  317. $.fn.extendPagination = function (options) {
  318. var defaults = {
  319. pageId:'',
  320. totalCount: '',
  321. showPage: '10',
  322. limit: '5',
  323. callback: function () {
  324. return false;
  325. }
  326. };
  327. $.extend(defaults, options || {});
  328. // alert(defaults.pageId);
  329. if (defaults.totalCount == '') {
  330. //alert('总数不能为空!');
  331. $(this).empty();
  332. return false;
  333. } else if (Number(defaults.totalCount) <= 0) {
  334. //alert('总数要大于0!');
  335. $(this).empty();
  336. return false;
  337. }
  338. if (defaults.showPage == '') {
  339. defaults.showPage = '10';
  340. } else if (Number(defaults.showPage) <= 0)defaults.showPage = '10';
  341. if (defaults.limit == '') {
  342. defaults.limit = '5';
  343. } else if (Number(defaults.limit) <= 0)defaults.limit = '5';
  344. var totalCount = Number(defaults.totalCount), showPage = Number(defaults.showPage),
  345. limit = Number(defaults.limit), totalPage = Math.ceil(totalCount / limit);
  346. if (totalPage > 0) {
  347. var html = [];
  348. html.push(' <ul class="pagination">');
  349. html.push(' <li class="previous"><a href="#">&laquo;</a></li>');
  350. html.push('<li class="disabled hidden"><a href="#">...</a></li>');
  351. if (totalPage <= showPage) {
  352. for (var i = 1; i <= totalPage; i++) {
  353. if (i == defaults.pageId) html.push(' <li class="active"><a href="#">' + i + '</a></li>');
  354. else html.push(' <li><a href="#">' + i + '</a></li>');
  355. }
  356. } else {
  357. for (var j = 1; j <= showPage; j++) {
  358. if (j == defaults.pageId) html.push(' <li class="active"><a href="#">' + j + '</a></li>');
  359. else html.push(' <li><a href="#">' + j + '</a></li>');
  360. }
  361. }
  362. html.push('<li class="disabled hidden"><a href="#">...</a></li>');
  363. html.push('<li class="next"><a href="#">&raquo;</a></li></ul>');
  364. $(this).html(html.join(''));
  365. if (totalPage > showPage) $(this).find('ul.pagination li.next').prev().removeClass('hidden');
  366. var pageObj = $(this).find('ul.pagination'), preObj = pageObj.find('li.previous'),
  367. currentObj = pageObj.find('li').not('.previous,.disabled,.next'),
  368. nextObj = pageObj.find('li.next');
  369. function loopPageElement(minPage, maxPage) {
  370. var tempObj = preObj.next();
  371. for (var i = minPage; i <= maxPage; i++) {
  372. if (minPage == 1 && (preObj.next().attr('class').indexOf('hidden')) < 0)
  373. preObj.next().addClass('hidden');
  374. else if (minPage > 1 && (preObj.next().attr('class').indexOf('hidden')) > 0)
  375. preObj.next().removeClass('hidden');
  376. if (maxPage == totalPage && (nextObj.prev().attr('class').indexOf('hidden')) < 0)
  377. nextObj.prev().addClass('hidden');
  378. else if (maxPage < totalPage && (nextObj.prev().attr('class').indexOf('hidden')) > 0)
  379. nextObj.prev().removeClass('hidden');
  380. var obj = tempObj.next().find('a');
  381. if (!isNaN(obj.html()))obj.html(i);
  382. tempObj = tempObj.next();
  383. }
  384. }
  385. function callBack(curr) {
  386. defaults.callback(curr, defaults.limit, totalCount);
  387. }
  388. currentObj.click(function (event) {
  389. event.preventDefault();
  390. var currPage = Number($(this).find('a').html()), activeObj = pageObj.find('li[class="active"]'),
  391. activePage = Number(activeObj.find('a').html());
  392. if (currPage == activePage) return false;
  393. if (totalPage > showPage) {
  394. var maxPage = currPage, minPage = 1;
  395. if (($(this).prev().attr('class'))
  396. && ($(this).prev().attr('class').indexOf('disabled')) >= 0) {
  397. minPage = currPage - 1;
  398. maxPage = minPage + showPage - 1;
  399. loopPageElement(minPage, maxPage);
  400. } else if (($(this).next().attr('class'))
  401. && ($(this).next().attr('class').indexOf('disabled')) >= 0) {
  402. if (totalPage - currPage >= 1) maxPage = currPage + 1;
  403. else maxPage = totalPage;
  404. if (maxPage - showPage > 0) minPage = (maxPage - showPage) + 1;
  405. loopPageElement(minPage, maxPage)
  406. }
  407. }
  408. activeObj.removeClass('active');
  409. $.each(currentObj, function (index, thiz) {
  410. if ($(thiz).find('a').html() == currPage) {
  411. $(thiz).addClass('active');
  412. callBack(currPage);
  413. }
  414. });
  415. });
  416. preObj.click(function (event) {
  417. event.preventDefault();
  418. var activeObj = pageObj.find('li[class="active"]'), activePage = Number(activeObj.find('a').html());
  419. if (activePage <= 1) return false;
  420. if (totalPage > showPage) {
  421. var maxPage = activePage, minPage = 1;
  422. if ((activeObj.prev().prev().attr('class'))
  423. && (activeObj.prev().prev().attr('class').indexOf('disabled')) >= 0) {
  424. minPage = activePage - 1;
  425. if (minPage > 1) minPage = minPage - 1;
  426. maxPage = minPage + showPage - 1;
  427. loopPageElement(minPage, maxPage);
  428. }
  429. }
  430. $.each(currentObj, function (index, thiz) {
  431. if ($(thiz).find('a').html() == (activePage - 1)) {
  432. activeObj.removeClass('active');
  433. $(thiz).addClass('active');
  434. callBack(activePage - 1);
  435. }
  436. });
  437. });
  438. nextObj.click(function (event) {
  439. event.preventDefault();
  440. var activeObj = pageObj.find('li[class="active"]'), activePage = Number(activeObj.find('a').html());
  441. if (activePage >= totalPage) return false;
  442. if (totalPage > showPage) {
  443. var maxPage = activePage, minPage = 1;
  444. // if ((activeObj.next().next().attr('class'))
  445. // && (activeObj.next().next().attr('class').indexOf('disabled')) >= 0) {
  446. // maxPage = activePage + 2;
  447. // if (maxPage > totalPage) maxPage = totalPage;
  448. // minPage = maxPage - showPage + 1;
  449. // loopPageElement(minPage, maxPage);
  450. // }
  451. if ((activeObj.next().next().attr('class'))
  452. && (activeObj.next().next().attr('class').indexOf('disabled')) >= 0) {
  453. maxPage = activePage + 2;
  454. if (maxPage > totalPage) maxPage = totalPage;
  455. minPage = maxPage - showPage + 1;
  456. loopPageElement(minPage, maxPage);
  457. }
  458. }
  459. $.each(currentObj, function (index, thiz) {
  460. if ($(thiz).find('a').html() == (activePage + 1)) {
  461. activeObj.removeClass('active');
  462. $(thiz).addClass('active');
  463. callBack(activePage + 1);
  464. }
  465. });
  466. });
  467. }
  468. };
  469. })(jQuery);
  1. 3.项目采用struts2 返回json, struts中配置, 并在action中使用map来封装数据, 并添加get方法
  2. struts.xml
  1. <package name="message" namespace="/" extends="struts-default, json-default">
  2. <action name="message_*" class="messageAction" method="{1}">
  3. <result name="index">/WEB-INF/jsp/message.jsp</result>
  4. <result name="success" type="json">
  5. <param name="root">dataMap</param>
  6. </result>
  7. </action>
  8. </package>
  1. action
  1. package com.cdv.mediastar.action;
  2. import java.io.IOException;
  3. import java.text.ParseException;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import javax.annotation.Resource;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import org.apache.log4j.Logger;
  13. import org.apache.struts2.ServletActionContext;
  14. import org.apache.struts2.json.annotations.JSON;
  15. import org.springframework.context.annotation.Scope;
  16. import org.springframework.stereotype.Controller;
  17. import com.cdv.mediastar.model.Message;
  18. import com.cdv.mediastar.service.MessageService;
  19. import com.cdv.mediastar.util.PageParameter;
  20. import com.opensymphony.xwork2.ActionSupport;
  21. @Scope("request")
  22. @Controller("messageAction")
  23. public class MessageAction extends ActionSupport {
  24. /**
  25. *
  26. */
  27. private static final long serialVersionUID = 3731009117710718470L;
  28. private Logger logger = Logger.getLogger(MessageAction.class);
  29. @Resource
  30. private MessageService messageService;
  31. Map<String, Object> dataMap = new HashMap<String, Object>();
  32. public Map<String, Object> getDataMap() {
  33. return dataMap;
  34. }
  35. public String index(){
  36. HttpServletRequest request = ServletActionContext.getRequest();
  37. PageParameter page = new PageParameter();
  38. int pageNo = page.getPageNo();
  39. int totalCount = messageService.count(null, null, null, 0);
  40. int totalPage = totalCount%page.getPageSize()==0?totalCount/page.getPageSize():totalCount/page.getPageSize()+1;
  41. int startNum = 1, stopNum = 1;
  42. startNum = (pageNo-1)*page.getPageSize()+1;
  43. if((startNum+page.getPageSize()-1)<=totalCount){
  44. stopNum = startNum+page.getPageSize()-1;
  45. }else{
  46. stopNum = totalCount;
  47. }
  48. page.setTotalCount(totalCount);
  49. page.setTotalPage(totalPage);
  50. request.setAttribute("page", page);
  51. request.setAttribute("startNum", startNum);
  52. request.setAttribute("stopNum", stopNum);
  53. return "index";
  54. }
  55. public String list(){
  56. dataMap.clear();
  57. PageParameter page = new PageParameter();
  58. int s = 0, max = page.getPageSize();
  59. List<Message> messageListPage = messageService.find(null, null, null, s, max);
  60. int totalCount = messageService.count(null, null, null, 0);
  61. int totalPage = totalCount%page.getPageSize()==0?totalCount/page.getPageSize():totalCount/page.getPageSize()+1;
  62. page.setTotalCount(totalCount);
  63. page.setTotalPage(totalPage);
  64. int startNum = 0, stopNum = 0;
  65. startNum = 1;
  66. if((startNum+page.getPageSize()-1)<=totalCount){
  67. stopNum = startNum+page.getPageSize()-1;
  68. }else{
  69. stopNum = totalCount;
  70. }
  71. dataMap.put("startNum", startNum);
  72. dataMap.put("stopNum", stopNum);
  73. dataMap.put("totalCount", totalCount);
  74. dataMap.put("totalPage", totalPage);
  75. dataMap.put("pageNo", page.getPageNo());
  76. dataMap.put("messageListPage", messageListPage);
  77. return "success";
  78. }
  79. public String del(){
  80. dataMap.clear();
  81. HttpServletRequest request = ServletActionContext.getRequest();
  82. Long id = Long.parseLong(request.getParameter("id"));
  83. int deleteFlag = messageService.delete(id);
  84. if(deleteFlag>0){
  85. dataMap.put("message", "success");
  86. }else{
  87. dataMap.put("message", "error");
  88. }
  89. logger.info("rocky>>>>>>>>>>>>delete message flag======"+deleteFlag);
  90. return "success";
  91. }
  92. public String search() throws ParseException, IOException{
  93. dataMap.clear();
  94. HttpServletRequest request = ServletActionContext.getRequest();
  95. Date from = null, to = null ;
  96. String searchDateStart = request.getParameter("searchDateStart");
  97. if(searchDateStart!=null && searchDateStart!="") {
  98. from = new SimpleDateFormat("MM/dd/yyyy").parse(searchDateStart);
  99. }
  100. String searchDateEnd = request.getParameter("searchDateEnd");
  101. if(searchDateEnd!=null && searchDateEnd!="") {
  102. to = new SimpleDateFormat("MM/dd/yyyy").parse(searchDateEnd);
  103. }
  104. String receiver = request.getParameter("receiver");
  105. String pageNoStr = request.getParameter("pageNo");
  106. PageParameter page = new PageParameter();
  107. int pageNo = page.getPageNo();
  108. int s = 0, max = page.getPageSize();
  109. if(pageNoStr!=null && pageNoStr!=""){
  110. pageNo = Integer.parseInt(pageNoStr);
  111. s = (pageNo-1)*page.getPageSize();
  112. }
  113. List<Message> messageListPage = messageService.find(receiver, from, to, s, max);
  114. int totalCount = messageService.count(receiver, from, to, 0);
  115. int totalPage = totalCount%page.getPageSize()==0?totalCount/page.getPageSize():totalCount/page.getPageSize()+1;
  116. int startNum = 0, stopNum = 0;
  117. startNum = (pageNo-1)*page.getPageSize()+1;
  118. if((startNum+page.getPageSize()-1)<=totalCount){
  119. stopNum = startNum+page.getPageSize()-1;
  120. }else{
  121. stopNum = totalCount;
  122. }
  123. dataMap.put("startNum", startNum);
  124. dataMap.put("stopNum", stopNum);
  125. dataMap.put("pageNo", pageNo);
  126. dataMap.put("totalCount", totalCount);
  127. dataMap.put("pageSize", page.getPageSize());
  128. dataMap.put("searchDateStart", searchDateStart);
  129. dataMap.put("searchDateEnd", searchDateEnd);
  130. dataMap.put("receiver", receiver);
  131. dataMap.put("messageListPage", messageListPage);
  132. return "success";
  133. }
  134. }
  1. 以上就是小编为大家带来的jsp页面 列表 展示 ajax异步实现方法全部内容了,希望大家多多支持脚本之家~
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学