Teambiz中分页之前台处理
   
   
   
   
   
   
   
  作者:何杨
  撰写日期:2012年2月25日
  版本:1.02
  更新日期:  2012年2月27日
   
   
  第一部分:功能说明
  将后台处理好的XML形式的分页数据,展现在前台页面上。
  第二部分:核心组件
       |     名称     |        路径     |        说明     |   
     |     Ajax.Request,ajaxObj,ajaxObj.responseText,ajaxObj.responseXML,status,arr,tableDatas     |        无     |        已经在《03.Teambiz中前台页面对XHR对象从后台取回的XML的处理.docx》一文中进行说明。     |   
     |     addDatasToTable     |        teambiz\WebRoot\page\jsp\relation\sent\javascript.jsp中同名函数     |        此函数用于将tableDatas中的数据(当前页的数据)展现在页面的表格中。     |   
     |     currentPage     |        无     |        此变量是ajaxObj.responseXML中第一个currentPage元素的值,表示当前页的页码。     |   
     |     recordCount     |        无     |        此变量是ajaxObj.responseXML中第一个recordCount元素的值,表示当前页的容纳的记录数。     |   
     |     pageCount     |        无     |        此变量是ajaxObj.responseXML中第一个pageCount元素的值,表示总页数。     |   
     |     setPage     |        teambiz\WebRoot\page\js\changePage.js中同名函数     |        利用currentPage,recordCount,pageCount前三个变量,通过运算,在表格的caption部分显示总记录数,总页数,当前第几页,首页,上页,下页,末页等数据或链接;在表格的footer部分显示分页页码及跳转按钮。    第四个变量是查询函数的名称,当生成翻页链接的时候需要用到它。另外,如果页面上有两个翻页表格,那么第四个变量能使翻页链接不会混淆。     |   
 
   
  第三部分:关键代码说明
  1. 从后台传来的XML:
  <response>
              <status>ok</status>
              <currentPage>0</currentPage>
              <recordCount>3</recordCount>
              <pageCount>1</pageCount>
              <node>
                          <id>92</id>
                          <fromusername>何杨</fromusername>
                          <name>汪大海</name>
                          <email>wy@138.com</email>
                          <groupname>开发组</groupname>
                          <companyname>IBM</companyname>
                          <status>已同意</status>
              </node>
              <node>
                          <id>90</id>
                          <fromusername>何杨</fromusername>
                          <name>朱由检</name>
                          <email>zjy1@163.com</email>
                          <groupname>管理组</groupname>
                          <companyname>联通集成公司</companyname>
                          <status>请求中</status>
              </node>
              <node>
                          <id>91</id>
                          <fromusername>何杨</fromusername>
                          <name>张翼德</name>
                          <email>212@18.com</email>
                          <groupname>管理组</groupname>
                          <companyname>联通集成公司</companyname>
                          <status>请求中</status>
              </node>
  </response>
  这部分数据和我们在《02.Teambiz中从Sql到XML的过程.docx》一文中看到的XML很相似,只是多了currentPage,recordCount,pageCount三个节点,前文说过,这是在BaseService的pagedSearch或pagedSearch4DB2中产生的,目的是帮助显示分页相关的信息,他们的值将被页面的JS函数setPage使用。其它的node数据将显示在表格中(使用tableDatas作为载体)。
   
  2. JavaScript函数setPage
  /*****************************************************
  * 设置分页数据
  * 何杨 2011年4月13日20:07:21
  *****************************************************/
  function setPage(recordCount,currentPage,pageCount,queryFunctionName){
              recordCount=eval(recordCount);
              currentPage=eval(currentPage);
              pageCount=eval(pageCount);
   
              $("recordCount").innerHTML=recordCount;
              $("currentPage").innerHTML=1+currentPage;
              $("pageCount").innerHTML=pageCount;
              
              var pageIndex=0;
              var firstPage;
              if(currentPage!=0){
                          firstPage="  <a href='javascript:"+queryFunctionName+"(0)'>首页</a>";
              }
              else{
                          firstPage="  首页";
              }
              
              pageIndex=currentPage-1;
              var prevPage;
              if(pageIndex>=0){
                       prevPage="  <a href='javascript:"+queryFunctionName+"("+pageIndex+")'>上页</a>";
              }
              else{
                          prevPage="  上页";
              }
              
              // 分页页码
              var min=currentPage-5;
              if(min<0){
                          min=0;
              }
              
              var max=min+10;
              if(max>pageCount){
                          max=pageCount;
              }
              
              var continuePage="";
              for(var i=min;i<max;i++){
                          if(i!=currentPage){
                                      continuePage+=" <a href='javascript:"+queryFunctionName+"("+i+")'>"+(i+1)+"</a>";
                          }
                          else{
                                      continuePage+=" "+(i+1)+"";
                          }
              }           
              
              pageIndex=currentPage+1;
              var nextPage;
              if(pageIndex<=pageCount-1){
                       nextPage="  <a href='javascript:"+queryFunctionName+"("+pageIndex+")'>下页</a>";
              }
              else{
                          nextPage="  下页";
              }
              
              pageIndex=currentPage;
              var lastPage;
              if(pageIndex<pageCount-1){
                          lastPage="  <a href='javascript:"+queryFunctionName+"("+(pageCount-1)+")'>尾页</a>";
              }
              else{
                          lastPage="  尾页";
              }
              
              $("pageData").innerHTML=firstPage+prevPage+nextPage+lastPage;
              
              $("footPageData").innerHTML=continuePage;
              $("pageIndexTxt").value=currentPage+1;
  }
  以上代码路径:teambiz\WebRoot\page\js\changePage.js
   
  3. JavaScript函数的addDatasToTable。
  /**********************************************
  * 将数据添加到表格
  * 何杨,2012年1月8日18:35:06
  **********************************************/
  function addDatasToTable(tableDatas,userTable){
              for(var i=0;i<tableDatas.length;i++){
                          var arr=tableDatas[i];
                          
                          // 创建行
                          var row=document.createElement("tr");            
                                                  
                          // 加入复选框
                          var checkBox=document.createElement("input");
                          checkBox.setAttribute("type","checkbox");
                          checkBox.setAttribute("id",arr[0]);
                          
                          var td=document.createElement("td");
                          td.appendChild(checkBox);                       
                          row.appendChild(td);         
                          
                          row.appendChild(createTextTd(arr[1])); 
                          row.appendChild(createTextTd(arr[2])); 
                          row.appendChild(createTextTd(arr[3])); 
                          row.appendChild(createTextTd(arr[4])); 
                          row.appendChild(createTextTd(arr[5])); 
                          row.appendChild(createTextTd(arr[6])); 
              
                          userTable.appendRow(row);
              }
  }
  以上代码位置:teambiz\WebRoot\page\jsp\relation\sent\javascript.jsp
  根据实际情况的不同,我们可能会往行row中添加文本,链接,图片,图片链接等对象,TeamBiz为此类事务设计了一批函数以简化代码编写,这将在后面的文章详述。
   
  4.页面表格
  <table class="stocktable" width="100%" cellspacing="0">
              <caption>
                          <select id="pageSizeCbo”>
                                      <option value="20">20</option>
                                      <option value="50">50</option>
                                      <option value="100">100</option>
                                      <option value="1000">1000</option>
                          </select>
              总记录数<span id="recordCount">0</span> 总页数<span id="pageCount">0</span> 当前第<span id="currentPage">0</span>页 <span id="pageData">0</span></caption>
              <thead>
                          <tr>
                                      <th width="28"><input type="checkbox" id="selectAllChk" onclick="selectAllCheckBox()"/></th>
                                      <th width="17%">发送用户</th>
                                      <th width="16%">接收用户</th>
                                      <th width="16%">接收用户邮件</th>
                                      <th width="16%">接收所属组名</th>
                                      <th width="16%">接收所属公司</th>
                                      <th width="16%">联系状态</th>
                          </tr>
              </thead>
              <tbody id="userTable">
                          <tr class="odd">
                                      <td colspan="40"><img src='page/jsp/relation/create/img/waiting.gif'/> 查询中,请稍候...</td>
                          </tr>
              </tbody>
               <tfoot>
                          <tr>
                                      <td colspan="40" align="right" width="100%">
                                                  <div class="submitDiv">
                                                              <label for="gotoPageBtn"> </label>
                                                              <input type='button' name='gotoPageBtn' onchange='gotoPage()' value='转到' />第<input type='text' id='pageIndexTxt' onchange='gotoPage()' size='1' />页 页码:<span id="footPageData"></span>
                                                  </div>
                                      </td>
                          </tr>
              </tfoot>
  </table>
  以上代码很好理解,setPage函数将改变caption及tfooter中的内容,而addDatasToTable函数将改写tbody中的内容。
   
  第四部分:使用步骤
       |     步骤     |        说明     |        参照     |   
     |     将表格代码复制到前台页面中     |        你可以改变节点的位置,如将caption中的翻页链接转移到下方tfooter中,但不要修改节点id。    表格的id可以任意修改。     |        teambiz\WebRoot\page\jsp\relation\sent\content.jsp     |   
     |     编写向后台请求的函数     |        需要记住表格id与table对象的对应关系。     |        eambiz\WebRoot\page\jsp\relation\sent\javascript.jsp中的search函数。     |   
     |     编写填充表格数据的函数     |              |        eambiz\WebRoot\page\jsp\relation\sent\javascript.jsp中的addDatasToTable函数。     |   
 
   
  第五部分:小结
  至此,我们看到了通过Ajax方式异步从后台取出数据并在页面上展现的过程,在后台和前台一系列类的帮助下,我们可以断言这一过程并不复杂,主要的思考性工作在于后台的SQL语句的编写以及前台使用DOM展现数据,中间的数据转化,通道的完成和数据的传递基本可以看成是事务性工作,仅需不多的时间即可完成,而且不需要高超的程序技巧。
  在前台,也有一系列类在减轻程序员的负担,在后继文章中我将为大家一一展示。