目录
摘要
相较于传统投票方式,在线投票是任何一次商演、电视或者户外广告在投入产出效率上都难以企及的。在线投票能够迅速提升活动商家的广告价值,降低商家广告成本,提高知名度以及美誉度。网络投票的主要目的就是人群放大:通过网络投票,可以吸引大量的选手及相关亲友的关注,通过以往的数据统计,一名选手参与投票,会带动60人参与。这样可以最大程度的向客户展现实力,扩大社会影响力。
系统分为前台和后台两部分,前台主要是对普通用户开放。普通用户将实现注册、投票、重选等操作;后台主要作用是管理员实现登录、投票管理、用户管理等操作。依据前台和后台的不同权限需求,在线投票系统主要分为普通用户和管理员两个功能模块。
普通用户模块将实现用户注册、用户登录、用户投票以及投票重选和查看投票结果等功能。 管理员模块将实现管理员登录、发布新投票、撤消投票、查看所有投票、编辑和删除,投票以及用户管理等功能。
关键词:网上投票
在线投票系统主要包含以下模块:显示投票选项模块,主要是显示投票内容,即投票表单的实现;参与投票模块,禁止重复投票;显示投票结果模块,主要是投票选项的计数统计。后台管理主要包括投票项目的增加、修改和删除,其中修改投票项目还可以包含对选项的修改和删除;管理员登录验证模块;投票主题显示模块,可以浏览投票主题及相关信息(投票总数、投票时间等),可实现分页显示;投票主题增加模块,以表单的形式增加投票主题以及选项的个数;投票项目的删除,对于不需要的投票主题可实现删除。
2.1 系统简介
随着科技的飞速发展,计算机已经广泛的应用于各个领域之中,而且日趋普及。在计算机应用中很重要的一部分就是编程语言,编程语言的出现打开了计算机应用的新篇章。在这些编程语言中JSP占有着重要的地位,JSP拥有Java编程语言“一次编写,各处运行”的特点。在当今的网络应用中JSP无处不在,在线投票系统就是JSP功能强大的一个最好的例证。
在线投票系统有很多传统投票方式不可比拟的优势。首先,它可以在很短的时间内,通过互联网将不同时间不同地域的用户投票组合到一起,并进行结果反馈,这是传统的投票方法完全做不到的;其次,在线投票系统的效率要比以往的传统投票方法高很多,在这个寸时如寸金的年代,在线投票系统不但省去了投票与计票环节的人力成本,还可以节省很多时间以用作处理其他更重要的事情;综上所述,在线投票系统有着快捷、经济、方便、省时省力等诸多优点都注定它将是未来投票方式的主流。在线投票系统可以用来统计网站用户对某个主题或热门话题的意见。网站管理员也可以通过投票的方式了解用户的看法,或者通过在线投票系统这个媒介去了解用户的思想、意见,并通在线投票系统的结果反馈改进自己的网站设计。政府决策者也可以通过在线投票系统来调查民众对某一项新政策的意见,进而统计数据做出更恰当的决策。在线投票系统是当今各大网站必备的程序之一,如果网站开发者想了解用户对该网站的意见和建议,他可以设计这样一个投票主题:你认为该网站如何?(A.很好B.一般C.不好)然后提供给用户进行投票。
2.2 系统功能
因在线投票系统有着经济、快捷等诸多优点,所以在实际项目实践中如何很好的实现这些优点便成了整个开发过程中的重中之重。在整个项目实践中,首先对课题的实际要求与需求分析进行详细的考究,查阅大量的相关资料,并且借鉴一些其他投票系统的项目经验,最后提出设计方案。系统分为前台和后台两部分,前台主要是对普通用户开放。普通用户将实现注册、投票、重选等操作;后台主要作用是管理员实现登录、投票管理、用户管理等操作。依据前台和后台的不同权限需求,在线投票系统主要分为普通用户和管理员两个功能模块。
普通用户模块将实现用户注册、用户登录、用户投票以及投票重选和查看投票结果等功能。管理员模块将实现管理员登录、发布新投票、撤消投票、查看所有投票、编辑和删除新投票以及用户管理等功能。
3.1 开发工具简介
在在线投票系统的设计发开过程中主要用了JSP技术,其中用到的工具有:JDK1.4、MyEclipse8.5、Microsoft SQL Server 2008、Tomcat等。
1.JSP简介
JSP技术有点类似ASP技术,它是在传统的网页HTML文件中插入Java程序段和JSP,从而形成JSP文件。JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。在线投票系统用JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使本系统基于Web的应用程序的开发变得迅速和容易。
- 一次编写,到处运行。在这一点上Java比PHP更出色,除了系统之外,代码不用做任何更改
- 系统的多平台支持。基本上可以在所有的平台任意的环境下开发,在任意环境中进行系统配置,在任意环境中拓展,相比ASP/PHP的局限性是显而易见的。
- 强大的可伸缩性。从只有一个小的JAR文件就可以运行Servlet/JSP,到多台Application进行事务处理,消息处理,一台服务器到无数台服务器,Java显示了一个巨大的生命活力。
- 多样化和功能强大的开发工具支持。这一点与ASP很像,Java已经有了许多非常优秀的开发工具,而且许多可以免费得到,并且其中许多已经可以顺利的运行于多种平台之下。
- Microsoft SQL Server 2008简介
Microsoft SQL Server 2008是微软推出的一个能够提供可信的、高效率智能数据平台软件,它能满足企业各种管理数据的需求。SQL Server 2008推出了许多新的特性和关键的改进,使得公司可以运行他们最关键任务的应用程序,同时降低了管理数据基础设施和发送观察和信息给所有用户的成本,已成为至今为止的最强大和最全面的SQL Server版本。
SQL Server 2008在企业中也是非常重要的应用,各种财务系统,ERP系统,OA系统等都会用到SQL Server 2008数据库,甚至网站也可以用到数据库来作为网站的后台。这是微软官方发布的SQL Server 2008 SP3简体中文版,基于SQL Server 2008提供可靠高效的智能数据平台构建而成,提供了大量新改进,可帮助您的组织满怀信心地调整规模、提高 IT 效率并实现管理完善的自助BI。此版本SQL Server 2008 SP3中包含应用程序和多服务器管理、复杂事件处理、主数据服务及最终用户报告等方面的新功能和增强功能。
确保业务连续性、增强的数据库镜像。SQL Server 2008 构建于 SQL Server 2005 之上,但增强的数据库镜像,包括自动页修复、提高性能和提高支持能力,因而是一个更加可靠的平台。
数据页的自动恢复。SQL Server 2008 允许主机器和镜像机器从 823/824 类型的数据页错误透明地恢复,它可以从透明于终端用户和应用程序的镜像伙伴请求新副本。日志流压缩。数据库镜像需要在镜像实现的参与方之间进行数据传输。使用 SQL Server 2008,参与方之间的输出日志流压缩提供最佳性能,并最小化数据库镜像使用的网络带宽。
3.2 总体功能模块设计
在线投票系统总体功能模块包括普通用户登录模块和管理员登录模块,其具体描述如下:
- 普通用户模块
(1)用户注册:普通投票用户须通过账号注册方可以进行投票;
(2)登录:注册成功后,可输入用户名和密码登录系统;
(3)重选:用户可以进行重新投票;
从以上介绍中我们能看到,普通用户模块包含着3个不同的功能,其各部分功能关系如图下图所示。
- 显示投票选项模块
主要是显示投票内容,即投票表单的实现。
- 参与投票模块
禁止重复投票;显示投票结果模块,主要是投票选项的计数统计。
- 总流程图设计
在线投票系统的流程图包含了该系统的投票原理与主要制作方法。从流程图上我们可以看到在线投票系统需要经过登录、显示投票表单、取得投票参数、累加投票数、将投票写入数据库和显示投票结果等步骤,其流程图如下图所示:
- 系统实现
- 数据库实现
数据库设计是软件开发中的重要环节,是对系统数据全面的、详细的分析。数据库设计的好坏直接关系到整个项目设计的效率的高低,关系到设计的稳定性。根据在线投票系统不同模块之间的联系和前期的设计目的与需求,设计了三个不同的数据表,他们分别是用户表,投票选项表和投票记录表。
- 用户表
用户表包括所有用户的各种信息,如用户名、密码等详细数据并规定了每个字段的类型,如下表所示:
- 投票选项表
投票选项表包括每个投票的基本信息,如投票ID、投票主题和投票选项各选所得票数等信息,同时还规定了字段类型和长度,如下表所示:
- 投票记录表
投票记录表包括投票的ID、投票IP、投票时间等信息,同时还规定了字段类型和长度,如下表所示:
-
- 程序模块实现(含代码)
- 注册模块
普通用户登录在线投票系统需要先进行账号注册,注册成功之后才可以进行其他操作,注册模块的界面如下图所示:
实现代码:
Register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
<!--
.STYLE2 {
font-size: 24px;
font-family: "宋体";
font-weight: bold;
color: #FF0000;
}
.STYLE3 {
font-family: "新宋体";
font-size: 16px;
}
.STYLE4 {color: #FF0000}
.STYLE5 {
font-size: 12px;
line-height: 14px;
text-decoration: none;
}
-->
</style>
<script language ="JavaScript">
<!--
function CheckSubmit()
{
if( document.registerform.id.value == "" )
{ alert("请输入用户名!"); document.registerform.id.focus(); return false; }
if( document.registerform.password.value == "" )
{ alert("请输入密码!"); document.registerform.password.focus(); return false; }
if( document.registerform.password2.value == "" )
{ alert("请验证密码!"); document.registerform.password2.focus(); return false; }
if( document.registerform.password2.value != document.registerform.password.value )
{ alert("密码验证出错!"); document.registerform.password.focus(); return false; }
if( document.registerform.username.value == "" )
{ alert("请输入真实姓名!"); document.registerform.username.focus(); return false; }
return true;
}
</script>
</head>
<body style="background:url('images/背景.jpg') no-repeat;">
<div align="center">
<p>请如实填写下面的注册申请单(*为必填项)</p>
<hr width="800" size="0" />
<form name="registerform" id="form1" method="post" action="Register1.jsp">
<table width="343" border="0">
<tr>
<td><div align="center">用 户 ID:</div></td>
<td><input name="id" type="text" class="input1" size="20"/>
<span class="style1" style="color: red">*</span></td>
</tr>
<tr>
<td><div align="center">密 码:</div></td>
<td><input name="password" type="password" class="input1" size="20"/>
<span class="style1" style="color: red">*</span></td>
</tr>
<tr>
<td><div align="center">验证密码:</div></td>
<td><input name="password2" type="password" class="input1" size="20"/>
<span class="style1" style="color: red">*</span></td>
</tr>
<tr>
<td><div align="center">真实姓名:</div></td>
<td><input name="username" type="text" class="input1" size="20"/>
<span class="style1" style="color: red">*</span></td>
</tr>
<tr>
<td><div align="center">性 别:</div></td>
<td><input name="sex" type="radio" value="M" checked="checked" />
男
<input name="sex" type="radio" value="W" />
女<span class="style1" style="color: red">*</span></td>
</tr>
</table>
<hr width="800" size="0" />
<table width="294" border="0">
<tr>
<td width="147"><input name="Submit" type="submit" class="button1" value="注册" οnclick="return CheckSubmit();" /></td>
<td width="137"><input name="Submit2" type="reset" class="button1" value="清除" /></td>
</tr>
</table></form>
</div>
</body>
</html>
Register1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
<!--
.STYLE2 {
font-size: 24px;
font-family: "宋体";
font-weight: bold;
color: #FF0000;
}
.STYLE3 {
font-family: "新宋体";
font-size: 16px;
}
.STYLE4 {color: #FF0000}
.STYLE5 {
font-size: 12px;
line-height: 14px;
text-decoration: none;
}
-->
</style>
<script language="javascript">
function backward()
{
history.back();
}
</script>
</head>
<body style="background:url('images/背景.jpg') no-repeat;">
<%
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
//"com.microsoft.sqlserver.jdbc.SQLServerDriver"要与驱动类名一样
String url="jdbc:sqlserver://localhost:1433;databaseName=db_database08";
//db_database08为数据库名
String user="sa";
String userpassword="";
Connection conn= DriverManager.getConnection(url,user,userpassword);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String id=request.getParameter("id");
String sql="select * from S where id='"+id+"'";
ResultSet rs=stmt.executeQuery(sql);
if(rs.next())
{
rs.close();
stmt.close();
conn.close();
%>
<p>用户名不能重名,请重新选择!</p>
<p><input name="Button2" type="button" class="button1" οnclick="backward()" value="返回上一步" /><a href="Register.jsp"></a></p>
<%}
else{
rs.close();
String username=request.getParameter("username");
String sex=request.getParameter("sex");
String password=request.getParameter("password");
%>
<form action="Register2.jsp" method="post">
<input type="hidden" name="id" value="<%=id%>" />
<input type="hidden" name="username" value="<%=username%>" />
<input type="hidden" name="sex" value="<%=sex%>" />
<input type="hidden" name="password" value="<%=password%>" />
<div align="center"><b><font size="3">请认真检查下面的注册申请单.</font></b>
<hr width="100%" />
<table width="414" border="0" cellspacing="2" cellpadding="1"><tbody>
<tr>
<td width="107" align="right"><div align="center">用 户 名:</div></td>
<td width="297" align="left"><%=id%></td></tr>
<tr>
<td width="107" align="right"><div align="center">密 码:</div></td>
<td width="297" align="left"><%=password%></td></tr>
<tr>
<td align="right"><div align="center">性 别:</div></td>
<td align="left"><%=sex%></td></tr>
<tr>
<td align="right"><div align="center">真实姓名:</div></td>
<td align="left"><%=username%></td></tr>
</tbody></table>
<hr />
<table width="200" border="0">
<tr>
<td><input name="Submit" type="submit" class="button1" value="确认" /></td>
<td><input name="Submit2" type="button" class="button1" οnclick="backward()" value="返回上一步"/></td>
</tr>
</table></div>
</form>
<%}%>
</body>
</html>
Register2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
<!--
.STYLE2 {
font-size: 24px;
font-family: "宋体";
font-weight: bold;
color: #FF0000;
}
.STYLE3 {
font-family: "新宋体";
font-size: 16px;
}
.STYLE4 {color: #FF0000}
.STYLE5 {
font-size: 12px;
line-height: 14px;
text-decoration: none;
}
-->
</style>
</head>
<body style="background:url('images/背景.jpg') no-repeat;">
<%
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
//"com.microsoft.sqlserver.jdbc.SQLServerDriver"要与驱动类名一样
String url="jdbc:sqlserver://localhost:1433;databaseName=db_database08";
//db_database08为数据库名
String user="sa";
String userpassword="";
Connection conn= DriverManager.getConnection(url,user,userpassword);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String id=request.getParameter("id");
String username=request.getParameter("username");
String sex=request.getParameter("sex");
String password=request.getParameter("password");
String sql="insert into S values('"+id+"','"+username+"','"+sex+"','"+password+"')";
stmt.executeUpdate(sql);
%>
<p> <font color="#CC0033"><%=id %></font>:祝贺您,注册成功!</p>
3秒后自动返回登陆窗口,如果你不想等待,可以点击这里<a href="index.jsp">返回首页</a>
<%response.setHeader("Refresh","3;URL=index.jsp");%>
<p align="center"> </p>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="30" align="center" valign="top">
</td>
</tr>
</table>
</body>
</html>
- 登录模块
普通用户在完成注册之后方可以登录在线投票系统,登录模块界面如下图所示:
实现代码:
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
<!--
.STYLE2 {
font-size: 24px;
font-family: "宋体";
font-weight: bold;
color: #FF0000;
}
.STYLE3 {
font-family: "新宋体";
font-size: 16px;
}
.STYLE4 {color: #FF0000}
.STYLE5 {
font-size: 12px;
line-height: 14px;
text-decoration: none;
}
-->
</style>
</head>
<body style="background:url('images/背景.jpg') no-repeat;">
<form name="form1" id="form1" action="Logon.jsp" method="post">
<h1 align="center" class="STYLE2 STYLE3">用户登陆</h1>
<table width="253" border="0" align="center">
<tr>
<td width="71" height="33"><div align="left">用户名:</div></td>
<td width="172"><input name="id" type="text" class="input1" size="18" maxlength="18" /></td>
</tr>
<tr>
<td width="71" height="33"><div align="left">密 码:</div></td>
<td><input name="password" type="password" class="input1" size="18" maxlength="18" /></td>
</tr>
</table>
<table width="200" border="0" align="center">
<tr>
<br/>
<td><input type="submit" name="Submit" value="登陆" /></td>
<td><input type="reset" name="Submit2" value="重置" /></td>
</tr>
</table>
</form>
<table align="center">
<tr>
<td><p ><a href="Register.jsp" class="STYLE4">注册新用户</a></p></td>
</tr>
</table>
</body>
</html>
Logoff.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
<!--
.STYLE2 {
font-size: 24px;
font-family: "宋体";
font-weight: bold;
color: #FF0000;
}
.STYLE3 {
font-family: "新宋体";
font-size: 16px;
}
.STYLE4 {color: #FF0000}
.STYLE5 {
font-size: 12px;
line-height: 14px;
text-decoration: none;
}
-->
</style>
</head>
<body style="background:url('images/背景.jpg') no-repeat;">
<p>成功注销!<br />
</p>
5秒后自动返回首页,如果你不想等待,可以点击这里<a href="index.jsp">返回首页</a>
<%response.setHeader("Refresh","5;URL=index.jsp");%>
</body>
</html>
Logon.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script language="javascript">
function BackWard()
{
history.back();
}
</script>
<style type="text/css">
<!--
.STYLE2 {
font-size: 24px;
font-family:"新宋体"
font-weight: bold;
color: #FF0000;
}
.STYLE3 {
font-family: "新宋体";
font-size: 16px;
}
.STYLE4 {color: #FF0000}
.STYLE5 {
font-size: 12px;
line-height: 14px;
text-decoration: none;
}
-->
</style>
</head>
<body style="background:url('images/背景.jpg') no-repeat;">
<%
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
//"com.microsoft.sqlserver.jdbc.SQLServerDriver"要与驱动类名一样
String url="jdbc:sqlserver://localhost:1433;databaseName=db_database08";
//db_database08为数据库名
String user="sa";
String userpassword="";
Connection conn= DriverManager.getConnection(url,user,userpassword);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
boolean a;
String id=request.getParameter("id");
String password=request.getParameter("password");
String sql="select * from S where ID='"+id+"' and Password='"+password+"'";
ResultSet rs=stmt.executeQuery(sql);
a=rs.next();
if(a==false)
{rs.close();
session.setAttribute("id",id);
%>
<p>用户名或密码错误,请重新填写!</p>
<p><a href="index.jsp">返回首页</a></p>
<%}
else
{
rs.close();
%>
<form name="form2" id="form2" method="post" action="Logoff.jsp">
登陆成功!欢迎您!<%=id %>用户
<p><a href="index1.jsp">进入投票</a></p>
<input type="submit" name="Submit" value="注销用户" />
</form>
<%} %>
</body>
</html>
- 投票模块
普通用户登录成功之后,点击参与投票,便可进入投票界面,投票模块的界面如下图所示:
实现代码:
index1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
errorPage="error.jsp"%>
<html>
<head>
<title>在线投票</title>
<link style="text/css" rel="stylesheet" href="css/style.css">
</head>
<body bgcolor="#F0F0F0">
<center>
<table border="0" width="760" height="620" cellspacing="0" cellpadding="0" background="images/bg.jpg">
<tr>
<td style="padding-top:152;padding-left:120">
<a href="vote.jsp"><img src="images/voteLink.jpg" style="border:0"></a>
<a href="showVote.jsp"><img src="images/showLink.jpg" style="border:0"></a>
<a href="index.jsp"><img src="images/indexLink.jpg" style="border:0"></a>
</td>
</tr>
</table>
</center>
</body>
</html>
messages.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
errorPage="error.jsp"%>
<%
String message=(String)session.getAttribute("mess");
if(message==null)
message="";
session.invalidate();
%>
<html>
<head>
<title>友情提示</title>
<link style="text/css" rel="stylesheet" href="css/style.css">
</head>
<body bgcolor="#F0F0F0">
<center>
<table border="0" width="760" height="620" background="images/bg.jpg">
<tr>
<td>
<table border="0" cellspacing="0" cellpadding="0" width="333" style="margin-top:200;margin-left:118">
<tr height="74"><td background="images/messT.jpg"></td></tr>
<tr height="100">
<td align="center" bgcolor="#7688AD">
<font color="white"><%=message%></font>
</td>
</tr>
<tr height="114">
<td background="images/messE.jpg" align="center" valign="top">
<a href="index1.jsp"><img src="images/indexB.jpg" style="border:0"></a>
<a href="vote.jsp"><img src="images/backB.jpg" style="border:0"></a>
<a href="showVote.jsp"><img src="images/showB.jpg" style="border:0"></a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</center>
</body>
</html>
doVote.jsp
<%@ 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 voteId=request.getParameter("ilike"); //获取用户选择
if(voteId==null||voteId.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 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=MyTools.compareTime(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(id,voteIp,voteTime) values('"+voteId+"','"+ip+"','"+strTime+"')";
int i=myDb.update(sql);
/** 【2】判断记录用户IP是否成功 **/
if(i<=0) //记录IP失败
mess="系统在记录您的IP地址时出错!";
else{ //记录IP成功
/** 更新票数 **/
sql="update tb_vote set vote_num=vote_num+1 where id="+voteId;
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); //保存提示信息到session范围内
response.sendRedirect("messages.jsp"); //将请求重定向到messages.jsp页面,进行提示
%>
vote.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
errorPage="error.jsp"%>
<%@ page import="java.util.List" %>
<%@ page import="com.yxq.valuebean.VoteSingle" %>
<jsp:useBean id="myDb" class="com.yxq.toolbean.DB"/>
<%
response.addHeader("Pragma","No-cache");
response.addHeader("Cache-Control","no-cache");
response.addDateHeader("Expires",1L);
String sql="select * from tb_vote order by vote_order";
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 height="75"><td align="center" 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++;
}
%>
</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>
<%
}
%>
<!-- 显示操作按钮 -->
<tr height="97">
<td align="center" valign="top" colspan="2" background="images/voteE.jpg">
<input type="submit" value="" style="background-image:url(images/submitB.jpg);width:68;height:26;border:0">
<input type="reset" value="" 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="index1.jsp"><img src="images/indexB.jpg" style="border:0"></a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
- 统计模块
投票完毕之后,点击查看结果,就可以看到所统计的投票数,统计模块的界面如下图所示:
代码实现:
showVote.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
errorPage="error.jsp"%>
<%@ page import="java.util.List" %>
<%@ page import="com.yxq.valuebean.VoteSingle" %>
<jsp:useBean id="myDb" class="com.yxq.toolbean.DB"/>
<%
float numAll=0;
String sql="select * from tb_vote order by vote_order";
List showlist=myDb.selectVote(sql);
%>
<html>
<head>
<title>在线投票</title>
<link style="text/css" rel="stylesheet" href="css/style.css">
</head>
<body bgcolor="#F0F0F0">
<center>
<table border="0" cellspacing="0" cellpadding="0" width="760" height="620" background="images/showbg.jpg">
<tr height="20">
<td valign="top" width="40%">
<table border="0" width="75%" cellspacing="0" cellpadding="0" style="margin-top:310;margin-left:45">
<% if(showlist==null||showlist.size()==0){ %>
<tr height="200"><td align="center" colspan="2">没有选项可显示!</td></tr>
<%
}
else{
int i=0;
while(i<showlist.size()){
VoteSingle single=(VoteSingle)showlist.get(i);
numAll+=Integer.parseInt(single.getNum());
%>
<tr height="25">
<td><%=single.getTitle() %></td>
<td width="25%" align="right"><%=single.getNum() %> 票 </td>
</tr>
<%
i++;
}
}
%>
<tr height="25">
<td colspan="2"><a href="vote.jsp"><img src="images/backB.jpg" style="border:0"></a></td>
</tr>
</table>
</td>
<!-- 通过图片显示投票结果 -->
<td valign="top" width="60%">
<table border="0" width="40%" cellspacing="0" cellpadding="0" style="margin-top:310;margin-left:20">
<% if(showlist==null||showlist.equals("")){ %>
<tr height="200"><td align="center" colspan="2">没有选项可显示!</td></tr>
<%
}
else{
int i=0;
while(i<showlist.size()){
VoteSingle single=(VoteSingle)showlist.get(i);
int numOne=Integer.parseInt(single.getNum());
float picLen=numOne*145/numAll; //计算图片长度
float per=numOne*100/numAll; //计算票数所占的百分比
float doPer=((int)((per+0.05f)*10))/10f; //保留百分比后的一位小数,并进行四舍五入
%>
<tr height="25">
<td><img src="images/count.jpg" width="<%=picLen%>" height="15" alt="影片:<%=single.getTitle()%>"></td>
<td width="15%" align="right"><%=doPer%>%</td>
</tr>
<%
i++;
}
}
%>
<tr height="25">
<td colspan="2" align="right"><a href="index1.jsp"><img src="images/indexB.jpg" style="border:0"></a></td>
</tr>
</table>
</td>
</tr>
</table>
</center>
</body>
</html>
Java代码实现:
DB.java
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; //储存数据库URL
private String username; //储存登录数据库的用户名
private String password; //声明一个Connection对象
private Connection con; //声明一个Statement对象来执行SQL语句
private Statement stm; //声明一个ResultSet对象用来储存结果集
private ResultSet rs; //通过构造方法为属性赋值
public DB() {
className = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
url = "jdbc:sqlserver://localhost:1433;databaseName=db_database08";
username = "sa";
password = "";
}
/**
* @功能 加载数据库驱动程序
*/
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类对象中
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();
}
}
}
MyTools.java
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; //计算当前时间与上次投票时间相差的
if(count<=limitTime*60*1000) //如果相差小于等于60分钟(1分=60秒,1秒=1000毫秒)
return "no";
else //如果相差大于60分钟
return "yes";
}
/**
* @功能 格式化时间为指定格式
* @参数 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;
}
}
TempSingle.java
package com.yxq.valuebean;
public class TempSingle {
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 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;
}
}
VoteSingle.java
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 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;
}
}
- 课程设计心得
5.1 设计体会
经过这段时间的辅导讨论,我们组的网上投票系统基本开发完毕。其功能基本符合设计需求。对于数据的输入、修改、查询等问题通过程序进行了有效解决,并且能够对数据库进行权限管理。
通过此次课程设计,使我更加扎实的掌握了有关Java方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍地检查终于找出了原因所在,也暴露出了前期我在这一方面知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在课程设计中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在课设中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到困难就想要退宿,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上披荆斩棘,而不是知难而退,那样永远不可能获得成功,收获喜悦,也永远不可能得到社会及其他人对你的认可。
回顾起此次课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说是苦多于甜,但是学到了很多很多东西,不仅巩固了以前的知识,还学到了很多书本上没有学到的知识。通过此次课程设计使我懂得了理论和实际结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识和实际相结合,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。实验过程中,也对团队精神进行了考察,让我们在合作中更加默契,在成功之后一起体会喜悦的心情。果然是团结就是力量,只有相互之间默契融洽的配合才能换来最终完美的结果。
5.2 系统改进
由于设计时间较短和本人知识有限,无法做到尽善尽美,所以该系统还有一些不尽人意的地方。系统主要存在以下一些问题:
- 系统的安全性方面的一些问题;
- 系统的某些功能还不能够很好的实现,同时本系统还有某些方面没有考虑到;
- 系统在跨平台运行方面有一些不足;
这些都有待进一步的改善。因此,以后还应加强这几个方面的工作和学习。
第6章 参考文献
[1]林上杰,林康司. JSP 2.0技术手册第四版.北京.电子工业出版社. 2004
[2〕陈昊鹏,王浩等译. JAVA核心技术.北京.机械工业出版社. 2006
[3]付京周. JSP程序开发范例宝典.北京.人民邮电出版社. 2007
[4]殷兆麟,周智仁等. Java网络应用编程.北京.高等教育出版社. 2004
[5]孙卫琴.精通Struts:基于MVC的Java Web设计与开发.北京.电子工业出版社.2004
[6]孙卫琴. Java网络编程精解.北京. 电子工业出版社. 2007
[7]柳永坡. Jsp应用开发.北京.人民邮电出版社. 2005
[8]张海潘.软件工程导论.北京.清华大学出版社. 2003
[9]少锋.面向对象技术UML教程[M].北京.清华大学出版社. 2004
[10〕阎宏. Java与模式〔M].西安.电子工业出版社. 2002
[11]计磊,李里,周伟. JSP实用编程实例集锦.人民邮电出版社. 2007.
[12〕张桂元,贾燕枫. JSP动态网站设计入门与提高.北京.人民邮电出版
[13]杨昭. 数据库技术—课程设计案例精编. 北京.中国水利水电出版社. 2006
[14] 谢希仁. 计算机网络(第五版)[M]. 北京:电子工业出版社,2008年2月
[15] 胡小强 计算机网络[M] 北京:北京邮电大学出版社2005年1月
谢辞
首先非常感谢学校能开设这个课题,为我日后从事计算机方面的工作提供了经验,奠定了基础。
其次,我要特别感谢葛菁老师对我的悉心指导,在设计期间老师帮助我理清设计思路,指导操作方法,并对我所做的课题提出有效的改进方案。老师渊博的知识、严谨的作风、诲人不倦的态度和学术上精益求精的精神让我受益终生。这期间凝结了老师很多的心血,在此我表示由衷的感谢。没有他的帮助,我将无法顺利完成这次设计。
再次,学校在这方面也给我们提供了很大的支持和帮助,学校领导比较重视,给我们安排了较多的上机次数和足够的计算机,让我们有尽可能多的时间上机;并为我们开通了网线,方便我们上网查找信息;另外提供了专门的教室方便我们上机调试;对于学校和老师为我的毕业设计所提供的极大帮助和关心,在此我致以衷心的感谢!
最后还要感谢我的父母和家人,是他们深深的爱和不懈的支持给了我信心和勇气,使我在今后的道路上勇往直前,乐观向上!