导航结构图:
关键问题的解决方法描述:
1. 创建新主题的时候,可以输入多个投票选项,选项的个数是不定的,所以需要要动态的获取用户输入的选项。解决的方法是利用页面的局部刷新为用户动态生成投票选项输入框。为用户提供一个选项添加按钮,当用户需要添加输入投票选项的时候就可以按按钮生成一个选项输入框。
2. 投票的选项的数量是不确定,这些数据都需要保存进数据库,如何为数据库建表,建表的字段又该怎么建立。解决这个问题的方法是将每一个投票主题的所有选项都用同一个字段保存。将每一个选项的内容全部放在一起,用自己定义的分隔符分开,然后保存在同一个字段里,这样就解决了投票选项个数不确定,但依旧可以保存进数据库的问题。
3. 用户设置的投票方式:单选或多选。解决这个问题的方法是只允许单选的投票用单选框提供给用户投票,允许多选的投票提供复选框给用户投票。当要获取用户投票的数据时,遍历所有的选项,对有所有被选中的单选框或是复选框进行记录。
4. 开启和关闭一个投票。解决这个问题的方法是在数据库中为每一个主题创建一个字段用于记录该主题是否允许投票。该字段只有2个值:0和1。当取值为0时,不允许投票,只允许查看,当取值为1时允许投票。
核心代码:
客户端页面局部刷新JavaScript:
function createRequest(url,theme,q){ var index="div_vote0"+q; //alert(index); http_request = false; if(window.XMLHttpRequest){ http_request = new XMLHttpRequest(); }else if(window.ActiveXObject){ try{http_request = new ActiveXObject("Msxml2.XMLHTTP");}catch(e){try{ http_request = new ActiveXObject("Microsoft.XMLHTTP");} catch(e){ } } } if(!http_request){ alert("cannt"); return false; } http_request.onreadystatechange=function(){getResult(index);}//getResult; http_request.open('POST',url,true); http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); http_request.send("theme="+theme); } //查看 function getResult(index){ var t1=index+"1"; var t2=index+"2"; if(http_request.readyState==4){ if(http_request.status==200){ document.getElementById(index).innerHTML=http_request.responseText; document.getElementById(t1).innerHTML = " "; document.getElementById(t2).innerHTML = ""; }else{ document.getElementById("div_vote0").innerHTML="操作失败!"; document.getElementById(t1).innerHTML = " "; document.getElementById(t2).innerHTML = ""; } } } function abc(index){ var t1=index+"1"; var t2=index+"2"; document.getElementById(index).innerHTML = ""; document.getElementById(t1).innerHTML = ""; document.getElementById(t2).innerHTML = ""; }
在Servlet里向数据库中添加数据:
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ String data = new String(request.getParameter("mydata").getBytes("iso-8859-1"),"utf-8"); String radio = request.getParameter("theme_radio"); int theme_radio = Integer.parseInt(radio); String[] str = data.split("="); String[] temps =str[1].split(","); String temp=""; for(int i=0;i主题为\""+str[0]+"\"的投票添加成功!"); wout.flush(); wout.close(); }
在Servlet里验证用户登录:
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ String code = (String)request.getSession().getAttribute("validate_code"); String sql = "select * from data"; String user = request.getParameter("name").toString(); String pwd = request.getParameter("pwd").toString(); String mycode = request.getParameter("code"); String dbuser=""; String dbpwd = ""; boolean flag1=false; if(code.equals(mycode)) flag1=true; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ int i = rs.getInt("able"); if(i==3){ dbuser = rs.getString("theme"); dbpwd = rs.getString("temp"); break ; } } rs.close(); stmt.close(); } catch (SQLException ex) { Logger.getLogger(IndexServlet.class.getName()).log(Level.SEVERE, null, ex); } if(!flag1){ String message = "验证码不正确!"; request.setAttribute("message", message); request.getRequestDispatcher("login.jsp").forward(request, response); } if(user.equals(dbuser)&&pwd.equals(dbpwd)){ request.getRequestDispatcher("job.jsp").forward(request, response); } else { String message = "
用户名或密码不正确!"; request.setAttribute("message", message); request.getRequestDispatcher("login.jsp").forward(request, response); } }
在Servlet里处理投票:
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException{ String theme = new String(request.getParameter("theme").getBytes("iso-8859-1"),"utf-8"); String votes = new String(request.getParameter("votes").getBytes("iso-8859-1"),"utf-8"); String sql = "select * from votes"; String temp=""; String IPAddr = getIpAddr(request); //获得IP int sum = 0; boolean ipFlag = false; if(votes==null||votes.equals("")) { return ; } int newtime = getDate(); //获得当前时间 PreparedStatement ps; try { stmt = conn.createStatement(); //===================================== ResultSet rs = stmt.executeQuery(sql); sql = "select * from ipaddr"; rs = stmt.executeQuery(sql); String themes=""; while(rs.next()){ String ipAddr = rs.getString("ip"); if(ipAddr.equals(IPAddr)){ themes = rs.getString("themes"); int oldtime = rs.getInt("time"); sum = newtime - oldtime; ipFlag = true; break; } } rs.close(); if(!ipFlag){ //如果ip不存在 sql = "insert into ipaddr(ip,time,themes) values(?,?,?)"; ps = conn.prepareStatement(sql); ps = conn.prepareStatement(sql); ps.setString(1, IPAddr); ps.setInt(2, newtime); ps.setString(3, theme+","); int row = ps.executeUpdate(); ps.close(); }else if(!findTheme(themes,theme)) { if(themes==null) themes=""; ipFlag=false; sql = "update ipaddr set themes=? where ip=?"; ps = conn.prepareStatement(sql); String mythemes = themes+theme+","; ps.setString(1, mythemes); ps.setString(2, IPAddr); ps.executeUpdate(); ps.close(); }else { ipFlag = true; } sql = "select * from votes"; rs = stmt.executeQuery(sql); while(rs.next()){ String theme1 = rs.getString("theme"); if(theme1.equals(theme)){ temp = rs.getString("temp"); break; } } temp = deal(temp,votes); //获取数据 sql = "update votes set temp=? where theme=?"; ps = conn.prepareStatement(sql); ps.setString(1, temp); ps.setString(2, theme); ps.executeUpdate(); ps.close(); } catch (SQLException ex) { Logger.getLogger(IndexServlet.class.getName()).log(Level.SEVERE, null, ex); } response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); PrintWriter wout = response.getWriter(); if(!ipFlag) wout.print("谢谢您的投票!
"); wout.flush(); wout.close(); }
系统测试截图
1 系统开始时的界面:
用户刚进入系统时的开始界面。用户可以查看系统已有的投票,也可以为其中的某个主题进行投票。
2 对其中的某个主题进行投票:
有些投票只允许单选,有些投票可以多选。
3 管理员登陆界面:
4 管理员权限界面:
只有管理员登陆后才可以执行的操作。
5 发起一个新的投票:
按添加项按钮可以动态添加需要的项目。
6 管理开启关闭投票:
7 用户名和密码修改: