《计算机专业课程设计在线投票系统.docx》由会员分享,可在线阅读,更多相关《计算机专业课程设计在线投票系统.docx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 - -myeclipse、jSP,数据库开发环境1、开发环境 MyEclipse 简介MyEclipse 企业级工作平台MyEclipse Enterprise Workbench ,简称MyEclipse 是对 Eclipse IDE 的扩展,利用它我们可以在数据库和 J2EE 的开发、公布,以及应用程序效劳器的整合方面极大的提高工作效率。构造上,MyEclipse 的特征分为 7 类:1. J2EE 模型2. WEB 开发工具3. EJB 开发工具4. 应用程序效劳器的连接器5. J2EE 工程部署效劳6. 数据库效劳7. MyEclipse 整合帮助2、需求分析本系统是一个简洁的投票系
2、统,主要供给以下功能:系统首页上显示全部投票选项的列 表,用户可以通过选中某个选项并点击“投票”按钮进展投票操作。另外,还供给查看投票具体信息的超链接,用户点击后可在另一页面上看到各个投票选工程前的投票状况,主要包括各选项所得的票数、占总票数的百分比等信息,并且以柱形图显示各选项的得票率,可以让用户从直观上看到各项的得票状况3、系统设计4、设计1开发平台:Microsoft Windows XP Professional 版本 2023 Service Pack 3开发工具:MyEclipse 在线投票系统功能:功能 1:投票功能 2:查看投票功能 3:对同一 IP 地址的用户重复投票的限制2
3、实现该系统可划分为三个模块:显示投票选项,参与投票和显示投票结果。下面来分别介绍。投票界面:- -4.2.1 数据表的设计本系统设计了两张表,表 tb-temp 保存投票用用户信息,表 tb-vote 保存投票选项信息。表 tb-temp字段名数据类型字段大小是否为主键IdInt4是VoteipChar20VotemselBigint8VotetimeChar表 tb-vote50字段名数据类型字段大小是否为主键IdSmallint2是Vote_titleChar50Vote_numInt4Vote_orderSmallint2值 javabean的设计建一个值 JavaBean 用来封装存储
4、表 tb-temp 中的投票选项信息,代码如下:package com.yxq.valuebean;public class VoteSingle private String id;/存儲選項ID- -private String title;/存儲選項標題private String num;/存儲選項所得票數private String order;/存儲選項的排列序號public String getId return id;public void setId(String id) this.id = id;public String getNum return num;public
5、void setNum(String num) this.num = num;public String getOrder return order;public void setOrder(String order) this.order = order;public String getTitle return title;public void setTitle(String title) this.title = title;同样建另一个值 JavaBean 用来封装存储表 tb-vote 中的信息:package com.yxq.valuebean;public class Temp
6、Single private String id;/存儲投票用戶ID private String voteIp ;/存儲投票用戶IP private long voteMSEL ;/存儲毫秒數private String voteTime ;/存儲yyyy-MM-dd HH :mm :ss形式的時間public long getVoteMSEL return voteMSEL ;public void setVoteMSEL( long voteMSEL) this.voteMSEL = voteMSEL; - -public String getVoteTime return voteTi
7、me ;public void setVoteTime(String voteTime) this.voteTime = voteTime;public String getId return id;public void setId(String id) this.id = id;public String getVoteIp return voteIp ;public void setVoteIp(String voteIp) this.voteIp = voteIp;数据库操作类的编写对于查看投票内容,参与投票和显示结果的操作,都涉及了数据库的操作。这些操作在一个DB 类中实现,具体代码
8、入下: 定义属性及构造方法package com.yxq.toolbean;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List;import com.yxq.valuebean.TempSingle; import com.yxq.valuebean.VoteSingle;public class DB private St
9、ring className;/存儲數據庫驅動類路徑private String url;/存儲數據庫 URLprivate String username;/存儲登陸數據庫的用戶名 - -private String password;/存儲登陸數據庫的密碼private Connection con;/聲明一個 Connection 對象private Statement stm;/ 聲明一個Statement 對象用來執行 SQL 語句private ResultSet rs;/聲明一個 ResultSet 對象用來存儲結果集public DB /通過構造方法為屬性賦值className
10、 = “org.apache.derby.jdbc.ClientDriver“; url = “jdbc:derby:/localhost:1527/myeclipse“; username = “classiccars“;password = “classiccars“;/* 功能 加载数据库驱动程序*/public void loadDrive try Class.forName(className);/加載數據庫驅動程序 catch (ClassNotFoundException e) System.out.println(“加载数据库驱动程序失败!“);e.printStackTrac
11、e;/向掌握臺輸出提示信息/*猎取数据库连接* 功能*/public void getCon loadDrive; /加載數據庫驅動程序try con = DriverManager.getConnection(url, username, password);/獲取連接 catch (Exception e) System.out.println(“连接数据库失败!“); e.printStackTrace;/* 功能 猎取 Statement 对象*/public void getStm - -getCon;/獲取數據庫連接try stm = con.createStatement;/獲取
12、Statement 類對象 catch (Exception e) System.out.println(“猎取 Statement 对象失败!“); e.printStackTrace;/* 功能 查询数据表,猎取结果集*/public void getRs(String sql) getStm;try rs = stm.executeQuery(sql);/ 執行SQL 語句查詢數據表獲取結果集 catch (Exception e) System.out.println(“查询数据库失败!“); e.printStackTrace;/* 功能 查询数据表,猎取投票选项*/public L
13、ist selectVote(String sql) List votelist = null;if (sql != null & !sql.equals(“) getRs(sql);/查詢數據表獲取結果集if (rs != null) votelist = new ArrayList; try while (rs.next) /依次將結果集中的记录封装到 VoteSingle 类对象中VoteSingle voteSingle = new VoteSingle; voteSingle.setId(MyTools.intToStr(rs.getInt(1); voteSingle.setTit
14、le(rs.getString(2); voteSingle.setNum(MyTools.intToStr(rs.getInt(3);voteSingle.setOrder(MyTools.intToStr(rs.getInt(4); votelist.add(voteSingle);/将 VoteSingle 类对象存储到 List 集合中 catch (Exception e) System.out.println(“封装 tb_vote 表中数据失败!“); e.printStackTrace; finally - -closed;/关闭 数据库return votelist;/* 功
15、能 查询数据表,猎取指定 IP 最终一次投票的记录*/public TempSingle selectTemp(String sql) TempSingle tempSingle = null;if (sql != null & !sql.equals(“) getRs(sql);/查询数据表猎取结果集if (rs != null) try while (rs.next) /假设该结果集中有记录,说明当前用户投过票tempSingle = new TempSingle; tempSingle.setId(MyTools.intToStr(rs.getInt(1); tempSingle.set
16、VoteIp(rs.getString(2); tempSingle.setVoteMSEL(rs.getLong(3); tempSingle.setVoteTime(rs.getString(4); catch (Exception e) System.out.println(“封装 tb_temp 表中数据失败!“); e.printStackTrace; finally closed;/关闭数据库return tempSingle;/返回 TempSingle类对象中/* 功能 更数据表,实现票数累加*/public int update(String sql) int i = -1;
17、if (sql != null & !sql.equals(“) getStm;/猎取Statement 类对象try i = stm.executeUpdate(sql);/执行 SQL 语句更数据表 catch (Exception e) - -System.out.println(“更数据库失败!“); e.printStackTrace; finally closed;return i;/* 功能 关闭数据库连接*/public void closed try if (rs != null)rs.close;/关闭结果集if (stm != null)stm.close;/ 关闭Sta
18、tement 类对象if (con != null)con.close;/ 关闭数据库连接 catch (Exception e) System.out.println(“关闭数据库失败!“); e.printStackTrace;4.2.4 工具类的编写该系统涉及了类型的转换,计算时间差等操作,这些操作在一个类中实现,这样可以实现代码的重复使用。该工具类为 mytools,代码如下:package com.yxq.toolbean;import java.text.SimpleDateFormat; import java.util.Date;public class MyTools /*
19、功能 将 int 型数据转换为 String 型数据* 参数 num 为要转换的 int 型数据* 返回值 String 类型*/public static String intToStr(int num) return String.valueOf(num); - -/* 功能 比较时间。* 参数 today 当前时间,temp 为上次投票时间。这两个参数都是以毫秒显示的时间* 返回值 String 类型*/public static String compareTime(long today,long temp)int limitTime=60;/设置限制时 间为 60分钟long cou
20、nt=today-temp;/计算当前时间与上次投票时间相差的毫秒数(该结果肯定是大于等于 0) if(count=limitTime*60*1000)/假设相差小于等于 60 分钟(1 分=60 秒,1 秒=1000 毫秒) return “no“;else/假设相差大于 60 分钟/*return “yes“;* 功能 格式化时间为指定格式。首先通过 Date 类的构造方法依据给出的毫秒数猎取一个时间,然后将该时间转换为指定格式,如“年-月-日 时:分:秒“* 参数 ms 为毫秒数* 返回值 String 类型*/public static String formatDate(long m
21、s) Date date=new Date(ms);SimpleDateFormatformat=newSimpleDateFormat(“yyyy-MM-dd HH:mm:ss“);String strDate=format.format(date);return strDate;显示投票选项的设计当用户访问首页面后,单击“参与投票”就会进入 vote.jsp 页面显示投票选项,在该页面中先要查询 tb_vote 数据表猎取全部的投票选项,然后逐一显示投票选项的标题在线投票没有选项可显示!%int i=0;while(iinput type=“radio“ name=“ilike“ valu
22、e=“票!i+;/while 完毕留意事项:1小时内只能投一次 &nb sp;- -参与投票的设计%String mess=“;/用来保存提示信息String selectId=request.getParameter( “ilike“ );if(selectId= null|selectId.equals( “)选项/猎取用户选择/没有选择投票mess=“请选择投票!“;elseboolean mark= false;投票的标志/选择了投票选项/是否允许long
23、today=( new Date).getTime;/new Date 猎取当前时间,通过调用Date类的getTime 方法猎取从1970年1月1 日00:00:00 起到当前时间的毫秒数long last=0;/上次投票的时间(以毫秒显示)String ip=request.getRemoteAddr;用户IP地址/猎取String sql=“SELECT * FROM app.tb_temp WHERE voteMSEL = (SELECT MAX(voteMSEL) FROM tb_temp WHERE voteIp=”“ +ip+“”)“; /SQL语句,功能:从数据表中猎取当前用户
24、上次投票时的记录TempSingle single=myDb.selectTemp(sql);if(single= null) tb_temp 表中不存在当前IPmark=true;投票else推断从上次投票到现在是否超过指定时间,本系统指定为 60分钟last=single.getVoteMSEL;JavaBean 中猎取上次投票的时间( 以毫秒显示)String result=MyTools pareTime(today,last);将现在时间与上次投票时的时间进展比较if(result.equals( “yes“)/在/允许/存在当前IP,则/从该/- -返回“yes“,表示时间差已超过
25、 60分钟,允许投票mark=true;else/否则,不允许投票mark=false;String strTime=MyTools.formatDate(today);前投票时间(以毫秒显示的)转为“ 年-月-日 时: 分:秒“ 的形式if(mark)/* 【1】记录用户IP和投票时间 */ sql=“insert into tb_tempvalues(”“ +ip+“”,”“+today+ “”,”“+strTime+ “”)“;int i=myDb.update(sql);/将当/允许投票IP失败IP成功/* 【2】推断记录用户IP是否成功 */if(i0)mess=“投票生效! “ ;
26、else/更失败elsemess=“投票失败!“;/不允许投票mess=“对不起,通过推断您的IP,您已经投过票了! 上次投票时间: “+single.getVoteTime+ “60 分钟之内不允许再进展投票! “;session.setAttribute( “mess“ ,mess);到session 范围内response.sendRedirect( “messages.jsp“ );到messages.jsp 页面,进展提示%/保存提示信息/将恳求重定向- -查看结果的设计先编写猎取投票选项代码: 显示投票结果代码在线投票没有选项可显示!%else int i=0;while(i 票 没有选项可显示!%/计算图片长度else int i=0;while(iimg src=“images/count.jpg“ width=“ height =“15“ alt=“影片:“- -%