前后端数据交互是每一名web程序员必须熟悉的过程,前后端的数据交互重点在于前端是如何获取后端返回的数据,毕竟后端一般情况下只需要将数据封装到一个jsonMap,然后return就完了。下面通过一个list.js来说明后端是如何将数据传到前端,前端是如何获取数据,并进行数据展示的。
/** * 列表方法 * 1、列表页面显示列表内容的div容器ID为list_container * 2、列表页面模板区域textarea的ID为list_template * 3、列表页面显示列表页码下拉框的div容器ID为list_select * 4、列表页面选择页码到指定页的下拉框select的ID为list_goto * 5、列表页面检索按钮ID为list_button_query * 6、列表页面高级检索按钮ID为list_button_advsearch * 7、列表页面改变页面大小选择框ID为list_changepagesize * 8、列表页面当前页码隐藏表单的ID为list_pagenumber * 9、列表页面排序列隐藏表单的ID为list_sortcolumn * 10、列表页面检索form的ID为search * 11、列表页面功能form的ID为list * * init 初始化参数,可自定义参数如下所示: * var nameSpace = "role"; * { * "nameSpace":nameSpace, * "sortColumnId":["sortcolumn0","sortcolumn1","sortcolumn2"], * "sortColumnValue":{"sortcolumn0":0,"sortcolumn1":1,"sortcolumn2":2}, * "listType":(0-常规列表(默认值),1-弹出层单选列表,2-弹出层复选列表,3-查看页面内嵌列表) * } * @author gongfan, zhouzj * @version 1.1 * @depends 参考seajs文档,依赖模块在require中定义 */ define(function(require, exports, module) { require(‘form‘); require(‘tool/highcharts/highcharts‘); require.async(‘tool/highcharts/exporting‘); var json = {}; // 服务器端返回的json对象 var data = []; // 客户端列表分页缓存对象 var itemNumber;// 总记录数 var pageSize;// 每页显示数 var pageNumber;// 总页数 var currentPageNo;// 当前页码 var pageInfo;// 页面信息,总记录数、总页数等 var pageSelect;// 页码输入框 var pageBackNumber;// 服务器端返回的页数 var startPageNumber;// 当前缓存区段的起始页码 var dealWith;//附加处理函数 var dealWithBefore;//用来对模版或数据进行处理 var nameSpace;// URL前缀 var selectedTab;//标签定位 var sortColumnId;// 支持排序的列ID var sortColumnValue;// 排序列的值 var listType;// (0-常规列表,1-弹出层单选列表,2-弹出层复选列表) var viewParam;//查看详情时向后台传的参数 var truncateSettings;//截断显示设置 /** * 字符串截断 * string : 字符串 * length : 截断长度(汉字为长度1;其它字符为长度0.5) * append : 补充串 */ var setTruncate = function(string, length, append){ if(typeof s != "string" || !/^[1-9]\d*$/.test("" + length)){return string;} var os = string, count = 0, sub = ""; while(/[\u4E00-\u9FFF]/.test(string)){ string = string.replace(/[\u4E00-\u9FFF]/, ""); count++; } if(string.length/2 + count > length){ var cnt = 0, len = 0; for(var i = 0; i < os.length; i++){ if(/[\u4E00-\u9FFF]/.test(os.charAt(i).toString())){ cnt += 2; } else { cnt++; } len++; if(cnt/2 >= length){ sub = os.substring(0, len) + ((append) ? append : ""); break; } } } else { sub = os; } return sub; }; // 截断显示 var doTruncateShow = function(){ if(!truncateSettings){return;} $(truncateSettings).each(function(){ var $this = this; $("." + $this["className"]).each(function(){ var value = $(this).html().toString(); $(this).html(setTruncate(value, $this["length"], "...")) .bind("mouseover", function(){ //$(this).html(value); $(this).attr("title", value); }).bind("mouseout", function(){ $(this).html(setTruncate(value, $this["length"], "...")); }); }); }); }; var getData = function() {// 获取数据 if (parent != null && listType == 0) { parent.loading_flag = true; setTimeout("parent.showLoading();", parent.loading_lag_time); } $("#list_first, #list_previous, #list_next, #list_last").attr("disabled", true); $("#search").submit(); }; var loadTemplate = function(listjson) {// 加载模板 dealWithBefore(listjson, json); $("#list_container").hide(); $("#list_container").html(TrimPath.processDOMTemplate("list_template", listjson)); setOddEvenLine("list_container", listType);// 设置奇偶行效果 if (typeof(listjson.root) == "undefined" || listjson.root.length == 0) { setColspan("list_table");// 设置空列表提示的跨列数 } dealWith(json); $("#list_container").show(); if (parent != null && listType == 0) { parent.loading_flag = false; parent.hideLoading(); } if($("#checkedIds").length > 0){ checkIds(); } }; var showPageNo = function() {// 加载页码及翻页按钮 var tr = $("#list_container").find("table").eq(1).find("tr");// 列表最后一行 // 生成总记录数、每页显示条数 if (listType == 0) { pageInfo = $("<td align=‘right‘ style=‘color:#FFF;‘></td>") $("<span class=‘text_white‘>共</span>").appendTo(pageInfo); $("<span id=‘list_itemNumber‘></span>").appendTo(pageInfo); $("<span>条 </span>").appendTo(pageInfo); $("<span>每页</span>").appendTo(pageInfo); var pageSizeSelect = $("<select id=‘list_changepagesize‘></select>"); $("<option value=‘10‘>10</option>").appendTo(pageSizeSelect); $("<option value=‘20‘>20</option>").appendTo(pageSizeSelect); $("<option value=‘50‘>50</option>").appendTo(pageSizeSelect); pageSizeSelect.appendTo(pageInfo); $("<span>条 </span>").appendTo(pageInfo); tr.append(pageInfo); $("#list_itemNumber").html(itemNumber);// 显示总记录数 $("#list_changepagesize").attr("value", json.pageSize);// 设置页面表单,每页显示数 } // 生成翻页 tr.append($("<td width=‘24‘ align=‘center‘><img id=‘list_first‘ src=‘image/first_page.gif‘ title=‘首页‘ class=‘to_page‘/></td>")); tr.append($("<td width=‘24‘ align=‘center‘><img id=‘list_previous‘ src=‘image/prev_page.gif‘ title=‘上一页‘ class=‘to_page‘/></td>")); tr.append($("<td width=‘24‘ align=‘center‘><img id=‘list_next‘ src=‘image/next_page.gif‘ title=‘下一页‘ class=‘to_page‘/></td>")); tr.append($("<td width=‘24‘ align=‘center‘><img id=‘list_last‘ src=‘image/last_page.gif‘ title=‘末页‘ class=‘to_page‘/></td>")); tr.append($("<td class=‘text_white‘></td>").append("<span>第</span>").append(pageSelect).append($("<span>/" + pageNumber + "</span>")).append("<span>页</span>")); var td = tr.find("td:last-child");// 根据内容确定最后一个单元格的宽度 var goto_width = $("#list_goto").width(); td.css("width", 38 + goto_width * 2 + "px"); td.css("text-align", "left"); $("#list_sortcolumn").attr("value", json.sortColumn);// 设置页面隐藏表单,当前排序 if (pageNumber == 0) { $("#list_goto").attr("value", 0);// 设置到指定页表单 $("#list_pagenumber").val(0); } else { $("#list_goto").attr("value", currentPageNo);// 设置到指定页表单 $("#list_pagenumber").val(currentPageNo); } $(".session").each(function(){ $(this).html(Num2Chinese(parseInt($(this).html()))); }); // 如是弹出层选择页面,则设置默认选中 if($("#trimedName").size() > 0){ defaultSelected(); } }; var showFirstPage = function() {// 首页 if($("#checkedIds").length > 0){updateCheckedIds();} if (pageNumber != 0) { if (currentPageNo != 1) { if (currentPageNo > data.length) { currentPageNo = 1; $("#list_pagenumber").attr("value", currentPageNo); $("#search").attr("action", nameSpace + "/toPage.action"); getData(); } else { currentPageNo = 1; $("#list_pagenumber").attr("value", currentPageNo); loadTemplate(data[0]); showPageNo(); } } } }; var showPreviousPage = function() {// 上页 if($("#checkedIds").length > 0){updateCheckedIds();} if (pageNumber != 0) { if (currentPageNo != 1) { currentPageNo--; $("#list_pagenumber").attr("value", currentPageNo); // if (currentPageNo % pageBackNumber == 0) { if (currentPageNo < startPageNumber) { $("#search").attr("action", nameSpace + "/toPage.action"); getData(); } else { // loadTemplate(data[currentPageNo % pageBackNumber - 1]); loadTemplate(data[currentPageNo - startPageNumber]); showPageNo(); } } } }; var showNextPage = function() {// 下页 if($("#checkedIds").length > 0){updateCheckedIds();} if (pageNumber != 0) { if (currentPageNo != pageNumber) { currentPageNo++; $("#list_pagenumber").attr("value", currentPageNo); if (currentPageNo >= startPageNumber + pageBackNumber) { $("#search").attr("action", nameSpace + "/toPage.action"); getData(); } else { loadTemplate(data[currentPageNo - startPageNumber]); showPageNo(); } } } }; var showLastPage = function() {// 末页 if($("#checkedIds").length > 0){updateCheckedIds();} if (pageNumber != 0) { if (currentPageNo != pageNumber) { currentPageNo = pageNumber; $("#list_pagenumber").attr("value", currentPageNo); if (startPageNumber + data.length - 1 < currentPageNo) { $("#search").attr("action", nameSpace + "/toPage.action"); getData(); } else { loadTemplate(data[data.length - 1]); showPageNo(); } } } }; var showGoTo = function() {// 到指定页 if($("#checkedIds").length > 0){updateCheckedIds();} var oldPageNo = $("#list_pagenumber").val(); currentPageNo = $("#list_goto").val(); if (currentPageNo <= pageNumber && currentPageNo >= 1) { $("#list_pagenumber").attr("value", currentPageNo); if (currentPageNo >= startPageNumber && currentPageNo <= startPageNumber + data.length - 1) { loadTemplate(data[currentPageNo - startPageNumber]); showPageNo(); } else { $("#search").attr("action", nameSpace + "/toPage.action"); getData(); } } else { $("#list_goto").val(oldPageNo); } }; var showPageSize = function() {// 改变列表大小 $("#list_pagesize").attr("value", $("#list_changepagesize").val()); $("#search").attr("action", nameSpace + "/changePageSize.action"); getData(); }; var showSort = function(sortColumn) {// 排序 $("#list_sortcolumn").attr("value", sortColumn); $("#list_pagenumber").attr("value", $("#list_goto").val()); $("#search").attr("action", nameSpace + "/sort.action"); getData(); }; var Highch = function() { $.ajax({ url: nameSpace + "/assist.action", type: "post", dataType: "json", success: function(result) { if (result.errorInfo == null || result.errorInfo == "") { initHighcharts(result); } else { alert(result.errorInfo); } return false; } }) }; var showSimpleSearch = function() {// 检索 var keyword = $("#keyword").val().trim(); $("#keyword").val(keyword); $("#search").attr("action", nameSpace + "/simpleSearch.action"); if($("#checkedIds").length > 0){//检索时要判断是否有checkedIds,如果有要清空 $("#checkedIds").attr("value", ""); }; getData(); }; var showData = function() {// 显示数据 itemNumber = json.totalRows;// 初始化总记录数 pageBackNumber = json.pageBackNumber;// 初始化后台返回页数 pageSize = json.pageSize;// 初始化每页显示数 pageNumber = 0;// 初始化总页数 if (itemNumber % pageSize == 0) { pageNumber = itemNumber / pageSize; } else { pageNumber = Math.floor(itemNumber / pageSize) + 1; } currentPageNo = json.pageNumber;// 初始化当前页码 startPageNumber = json.startPageNumber;// 初始化当前缓存起始页码 pageSelect = $("<input id=‘list_goto‘ type=‘text‘ style=‘width:" + getNumberLength(pageNumber) + "; height:14px; font-size:12px;‘ />");// 初始化页码下拉框 var tmpdata = []; var startRow = (json.startPageNumber - 1) * pageSize; for (var i = 0, j = 0, k = 0; i < json.laData.length; i++) { if (!tmpdata[j]) { tmpdata[j] = $.parseJSON(‘{"root": [], "sortColumn": -1, "sortColumnLabel": -1}‘); } var root = {"laData": [], "num": 0}; root.laData = json.laData[i]; root.num = startRow + (json.pageSize * j) + (k + 1); tmpdata[j].root[k] = root; tmpdata[j].sortColumn = json.sortColumn; tmpdata[j].sortColumnLabel = json.sortColumnLabel; k++; if (i % pageSize == pageSize - 1) { j++; k = 0; } } data = tmpdata; if (data.length > 0) { loadTemplate(data[currentPageNo - startPageNumber]); // 加载初始页 } else { data = $.parseJSON(‘{"root": [], "sortColumn": -1, "sortColumnLabel": -1}‘); data.sortColumn = json.sortColumn; data.sortColumnLabel = json.sortColumnLabel; loadTemplate(data); } showPageNo(); }; var optionssearch = { dataType: "json", success: function (result) { if (result.errorInfo == null || result.errorInfo == "") { if (result.totalRows > 50) { if(nameSpace.indexOf("project") != -1){ Highch(); } $("#container").show(); } else { $("#container").hide(); } json = result; showData(); } else { alert(result.errorInfo); } $("#list_first, #list_previous, #list_next, #list_last").attr("disabled", false); } }; var initHighcharts = function(json) { $(‘#container‘).highcharts({ chart : { type : ‘column‘ }, title : { text : null }, subtitle: { text: json.xTitle + ‘分布情况(前十条)‘ }, xAxis : { categories : json.lTitle, title: { text: json.xTitle, } }, yAxis : { min : 0, title : { text : json.yTitle } }, legend: { enabled: false }, tooltip: { valueSuffix: ‘ 条‘ }, plotOptions : { series : { pointWidth : 50 }, column : { pointPadding : 0.2, borderWidth : 0 } }, series : [ { name : json.yTitle, data : json.lData } ] }); } var optionslist = { dataType: "json", success: function (result) { if (result == undefined || result == null) {// 未知的错误异常 alert("未知的错误异常"); } else if (result.errorInfo == null || result.errorInfo == "") { $("#search").attr("action", nameSpace + "/toPage.action?update=1"); getData(); } else {// 已知的错误异常 alert(result.errorInfo); } $("#list_first, #list_previous, #list_next, #list_last").attr("disabled", false); } }; var getNumberLength = function(number) {// 根据数字的位数,确定输入框的宽度 var strNumber = "" + number; var length = strNumber.length + 1; return 7 * length + "px"; }; var initPageShow = function(init) { // 参数预处理 if(typeof(init.dealWith) == ‘undefined‘){ dealWith = function(){}; }else{ dealWith = init.dealWith; } if(typeof(init.dealWithBefore) == ‘undefined‘){ dealWithBefore = function(){}; }else{ dealWithBefore = init.dealWithBefore; } if (typeof(init.nameSpace) == ‘undefined‘) { nameSpace = null; } else { nameSpace = init.nameSpace; } if (typeof(init.selectedTab) == ‘undefined‘) { selectedTab = null; } else { selectedTab = init.selectedTab; } if (typeof(init.sortColumnId) == ‘undefined‘) { sortColumnId = null; } else { sortColumnId = init.sortColumnId; } if (typeof(init.sortColumnValue) == ‘undefined‘) { sortColumnValue = null; } else { sortColumnValue = init.sortColumnValue; } if (typeof(init.listType) == ‘undefined‘) { listType = 0; } else { listType = init.listType; } if (typeof(init.viewParam) == ‘undefined‘) { viewParam = null; } else { viewParam = init.viewParam; } if(typeof(init.truncateSettings) == ‘undefined‘){ truncateSettings = null; } else { truncateSettings = init.truncateSettings; } $("#advSearch").submit(function() { $(this).ajaxSubmit(optionssearch); return false; }); $("#search").submit(function() {// 提交ajax请求,返回列表数据 $(this).ajaxSubmit(optionssearch); return false; }); $("#list").submit(function() { $(this).ajaxSubmit(optionslist); return false; }); getData(); $("#check").live("click", function() {// 全选 checkAll(this.checked, "entityIds"); }); $("#list_add").live("click", function() {// 添加按钮 var url = basePath + nameSpace + "/toAdd.action?type=1" if(viewParam != null && viewParam.listflag != undefined){ url += "&listflag=" + viewParam.listflag; } window.location.href = url; return false; }); $("#list_add_result").live("click", function() {// 项目中用到 var url = basePath + nameSpace + "/toAddResult.action?type=1" if(viewParam != null && viewParam.listflag != undefined){ url += "&listflag=" + viewParam.listflag; } window.location.href = url; return false; }); $("#list_delete").live("click", function() {// 删除按钮 var cnt = count("entityIds"); if (cnt == 0) { alert("请选择要删除的记录!"); } else { if (confirm("您确定要删除选中的记录吗?")) { if($("#checkedIds").length > 0){ $("#checkedIds").attr("value", ""); }; $("#type").attr("value", 1); $("#pagenumber").attr("value", $("#list_goto").val()); $("#list").attr("action", nameSpace + "/delete.action"); $("#list").submit(); } } return false; }); $("#list_funding").live("click", function() {// 批量拨款按钮 var cnt = count("entityIds"); if (cnt == 0) { alert("请选择要拨款的记录!"); } else { if (confirm("您确定要对选中的记录拨款吗?")) { if($("#checkedIds").length > 0){ $("#checkedIds").attr("value", ""); }; $("#type").attr("value", 1); $("#pagenumber").attr("value", $("#list_goto").val()); $("#list").attr("action", nameSpace + "/funding.action"); $("#list").submit(); } } return false; }); $(".link1").live("click", function(){// 点击进入查看页面 //var url = basePath + nameSpace + "/toView.action?entityId=" + this.id + "&pageNumber=" + $("#list_pagenumber").val(); var url = ""; //不再需要页码 if(this.type == 8 || this.type == 10){//结项评审或者申请评审列表进入查看页面url url = basePath + nameSpace + "/toViewReview.action?entityId=" + this.id; //不再需要页码 }else{ url = basePath + nameSpace + "/toView.action?entityId=" + this.id; //不再需要页码 } url += (this.type) ? "&listType=" + this.type : "";//(项目列表类型先如是判别) url += (selectedTab != null) ? "&selectedTab=" + selectedTab : ""; if(viewParam != null && viewParam.listflag != undefined){ url += "&listflag=" + viewParam.listflag; } window.location.href = url; return false; }); $("#list_button_query").bind("click", function() {// 初级检索 showSimpleSearch(); return false; }); $("#list_search_more").click(function(){// 点击展开更多条件 $("#adv_search").slideToggle("slow"); $("#simple_search").hide(); $(this).attr("value", "更多条件"); }); $("#list_search_hide").click(function(){// 点击收起更多条件 $("#adv_search").slideToggle(50); $("#simple_search").show(); $(this).attr("value", "隐藏条件"); }); if($("#advFlag").val() == 1){ $("#adv_search").show(); $("#simple_search").hide(); $("#list_search_hide").attr("value", "隐藏条件"); } else { $("#adv_search").hide(); $("#simple_search").show(); $("#list_search_more").attr("value", "更多条件"); } $("#list_button_advSearch").live("click", function() { if (parent != null && listType == 0) { parent.loading_flag = true; setTimeout("parent.showLoading();", parent.loading_lag_time); } $("#advSearch").attr("action", nameSpace + "/advSearch.action"); $("#advSearch").submit(); return false; }); $("#list_changepagesize").live("change", function() {// 改变每页显示条目数量 showPageSize(); return false; }); $("#list_first").live("click", function() {// 首页 showFirstPage(); return false; }); $("#list_previous").live("click", function() {// 上一页 showPreviousPage(); return false; }); $("#list_next").live("click", function() {// 下一页 showNextPage(); return false; }); $("#list_last").live("click", function() {// 末页 showLastPage(); return false; }); $("#keyword").live("keypress", function(event) {// 给检索添加键盘事件,回车提交 var keyCode = event.which; if (keyCode == 13) { showSimpleSearch(); return false; } else { return true; } }); $("#list_goto").live("click", function(){// 点击选中页码,给换页绑定回车及弹出事件 this.select(); }).live("keypress", function(event) { var keyCode = event.which; if (keyCode == 13) { showGoTo(); return false; } else { return true; } }).live("blur", function(event) { showGoTo(); }); if (sortColumnId != null && sortColumnValue != null) { for (var i = 0; i < sortColumnId.length; i++) { $("#" + sortColumnId[i]).live("click", function(){ showSort(sortColumnValue[this.id]); return false; }); } } // 点击单个的checkbox时,维护全选框的状态 $("input[name=‘entityIds‘]").live("click", function() { var checkbox_length = $("input[name=‘entityIds‘]").length; var cnt = count("entityIds");// 当前已选中的个数 if (this.checked) {// 当有项被选中时,判断当前是否已全选了 if (cnt == checkbox_length) { $("#check").eq(0).attr("checked", true); } } else {// 当有项撤销选中时,判断头是否处于非全选状态 $("#check").eq(0).attr("checked", false); } }); }; /** * 将本页所选id和之前保存的id拼接并放入checkedIds隐藏域。 * 在离开本页前需执行此方法。 * @memberOf {TypeName} */ var updateCheckedIds = function(){ var checkedIds = $("#checkedIds").val(); $("input[name=‘entityIds‘]").each(function() { var idx = checkedIds.indexOf(this.value); if (this.checked && (idx == -1)) {// 选择不在隐藏域保存的id checkedIds += $(this).val() + ","; } else if(!this.checked && (idx != -1)) {// 取消选择隐藏域中的id var left = checkedIds.substring(0, idx); var right = checkedIds.substring(idx); checkedIds = left + right.substring(right.indexOf(",") + 1); } }); $("#checkedIds").attr("value",checkedIds); }; /** * 翻页(loadTemplate)之后将已选项勾选 * @memberOf {TypeName} */ var checkIds = function(){ var checkedIds = $("#checkedIds").val(); $("input[name=‘entityIds‘]").each(function() { if (checkedIds.indexOf(this.value) != -1) { this.checked = true; } }); }; module.exports = { pageShow: function(init) {initPageShow(init);}, getData: function() {getData();}, // 提供给一些模块的添加和删除按钮重写 selectedTab: selectedTab, viewParam: viewParam }; });
首先,前端点击数据检索按钮;
——》执行showSimpleSearch()方法,该方法将检索关键字做简单去空格处理,同时指定后端要执行的action(这个一般在form表单中就有一次指定,此处做了双重指定);
——》执行getData()方法,设置加载超时,置灰列表按钮;
——》发送submit();
——》submit()方法将提交转换成jQuery的ajaxSubmit(optionsSearch),这个里面的optionsSearch参数很重要了,它是一个配置参数;
——》后台执行对应的action,将数据封装到一个jsonMap中,通过action对应的XML配置文件将数据返回给前端;
——》前端收到数据后,执行下面optionsSearch中的回调函数抓取数据,数据以result参数的形式被送到前端;
——》前端接收到数据后,执行showData()进行自定义的数据展示。
这就是前后端数据交互的一个详细的完整流程。
时间: 2024-10-22 02:33:18