用HttpSession实现最先显示<select>中被选中的项

使用Session保持JSP下拉框选中状态
本文介绍如何利用Session在JSP页面间保持下拉选择框的选中状态,确保用户的选择能够在不同页面间得到保留,提供更好的用户体验。

1.背景:

我们都知道<select>控件是下拉选择框,在JSP中当我们选中其中某一项提交后,被选中的值会提交到Servlet类里进行处理。而当再返回某个跟提交页类似的页时,页面上有个同样的<select>,选择框里的几项是从数据库里某个表读出来的,这时不用HttpSession加以处理,select控件中的值的顺序还是数据库那个表里的顺序,而不是我们选择的那个值了,下面就让我们来解决这个问题吧。

2.Session解决:

表单1:

<% 
            	DBManager db=new DBManager();
                String sql="select * from s";
                ResultSet rs=db.executeQuery(sql);
            	
            %>
            	<form action="Servlet" method="post">
            	<div class="e"><select name="E">
            	<%
            	while(rs.next()){
            	String securityName=rs.getString("name");
            	out.println("<option value='"+Name+"'>"+Name+"</option>");
            	}
            	 %>
            	 </select><select name="TimeSelect">
	            	 <option value="1 hour">1 hour</option>
	            	 <option value='1 year'>1 week</option>
	            	 <option value='1 year'>1 month</option>
	            	 <option value='1 year'>1 year</option>
            	 </select>
            	 <input type='submit' class="btnIconLeft mr10" value='查询' />
            	 
            	 </div>
            </form>
            <%
             	if(rs!=null)
        		 rs.close();
        		 db.closeCon();
            	
             %>

表单1将两个<select>控件被选的值提交到Servlet类里进行进一步处理,在servlet类里将表单1里选好的两项分别置到Session里,处理完了后跳转到表单2.

表单2:

<form action="Servlet" method="post">
            	<div class="e"><select name="E">
            	<%
            	HttpSession Session=request.getSession();
            	String name=(String)Session.getAttribute("name");//Session中取出在表单1里第一个<select>选好的选项
            	String time=(String)Session.getAttribute("time");
            	out.println("<option value='"+name+"'>"+name+"</option>");//先输出表单1里选好的
            	while(rs.next()){
            	String securityName=rs.getString("name");
     			if(securityName.equals(name))//读数据库,如果是Session里的,则跳过
     			continue;     
            	out.println("<option value='"+Name+"'>"+Name+"</option>");
            	}
            	 %>
            	 </select>           	 
            	 <select name="TimeSelect">
            	 	<%
            	 	   out.println("<option value='"+time+"'>"+time+"</option>");
            	 	   if(!"1 hour".equals(time))
            	 	   out.println("<option value='1 hour'>1 hour</option>");
            	 	   if(!"1 week".equals(time))
            	 	   out.println("<option value='1 week'>1 week</option>");
            	 	   if(!"1 month".equals(time))
            	 	   out.println("<option value='1 month'>1 month</option>");
            	 	   if(!"1 year".equals(time))
            	 	   out.println("<option value='1 year'>1 year</option>");
            	 	 %>
            	 	
            	 </select>
            	 <input type='submit' class="btnIconLeft mr10" value='查询' />
            	 
            	 </div>
</form>

注:

表单1里有两个<select>和一个提交按钮,并且第一个select元素的选项是从某个数据库的表里选出来的。当我们选好这两项后点击提交,到Servlet类里进行处理,将在表单1里选好的两项置到Session中,处理完毕后跳转到表单2。这时,为了让表单2最先显示我们在表单1里选择的那两项,就采取了Session的方法。即从Session中拿出这两个选项,先输出,然后while循环里读数据库的那些如果有Session里那项就continue跳过。


<%@ page contentType="text/html;charset=UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>班级列表</title> </head> <body> <h3>班级列表</h3> <a href="addClass.jsp">添加班级</a> <table border="1"> <tr> <th>班级名称</th> <th>操作</th> </tr> <c:forEach var="cls" items="${classist}"> <tr> <td>${cls.cname} (ID: ${cls.cid})</td> <td> <a href="chooseTerm.jsp?cid=${cls.cid}">查看成绩</a> <a href="Student?cid=${cls.cid}">查看学生</a> </td> </tr> </c:forEach> </table> </body> </html> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <c:forEach var="gls" items="${gradeList}"> <tr> <td>${gls.term} (${gls.gid})</td> <td> <a href="ShowGrade?cid=${gls.gid}&term=第一学期">查看第一学期成绩</a><br> <a href="ShowGrade?cid=${gls.gid}&term=第二学期">查看第二学期成绩</a><br> <a href="ShowGrade?cid=${gls.gid}&term=第三学期">查看第三学期成绩</a><br> <a href="ShowGrade?cid=${gls.gid}&term=第四学期">查看第四学期成绩</a> </td> </tr> </c:forEach> </body> </html> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>成绩列表</title> </head> <body> <h3>班级ID:${cid} | 学期:${term}</h3> <table border="1"> <tr> <th>学生姓名</th> <th>数学</th> <th>语文</th> <th>英语</th> </tr> <c:forEach var="grade" items="${gradeList}"> <tr> <td>${grade.studentName}</td> <td>${grade.math}</td> <td>${grade.chinese}</td> <td>${grade.english}</td> </tr> </c:forEach> </table> <br> <a href="javascript:history.back()">返回</a> </body> </html> @RequestMapping("/ShowGrade") public ModelAndView showGrade(HttpSession session, String term, ModelAndView mv) { Integer cid = (Integer) session.getAttribute("cid"); List<Map<String, Object>> gradeList = gradeService.getGradeByTerm(cid, term); mv.addObject("gradeList", gradeList); mv.addObject("term", term); mv.addObject("cid", cid); mv.setViewName("ShowGrade.jsp"); return mv; }<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.buka.dao.GradeDao"> <resultMap id="grade" type="com.buka.po.Grade"> <result property="name" column="name"></result> <result property="term" column="term"></result> <result property="math" column="math"></result> <result property="chinese" column="chinese"></result> <result property="English" column="English"></result> <result property="sid" column="sid"></result> <association property="cid" javaType="com.buka.po.Student"> <id property="cid" column="cid"></id> </association> </resultMap> <insert id="addGrade" parameterType="com.buka.po.Grade"> INSERT INTO grade (gid, term, sid, math, chinese, English) VALUES (#{gid}, #{term}, #{sid}, #{math}, #{chinese}, #{English}) </insert> <select id="getGradeByTerm" resultMap="grade"> SELECT s.name AS studentName, g.math AS math, g.chinese AS chinese, g.English AS english, g.term AS term, s.cid AS cid FROM grade g INNER JOIN student s ON g.sid = s.sid WHERE s.cid = #{cid} AND g.term = #{term} ORDER BY s.name </select> </mapper>我该如何解决cid无法在页面中传的问题
09-18