首先介绍下背景,在我们的高校平台考试模块中有一种需求是显示题库中的试题,但是由于题库表不同于普通的Entity,他是动态创建的,也就是说表中的字段名是不固定的,表中字段的数目也是不固定的,显示出来的列的中文也是不固定的,但是我们需要在同一个页面中根据所选择的试题题库来显示不同的试题。这样充满动态感的需求需要怎样来处理呢?其实很简单,一提到动态我们自然而然想到的就是配置,而通常作为配置文件的就是xml文件,在这里我们同样采用配置xml的方式来解决这个问题。
1.解读一下我们的xml文件:
<?xml version="1.0" encoding="UTF-8"?> <users> <tableName>TEB_DXYY_FHSTL <collegeName>大学英语复合式听力</collegeName> </tableName> <tableName>TEB_DXYY_JDT <collegeName>大学英语简答题</collegeName> </tableName> <TEB_DXYY_FHSTL engField="QUESTIONID,SCOPE,BOOKNAME,CHAPTERID,QUESTIONTYPEID,DEGREE,FRACTION,QUESTIONCONTENT,TIMELENGTH,ISVALID,ADDUSER,TIMESTAMP,REMARK,OTHER1,OTHER2">realTX <fieldName>试题ID</fieldName> <fieldName>范围</fieldName> <fieldName>书名</fieldName> <fieldName>章节ID</fieldName> <fieldName>题型ID</fieldName> <fieldName>难度</fieldName> <fieldName>分数</fieldName> <fieldName>试题内容</fieldName> <fieldName>时长</fieldName> <fieldName>是否可用</fieldName> <fieldName>所添加用户</fieldName> <fieldName>所添加时间</fieldName> <fieldName>备注</fieldName> <fieldName>Other1</fieldName> <fieldName>Other2</fieldName> </TEB_DXYY_FHSTL> <TEB_DXYY_JDT engField="QUESTIONID,CHAPTERID,QUESTIONTYPEID,DEGREE,FRACTION,QUESTIONCONTENT,CORRECTANSWER,ISVALID,ADDUSER,TIMESTAMP,REMARK,OTHER1,OTHER2">realTX <fieldName>试题ID</fieldName> <fieldName>章节ID</fieldName> <fieldName>题型ID</fieldName> <fieldName>难度</fieldName> <fieldName>分数</fieldName> <fieldName>试题内容</fieldName> <fieldName>正确答案</fieldName> <fieldName>是否可用</fieldName> <fieldName>所添加用户</fieldName> <fieldName>所添加时间</fieldName> <fieldName>备注</fieldName> <fieldName>Other1</fieldName> <fieldName>Other2</fieldName> </TEB_DXYY_JDT> </users>
2.web页面显示数据。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ include file="/page/common/common.jsp"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <meta name="Author" content="[email protected]" /> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> <title>网站后台登陆</title> <!--CSS导入的公共css文件--> <link href="/gxpt_web_ks_examstudent/css/admin.content.css" rel="stylesheet" type="text/css" /> <link href="/gxpt_web_ks_examstudent/css/popupFrame.css" rel="stylesheet" type="text/css" /> <link href="/gxpt_web_ks_examstudent/css/admin.global.css" rel="stylesheet" type="text/css" /> <link href="/gxpt_web_ks_examstudent/css/admin.index.css" rel="stylesheet" type="text/css" /> <link href="/gxpt_web_ks_examstudent/css/admin.login.css" rel="stylesheet" type="text/css" /> <!--JS导入的公共js文件--> <!-- <script src="/gxpt_web_ks_examstudent/js/jquery-1.4.2.min.js" type="text/javascript">--> <script src="/gxpt_web_ks_examstudent/js/jquery.utils.js" type="text/javascript"></script> <script src="/gxpt_web_ks_examstudent/js/admin.js" type="text/javascript"></script> <script src="/gxpt_web_ks_examstudent/js/popupFrame.js" type="text/javascript"></script> <script src="/gxpt_web_ks_examstudent/js/Operation.js" type="text/javascript"></script> <script src="/gxpt_web_ks_examstudent/js/myjs.js" type="text/javascript"></script> <script src="/gxpt_web_ks_examstudent/js/ajaxjs.js" type="text/javascript"></script> <script type="text/javascript"> //页号 var pageNo; nowPageNo = 2; //表名 var realTableName; realTableName=""; //英文字段名对应的中文名称 var realField; realField=""; //英文字段名 var engField; engField=""; // 查询出题库 function queryCourse(){ var obj =document.getElementById("college"); var index = obj.selectedIndex; // 读取所选中option的索引值 var text = obj.options[index].text; // 读取所选中option的文本 var value = obj.options[index].value; // 读取所选中option的value var revalue = value.replace(/\s+/g,""); //将页号重置为1 nowPageNo = 1; //把表名赋值给全局变量 realTableName= revalue; readAllFields('/gxpt_web_ks_examstudent/myxml/questionStyle.xml',revalue); } //上一页 function upPage(){ var upPageNo; upPageNo = nowPageNo-1; if(upPageNo < 1){ firstPage(); upPageNo=1; }else{ nowPageNo = nowPageNo - 1; } var downPageLable = document.getElementById("upPage"); downPageLable.href="/gxpt_web_ks_examstudent/examStudent/DownPageAction.action?parm=" + realField + "&&tableName=" + realTableName + "&&pageNo=" + upPageNo + "&&engFields=" + engField; } function firstPage(){ alert("已经是第一页"); } //下一页 function downPage(){ var downPageNo; downPageNo = nowPageNo + 1; nowPageNo = nowPageNo + 1; var downPageLable = document.getElementById("downPage"); downPageLable.href="/gxpt_web_ks_examstudent/examStudent/DownPageAction.action?parm=" + realField + "&&tableName=" + realTableName + "&&pageNo=" + downPageNo + "&&engFields=" + engField; } function readAllFields(xmlName,nodeName){ var fields; fields=""; //***************NEW var my_array = new Array(); //加载xml文件 xmlDoc=loadXMLDoc(xmlName,nodeName); var d = xmlDoc.getElementsByTagName(nodeName); engField = d[0].getAttributeNode("engField").nodeValue; for(var i=0;i<d.length;i++){ var m = d[i].childNodes; my_array.push(d[i].childNodes[0].nodeValue); for(var k=0;k<m.length;k++){ if (m[k].nodeName != "#text") { my_array.push(m[k].childNodes[0].nodeValue); fields =fields + m[k].childNodes[0].nodeValue+","; } } } realField = fields; var lianjie; lianjie = document.getElementById("SpecifyQuestion"); lianjie.href="/gxpt_web_ks_examstudent/examStudent/DownPageAction.action?parm=" + realField + "&&tableName=" + nodeName + "&&pageNo=1&&engFields=" + engField; } </script> </head> <body > <!-- <form id="form1" action="${contextPath }/examStudent/QueryStudentInfo.action" target="navTab" rel=""> --> <form id="form1" action="${contextPath }/examStudent/SpecifyStuInfo.action" target="ajax" rel="jbsxBox"> <div class="container"> <div class="location">当前位置:考生管理-> 查询考生信息</div> <div class="blank10"></div> <div class="search block" padding-top="1000"> <div class="h" > <!-- <span class="icon-sprite icon-magnifier"></span> --> <table> <tr> <td height="10"></td> </tr> <tr border-top="100"> <td width="30"> <img alt="搜索" src="/gxpt_web_ks_examstudent/images/admin/search.png" ></td> <td ><h2 >快速搜索</h2></td> </tr> </table> </div> <div class="tl corner"></div><div class="tr corner"></div><div class="bl corner"></div><div class="br corner"></div> <div class="cnt-wp" > <div class="cnt" > <div class="search-bar"> <table style="width:95%"> <tbody> <tr> <td width="50"> <div id="Dep"> <label class="first txt-green">请选择试题:</label> </div> </td> <td width="100"> <select id="college" onclick="readAllColleges('${contextPath }/myxml/questionStyle.xml','tableName')" onchange="queryCourse()"> <option value="select" >请选择</option> </select> </td> <td width="50"> <div style="float: right"> <table> <tbody> <tr> <td align="center"> <div class="pageContent" style="padding:5px"> <div class="divider"></div> <div class="tabs"> <div> <a id="SpecifyQuestion" target="ajax" rel="jbsxBox"><b><font color="#456B0A">检索</font></b></a> </div> </div> </div> </td> </tr> </tbody> </table> </div> </td> </tr> </tbody> </table> </div> </div> </div> </div> <div class="cnt-wp" > <div class="cnt" > <div id="tableDiv"> </div> <div id="jbsxBox" class="unitBox" > </div> </div> </div> </div> </form> </body> </html>3.action实现真分页
public List upPage(String tableName, int pageNo,String fields) { String thisPageNo1 = String.valueOf((pageNo - 1) * 10); String thisPageNo2 = String.valueOf(pageNo * 10); StringBuffer myBuffer = new StringBuffer(); //组织sql语句 String execuSql = myBuffer.append("select " + fields) .append(" from ") .append(" ( ") .append(" select rownum rn, " + fields) .append(" from ") .append(" ( ") .append("select " + fields +" from " + tableName ) .append(")") .append("where rownum <=" + thisPageNo2 ) .append(")") .append("where rn > " + thisPageNo1) .toString(); List list =(List) iCommonEao.executeGetNativeSQL(execuSql); return list; }