《WEB应用与开发》在线投票系统课程设计报告.doc
-
资源ID:2389609
资源大小:114KB
全文页数:14页
- 资源格式: DOC
下载积分:8金币
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
《WEB应用与开发》在线投票系统课程设计报告.doc
HUNAN CITY UNIVERSITY WEB应用与开发课程设计报 告设计题目: 在线投票系统 专 业: 信息管理与信息系统 学生姓名: XXXX 班级学号: XXXXX 分组成员: XXXXXXXXXXXXXXXXXXXXXXX 指导教师: XXXXXXXXXXXXXX 2012 年06月08日WEB应用与开发课程设计报告XX一、设计时间 2012年6月 04日-6月08日总的设计时间为1周, 第17周。具体安排如下:1、分析设计准备阶段(第17周周一至周二) 2、编程调试阶段(第17周周三至第17周周四) 3、书写设计报告和书写说明书阶段(第17周周五) 4、考核阶段(第17周周五) 二、设计地点 信息科学与工程学院机房(新校区510机房)三、设计目的通过对一些实际问题的软件设计,,巩固学习java基础知识方面的基本算法,进一步熟悉基本概念。使学生能将课本的理论知识应用于实践,运用所用学的JSP语言知识编制出较为实用的小系统,培养学生查阅资料的习惯,提高学生独立思考和解决问题的能力。四、设计小组成员 XXXXXXXXXXXXXXXXXXXXXX五、指导老师 XXXXXXXXXXXXXXXXXX六、设计课题 在线投票系统 七、基本思路及关键问题的解决方法1、基本思路 本系统是一个简单的投票系统,主要提供以下功能:系统首页上显示所有投票选项的列表,用户可以通过选中某个选项并点击“投票”按钮进行投票操作。另外,还提供查看投票详细信息的超链接,用户点击后可在另一页面上看到各个投票选项目前的投票情况,主要包括各选项所得的票数、占总票数的百分比等信息,并且以柱形图显示各选项的得票率,可以让用户从直观上看到各项的得票情况2、关键问题如何实现从数据库中的数据调入投票系统的jsp页面中以及把用户在投票系统中的投票结果保存到数据库中。3、解决方法 我们通过加载数据库驱动使access数据库能够与myeclipse中的在线投票系统相连接,从而在doVote.jsp页面中能够从数据库中访问数据库中的数据,也能够在用户投票后对数据库中的数据进行修改。八、算法及流程图算法:首先用户通过在投票首页选择投票功能或者查看结果功能,转入投票页面,然后经过投票处理页面对投票数据进行修改,结果在显示页面显示投票结果。 开 始显示投票表单取得投票的参数是否取得参数 否 结 束显示投票结果将结果写入数据库累加投票数 是 九、调试过程中出现的问题及相应解决办法一、加载数据库驱动时,导入Jar包出错解决方法通过把sqljdbc.jar包重新放到项目WEBRootWEB-INFlib文件夹下;右键项目名称>Build Path>Configure Build Path,重新加载数据库驱动。二、数据库配置时提示异常:“到主机 的 TCP/IP 连接失败。”解决方法可能时因为数据库TCP/IP服务没有开启,重新开启。开启过程:打开 Microsoft SQL Server 2005配置工具目录下的SQL Server Configuration Manager,选择mssqlserver协议, 然后右边窗口有个tcp/ip协议,双击进入,设置成如下界面,保存,重启SQL SERVER服务即可。十、课程设计心得体会课程设计,我明白了要想学习好一门课程,一定要理论与实践相结合,Web技术更是如此。要在不同的浏览器上做调试实验,解决兼容性问题。在很多的时候总是感觉捉襟见肘。Web技术是计算机方面的重点实践应用课程,所以课程设计在我看来不仅仅是一个知识的巩固,还是一个让我们提高动手能力的途径。通过这次课程设计,我收获的不仅仅是课程上的知识得到实际应用,还有编程的基本操作。使我对所学专业知识得到了充分的应用,锻炼了我发现问题,分析、思考问题、解决问题的能力,使我的实际动手操作能力有所提高,而不仅仅是局限于书本上的知识,对今后的工作学习都大有益处。十一、源程序1)数据表的设计 本系统设计了两张表,表tb-temp保存投票用用户信息,表tb-vote保存投票选项信息。 表tb-temp字段名数据类型字段大小是否为主键IdInt4是VoteipChar20VotemselBigint8VotetimeChar50 表tb-vote字段名数据类型字段大小是否为主键IdSmallint2是Vote_titleChar50Vote_numInt4Vote_orderSmallint22)值javabean的设计建一个值JavaBean用来封装存储表tb-temp中的投票选项信息,代码如下:package com.yxq.valuebean;public class VoteSingle private String id; /存储选项IDprivate 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 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 TempSingle private String id;/存储投票用户IDprivate String voteIp;/ 存储投票用户IPprivate 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 voteTime;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;3)数据库操作类的编写对于查看投票内容,参与投票和显示结果的操作,都涉及了数据库的操作。这些操作在一个DB类中实现,具体代码入下:定义属性及构造方法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 String 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 = "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.printStackTrace(); /向控制器输出提示信息/*获取数据库连接 * 功能 */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();/获取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 List 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.setTitle(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;/* * 功能 查询数据表,获取指定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.setVoteIp(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;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();/关闭Statement类对象if (con != null)con.close();/关闭数据库连接 catch (Exception e) System.out.println("关闭数据库失败!");e.printStackTrace();4)工具类的编写该系统涉及了类型的转换,计算时间差等操作,这些操作在一个类中实现,这样可以实现代码的重复使用。该工具类为mytools,代码如下:package com.yxq.toolbean;import java.text.SimpleDateFormat;import java.util.Date;public class MyTools /* * 功能 将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 count=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 ms)Date date=new Date(ms);SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String strDate=format.format(date);return strDate;5)显示投票选项的设计当用户访问首页面后,单击“参与投票”就会进入vote.jsp页面显示投票选项,在该页面中先要查询tb_vote数据表获取所有的投票选项,然后逐一显示投票选项的标题<% page contentType="text/html; charset=UTF-8"%><% page import="java.util.List" %><% page import="com.yxq.valuebean.VoteSingle" %><jsp:useBean id="myDb" class="com.yxq.toolbean.DB"/> <!- 创建一个DB类对象 -><% response.addHeader("Pragma","No-cache"); response.addHeader("Cache-Control","no-cache"); response.addDateHeader("Expires",1L); String sql="select * from app.tb_vote order by vote_order"/生成查询投票选项的SQL语句 List votelist=myDb.selectVote(sql); /查询数据表获取所有投票选项%><html><head> <title>在线投票</title> <link style="text/css" rel="stylesheet" href="css/style.css"> </head><body bgcolor="#F0F0F0"> <center> <form action="doVote.jsp" method="post"> <table border="0" width="760" height="620" background="images/bg.jpg"> <tr height="20"> <!- 显示投票选项 -> <td valign="top" width="420"> <table border="0" cellspacing="0" cellpadding="0" width="100%" style="margin-top:240;margin-left:51" bgcolor="#7688AE"> <tr><td colspan="2" background="images/voteT.jpg"></td></tr> <!- 如果集合为空 -> <% if(votelist=null|votelist.size()=0) %> <tr height="200"><td align="center" colspan="2">没有选项可显示!</td></tr> <!- 如果集合不为空 -> <% else %> <tr> <td align="center" width="60%"> <table border="0" width="100%"> <% int i=0; while(i<votelist.size() VoteSingle single=(VoteSingle)votelist.get(i); %> <tr height="27"> <td style="text-indent:7"><%=single.getTitle() %></td> <td width="30%" align="center"><input type="radio" name="ilike" value="<%=single.getId() %>"></td> </tr> <% i+; /while结束 %> </table> </td> <td valign="top"> <img src="images/note.jpg"> <b><font color="white">注意事项:</font></b> <p><font color="#FDE401"><li>1小时内只能投一次票!</li></font> </td> </tr> <% /else结束 %> <!- 显示操作按钮 -> <tr height="97"> <td align="center" valign="top" colspan="2" background="images/voteE.jpg"> <input type="submit" style="background-image:url(images/submitB.jpg);width:68;height:26;border:0"> <input type="reset" style="background-image:url(images/resetB.jpg);width:68;height:26;border:0"> <a href="showVote.jsp"><img src="images/showB.jpg" style="border:0"></a> <a href="index.jsp"><img src="images/indexB.jpg" style="border:0"></a> </td> </tr> </table> </td> </tr> </table> </form> </center></body></html>6)参与投票的设计<% page contentType="text/html; charset=UTF-8"%><% page import="com.yxq.valuebean.TempSingle" %><% page import="com.yxq.toolbean.MyTools" %><% page import="java.util.Date" %><jsp:useBean id="myDb" class="com.yxq.toolbean.DB"/><% String mess="" /用来保存提示信息 String selectId=request.getParameter("ilike");/获取用户选择 if(selectId=null|selectId.equals("")/没有选择投票选项 mess="请选择投票!" else /选择了投票选项 boolean mark=false;/是否允许投票的标志 long 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语句,功能:从数据表中获取当前用户上次投票时的记录 TempSingle single=myDb.selectTemp(sql); if(single=null)/在tb_temp表中不存在当前IP mark=true; /允许投票 else/存在当前IP,则判断从上次投票到现在是否超过指定时间,本系统指定为60分钟 last=single.getVoteMSEL();/从该JavaBean中获取上次投票的时间(以毫秒显示) String result=MyTpareTime(today,last);/将现在时间与上次投票时的时间进行比较 if(result.equals("yes")/返回"yes",表示时间差已超过60分钟,允许投票 mark=true; else/否则,不允许投票 mark=false; String strTime=MyTools.formatDate(today);/将当前投票时间(以毫秒显示的)转为"年-月-日 时:分:秒"的形式 if(mark)/允许投票 /* 【1】记录用户IP和投票时间 */ sql="insert into tb_temp values('"+ip+"','"+today+"','"+strTime+"')" int i=myDb.update(sql); /* 【2】判断记录用户IP是否成功 */ if(i<=0)/记录IP失败 mess="系统在记录您的IP地址时出错!" else/记录IP成功 /* 更新票数 */ sql="update app.tb_vote set vote_num=vote_num+1 where id="+selectId; i=myDb.update(sql);/更新成功 if(i>0) mess="投票生效! <img src='images/spic.jpg'>" else/更新失败 mess="投票失败!" else/不允许投票 mess="对不起,通过判断您的IP,您已经投过票了!<br>上次投票时间:"+single.getVoteTime()+"<br>60分钟之内不允许再进行投票!" session.setAttribute("mess",mess);/保