DDR爱好者之家 Design By 杰米

做查询页面,查询条件比较多的时候往往会涉及到级联。举个简单的例子,拿教务系统来说,我们要查询教学计划信息,查询条件是入学批次、学生层次(专升本、高升专)、专业、课程。

它们之间有什么级联关系呢?入学批次影响学生层次(某个入学批次可能只有专升本或者高升专一个学生层次)、专业、课程,学生层次影响专业、课程,专业又影响课程。也就是说当选择入学批次时,学生层次、专业和课程的下拉框会局部刷新,选择学生层次时,专业和课程的下拉框会局部刷新,选择专业时,课程的下拉框也会局部刷新。

我们当然不希望已经选择的操作随着页面的刷新又被初始化,再者前面提到选择一项后相关的下拉框是局部刷新。很容易想到用填充页面的方法来实现级联。

笔者的填充方法是通过提交JS,由Controller获取数据,将数据传到辅助的JSP页面,再用回调函数将辅助JSP页面中的数据填充给相应下拉框。说的抽象,直接上代码了,四级级联稍微麻烦一些,知道原理后也好做,笔者上三级级联的代码。级联样式如下图:

JSP页面中如何用select标签实现级联

 JSP页面代码:
复制代码 代码如下:
   <table>
    <tr>
     <td width="400px" align="left">入学批次:<SELECT NAME="grade"
      id="grade" onchange="refreshEduLevelAndSpecialAjax();">  //选择入学批次会刷新层次和专业
       <OPTION VALUE="0">
        --请选择--
        <c:forEach items="${gradeInfo}" var="gradeInfo">
         <OPTION VALUE="${gradeInfo.gradeName}">${gradeInfo.gradeName}        
        </c:forEach>
     </SELECT></td>
     <td width="400px" align="left">统考课程:<SELECT
      NAME="uniExamCourseId" id="uniExamCourseId">
       <OPTION VALUE="0">
        --请选择--
        <c:forEach items="${unifiedExamCourseList}" var="uniExamCourse">
         <OPTION VALUE="${uniExamCourse.id}">${uniExamCourse.uniExamCourseName}        
        </c:forEach>
     </SELECT></td>
    </tr>
    <tr>
     <td colspan="2" id="refreshEduLevelAndSpecialAjax">    //设置ID,用于填充层次和专业的下拉框
      <table>
       <tr>
        <td width="400" align="left">层&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;次:<SELECT
         NAME="eduLevelId" id="eduLevelId"
         onchange="refreshSpecialAjax();">    //选择层次后刷新专业
          <OPTION VALUE="0">--请选择--</OPTION>
          <c:forEach items="${educationLevel}" var="educationLevel">
           <OPTION VALUE="${educationLevel.id}">${educationLevel.educationLevelName}          
          </c:forEach>
        </SELECT></td>
        <td width="400" align="left" id="refreshSpecialAjax">专&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;业:<SELECT            //设置ID,用于填充专业的下拉框
         NAME="specialId" id="specialId">
          <OPTION VALUE="0">--请选择--</OPTION>
          <c:forEach items="${specialList}" var="special">
           <OPTION VALUE="${special.id}">${special.specialName}          
          </c:forEach>
        </SELECT></td>
       </tr>
      </table>
     </td>
    </tr>
   </table>

JS的代码如下:
复制代码 代码如下:
//JavaScript Document
 var xmlHttp; //用于保存XMLHttpRequest对象的全局变量
 //用于创建XMLHttpRequest对象
 function createXmlHttp() {
  //根据window.XMLHttpRequest对象是否存在使用不同的创建方式
  if (window.XMLHttpRequest) {
   xmlHttp = new XMLHttpRequest(); //FireFox、Opera等浏览器支持的创建方式
  } else {
   xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE浏览器支持的创建方式
  }
 }
 function refreshEduLevelAndSpecialAjax() {
  var grade = document.getElementById("grade").value;
  refreshEduLevelAndSpecial(grade);
 }
 function refreshEduLevelAndSpecial(grade) {
  createXmlHttp(); //创建XMLHttpRequest对象
  xmlHttp.onreadystatechange = refreshEduLevelAndSpecialElement; //设置回调函数
  xmlHttp.open("POST", "eduLevelAndSpecialByGradeNameInSpecialDetail",
    true); //发送POST请求
  xmlHttp.setRequestHeader("Content-type",
    "application/x-www-form-urlencoded");
  xmlHttp.send("grade=" + grade);
 }
 //处理服务器返回的信息 更新层次专业下拉框
 function refreshEduLevelAndSpecialElement() {
  if (xmlHttp.readyState == 4) {
   if (xmlHttp.status == 200) {
    //此处xmlHttp.responseText是请求的*Controller的某个方法返回的渲染页面的源代码
    document.getElementById("refreshEduLevelAndSpecialAjax").innerHTML = xmlHttp.responseText;
   }
  }
 }
 function refreshSpecialAjax() {
  var grade = document.getElementById("grade").value;
  var eduLevelId = document.getElementById("eduLevelId").value;
  refreshSpecial(grade, eduLevelId);
 }
 function refreshSpecial(grade, eduLevelId) {
  createXmlHttp(); //创建XMLHttpRequest对象
  xmlHttp.onreadystatechange = refreshSpecialElement; //设置回调函数
  xmlHttp.open("POST", "specialByGradeNameAndEduLevelIdInSpecialDetail",
    true); //发送POST请求
  xmlHttp.setRequestHeader("Content-type",
    "application/x-www-form-urlencoded");
  xmlHttp.send("grade=" + grade + "&eduLevelId=" + eduLevelId);
 }
 //处理服务器返回的信息 更新专业下拉框
 function refreshSpecialElement() {
  if (xmlHttp.readyState == 4) {
   if (xmlHttp.status == 200) {
    //此处xmlHttp.responseText是请求的*Controller的某个方法返回的渲染页面的源代码
    document.getElementById("refreshSpecialAjax").innerHTML = xmlHttp.responseText;
   }
  }
 }

Controller代码:
复制代码 代码如下:
@RequestMapping(value = "/eduLevelAndSpecialByGradeNameInSpecialDetail")
  public ModelAndView getEduLevelAndSpecialByGradeNameInSpecialDetail(HttpServletRequest request,
    HttpServletResponse response) throws JsonParseException, JsonMappingException, JSONException, IOException{  
   String gradeName=request.getParameter("grade");    
   String eduLevelId=request.getParameter("eduLevelId");  
   if(gradeName==null||gradeName.equals("0")){   
    gradeName="null";
   }
   if(eduLevelId==null||eduLevelId.equals("0")){   
    eduLevelId="null";
   }
   ArrayList<UtilObject> eduLevelList=uess.getEduLevelIdByGradeNameInSpecialDetail(gradeName);
   ArrayList<UtilObject> specialIdList=uess.getSpecialIdByGradeNameAndEduLevelIdInSpecialDetail(gradeName, eduLevelId);  
   mav.addObject("educationLevel", eduLevelList);
   mav.addObject("specialList", specialIdList);
   mav.setViewName("scoreManage/uniExamScore/eduLevelAndSpecialAjax");
   return mav;
  }
  @RequestMapping(value = "/specialByGradeNameAndEduLevelIdInSpecialDetail", method = RequestMethod.POST)
  public ModelAndView getSpecialByGradeNameAndEduLevelIdInSpecialDetail(HttpServletRequest request,
    HttpServletResponse response) throws JsonParseException, JsonMappingException, JSONException, IOException{
   String gradeName=request.getParameter("grade"); 
   String eduLevelId=request.getParameter("eduLevelId");
   System.out.println("grade:"+gradeName+"  eduLevelId:"+eduLevelId);
   if(gradeName==null||gradeName.equals("0")){   
    gradeName="null";
   }
   if(eduLevelId==null||eduLevelId.equals("0")){   
    eduLevelId="null";
   }
   ArrayList<UtilObject> specialList=uess.getSpecialIdByGradeNameAndEduLevelIdInSpecialDetail(gradeName, eduLevelId);  
   mav.addObject("specialList", specialList);
   mav.setViewName("scoreManage/uniExamScore/specialAjax");
   return mav;
  }

后台代码没有给出来,但应该看得懂,就是获取后台数据传到eduLevelAndSpecialAjax.jsp和specialAjax.jsp页面。这两个页面用于填充原页面,通过ID来填充相应区域,两个页面代码如下。
eduLevelAndSpecialAjax.jsp辅助页面:
复制代码 代码如下:
<td id="refreshEduLevelAndSpecialAjax">    //ID用于填充原页面
    <table>
    <tr>
     <td width="400px" align="left">层&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;次:<select
      id="eduLevelId" name="eduLevelId" onchange="refreshSpecialAjax();">
       <option value="0">--请选择--</option>
       <c:forEach items="${educationLevel}" var="educationLevel">
        <option value="${educationLevel.id}">${educationLevel.name}</option>
       </c:forEach>
     </select></td>
     <td width="400px" align="left" id="refreshSpecialAjax">专&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;业:<SELECT                               //ID用于填充原页面
      NAME="specialId" id="specialId">
       <option value="0">--请选择--</option>
       <c:forEach items="${specialList}" var="special">
        <OPTION VALUE="${special.id}">${special.name}
       </c:forEach>
     </SELECT></td>
     </tr>
    </table>
   </td>

specialAjax.jsp辅助页面:
复制代码 代码如下:
<td width="400" align="left" id="refreshSpecialAjax">专&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;业:<SELECT
    NAME="specialId" id="specialId">    //ID用于填充原页面
     <option value="0">--请选择--</option>
     <c:forEach items="${specialList}" var="special">
      <OPTION VALUE="${special.id}">${special.name}
     </c:forEach>
   </SELECT></td>

这样就在JSP页面实现了填充。

DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。