15.4 开 发 过 程
15.4.1 数据表结构
本实例应用的是MySQL数据库,该实例所应用到的数据库名称为db_database15。数据库db_database15中包含两张数据表:tb_title数据表用来保存投票主题信息;tb_votetitle数据表用来保存投票选项信息。下面将给出数据表的表结构。
保存投票主题信息如表15.1所示。
表15.1 tb_title表
|
字 段 名 称 |
数 据 类 型 |
字 段 大 小 |
是 否 主 键 |
说 明 |
|
name |
varchar |
50 |
是 |
主题名称 |
|
createTime |
varchar |
50 |
否 |
创建主题时间 |
保存投票选项信息如表15.2所示。
表15.2 tb_votetitle表
|
字 段 名 称 |
数 据 类 型 |
字 段 大 小 |
是 否 主 键 |
说 明 |
|
id |
int |
11 |
是 |
自动增量 |
|
title |
varchar |
50 |
否 |
主题名称 |
|
voteName |
varchar |
50 |
否 |
主题选项名称 |
|
number |
int |
11 |
否 |
主题选项票数 |
15.4.2 安装与配置Lomboz插件
在Eclipse中使用Lomboz插件可以帮助Java Web应用的开发。借助于该插件,开发人员可以获得以下帮助。
● HTML标记和JSP关键字的高亮显示。
● 屏幕提示。
● 基本的语法检查。
● 支持J2EE项目中EJB应用的开发。
具体的安装过程,读者可参考第10章的相关内容。
15.4.3 创建项目
安装Lomboz插件成功后,启动Eclipse开发工具。创建工程的步骤如下:
(1)在菜单栏中选择“文件”/“新建”/“项目”命令,弹出创建项目的第一步对话框。在该对话框中依次选择“Web”/“Dynamic Web Project”选项,如图15.5所示。

图15.5 创建项目的第一步
(2)单击“下一步”按钮,弹出创建项目的第二步对话框。在该对话框中的“Project name”文本框中输入工程名称,本实例的工程名称为“wy_vote”;在“Target Runtime”下拉列表中选择“Apache Tomcat v5.5”,如图15.6所示。

图15.6 创建项目的第二步
(3)单击“下一步”按钮,弹出创建项目的第三步对话框。在该对话框中将“Dynamic Web Module”与“Java”复选框进行勾选,如图15.7所示。
图15.7 创建项目的第三步
(4)单击“下一步”按钮,弹出创建项目的第四步对话框。在该对话框中的“Context Root”文本框中输入发布在服务器上的项目名称,这里输入“wy_vote”;在“Content Directory”文本框中输入存放Web项目的文件夹名称,这里输入“WebRoot”;在“Java Source Directory”文本框中输入存放类文件的文件夹名称,这里输入“src”,如图15.8所示。

图15.8 创建项目的第四步
(5)单击“完成”按钮,完成创建项目的工作。
15.4.4 创建类文件
在右侧的“包资源管理器”视图中依次展开“wy_vote”工程后创建类文件。步骤如下:
(1)在“wy_vote”项目文件夹中单击鼠标右键,在弹出的快捷菜单中选择“新建”/“类”命令,如图15.9所示。

图15.9 新建类文件的第一步
(2)选择“类”命令后,弹出“新建Java类”对话框。在该对话框中的“包”文本框中输入存放类包的具体路径,这里输入的内容为“com.tool”,在“名称”文本框中输入要创建的类名称,这里输入的内容为“JDBConnection”,其他文本框和选项采用默认值即可,如图15.10所示。

图15.10 新建类文件的第二步
(3)单击“完成”按钮,完成类的创建。
注意:通过上述步骤,将类文件与编译后的类文件存放在同一个文件夹中。
15.4.5 工具类的编写
本实例主要应用到3个类:取得当前系统时间的ShowTime类;处理中文字符的Chinese类;对数据库操作的JDBConnection类。通过15.4.4节中的步骤可以创建这3个类文件。下面将介绍这3个类的具体编写过程。
1.取得当前系统时间的ShowTime类
管理员在后台维护中添加投票主题时,需要将当前的系统时间与投票主题同时添加到数据表中,以便日后的维护工作。取得当前系统时间的ShowTime类的具体代码如例程15-1所示。
例程15-1:mr\15\wy_vote\src\com\tool\ShowTime.java
package com.tool;
import java.util.Date;
import java.text.DateFormat;
import java.util.GregorianCalendar;
public class ShowTime {
private Date date=new Date();
private DateFormat dateFormat=DateFormat.getDateInstance(DateFormat.FULL);
public String currentlyTime(){
return dateFormat.format(date);
}
}
在上述代码中,DateFormat类的作用是格式化系统时间,格式化的类型为FULL。在JSP页中调用该类中的currentlyTime()方法,并且在页面中进行显示,显示的格式为“年-月-日 星期几”。如:“2006年1月16日 星期二”。
2.处理中文字符的Chinese类
JSP页中不支持在页与页之间传递中文信息,因此,需要通过类中的方法进行转码。实现中文字符转码的Chinese类的具体代码如例程15-2所示。
例程15-2:mr\15\wy_vote\src\com\tool\Chinese.java
package com.tool;
public class Chinese {
public static String toChinese(String strvalue) {
try {
if (strvalue == null) {
return "";
} else {
strvalue = new String(strvalue.getBytes("ISO8859_1"), "gb2312");
return strvalue;
}
} catch (Exception e) {
return "";
}
}
}
在上述代码中,通过“ISO8859_1”编码规则将中文字符统一为“GB2312”的格式。
3.对数据库操作的JDBConnection类
使用的数据表:tb_title。
主要技术:取得对数据库的操作。
JDBConnection类中的代码是本实例的关键部分,用户和管理员的任何操作都需要通过该类的方法对数据库进行操作。JDBConnection类中具体代码实现的步骤如例程15-3所示。
例程15-3:mr\15\wy_vote\src\com\tool\JDBConnection.java
package com.tool;
import java.sql.*;
public class JDBConnection {
(1)设置数据库驱动,包括URL地址、登录数据库的用户名、登录数据库的密码以及Connection类对象。各个属性的代码如下:
private final static String dbDriver = "com.mysql.jdbc.Driver"; //连接MySQL数据库的驱动
private final static String url = "jdbc:mysql://127.0.0.1:3306/db_database15";
private final static String userName = "root";
private final static String password = "111";
private Connection con = null;
注意:本实例应用的MySQL数据库驱动为mysql-connector-java-3.0.16-ga-bin.jar,用户可以构建该类库文件。
(2)通过构造方法自动加载数据库驱动的关键代码如下。
public JDBConnection() {
try {
Class.forName(dbDriver).newInstance(); //加载数据库驱动
} catch (Exception ex) {
}
}
(3)创建数据库连接的关键代码如下。
public boolean creatConnection() {
try {
con = DriverManager.getConnection(url, userName, password);
con.setAutoCommit(true);
} catch (SQLException e) {
}
return true;
}
(4)对数据库的增加、修改和删除操作的关键代码如下。
public boolean executeUpdate(String sql) {
if (con == null) {
creatConnection();
}
try {
Statement stmt = con.createStatement();
int iCount = stmt.executeUpdate(sql);
return true;
} catch (SQLException e) {
return false;
}
}
(5)对数据库的查询操作的关键代码如下。
public ResultSet executeQuery(String sql) {
ResultSet rs;
try {
if (con == null) {
creatConnection();
}
Statement stmt = con.createStatement();
try {
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
return null;
}
} catch (SQLException e) {
return null;
}
return rs;
}
(6)关闭数据库操作的关键代码如下。
public void closeConnection() {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
con = null;
}
}
}
}
15.4.6 创建JSP页文件
创建JSP页文件的具体步骤如下。
在包资源管理器中的“wy_vote”项目文件中单击鼠标右键,选择“新建”/“JSP” 命令,弹出创建JSP页文件的第一步对话框,如图15.11所示。

图15.11 创建JSP页文件的第一步
在“文件名”文本框中输入JSP文件的名称,这里输入的是“index”。单击“完成”按钮,完成创建JSP页的工作。本实例所有的JSP文件都是通过上述方法创建的,因此,在以后的JSP创建操作中将不再赘述了。
15.4.7 后台管理员登录模块
程序发布后,在首页面中下侧寻找 “转入后台登录”超链接,如图15.12所示。

图15.12 “转入后台登录”超链接
单击“转入后台登录”超链接,进入后台管理登录页面,如图15.13所示。

图15.13 后台管理员登录页面
1.后台管理员登录操作
主要技术:通过脚本语言实现管理员登录的功能。
通过form表单编写管理员登录页面的关键代码如例程15-4所示。
例程15-4:mr\15\wy_vote\WebRoot\login.jsp
<script src="js/validate.JS" type="text/javascript" language="javascript"></script>
<table width="180" border="0" align="center" cellpadding="0" cellspacing="0">
<form name="form" method="post" action="forwardBack.jsp" onSubmit="return adminLogin()">
<tr>
<td width="47" height="30">账号:</td>
<td width="117"><input name="account" type="text" size="18"></td>
</tr>
<tr>
<td height="30">密码:</td>
<td><input name="password" type="password" size="18"></td>
</tr>
<tr align="center">
<td height="30" colspan="2"><input type="submit" name="Submit" value="登录">
<input type="reset" name="Submit2" value="重置">
<input type="button" name="Submit3" value="退出" onClick="javascript:window. location.href= 'index.jsp';"></td>
</tr> </form>
</table>
在上述代码中,onSubmit触发的是adminLogin()脚本语言方法,该方法在JS文件夹中validate.js文件中,通过adminLogin()脚本语言方法实现用户登录的关键代码如例程15-5所示。
例程15-5:mr\15\wy_vote\WebRoot\JS\validate.js
function adminLogin(){
if(document.form.account.value==""){
window.alert("请输入管理员账号");
return false;
}
if(document.form.account.value!="mr"){
window.alert("您输入的账号有误");
return false;
}
if(document.form.password.value==""){
window.alert("请输入管理员密码");
return false;
}
if(document.form.password.value!="mrsoft"){
window.alert("您输入的密码有误");
return false;
}
return true;
}
在上述代码中,管理员的账号、密码分别为mr和mrsoft,当账号或密码输入错误时,系统会弹出提示信息。
当管理员输入正确的账号和密码时,单击“登录”按钮,进入forwardBack.jsp页,该页的主要功能是通过session保存客户端管理员账号的操作。forwardBack.jsp页的关键代码如例程15-6所示。
例程15-6:mr\15\wy_vote\WebRoot\forwardBack.jsp
<body>
<%
String account=request.getParameter("account");
if(account==null){
response.sendRedirect("login.jsp");
}
session.setAttribute("account",account); //将管理员账号保存在session对象中
response.sendRedirect("main_back.jsp");
//通过response对象调用sendRedirect()方法实现页面的重定向操作
%>
</body>
2.防止非法用户登录系统
从网站安全的角度考虑,仅仅上面介绍的系统登录页面并不能有效地保证系统的安全,一旦系统主界面的地址被他人获得,就可以通过在地址栏中输入系统的主界面地址而直接进入到系统中。由于后台底页面文件bottom_back.jsp几乎包含于整个系统的每个后台页面,所以本例将验证用户是否登录的代码放置在该页中。验证用户是否登录的关键代码如例程15-7所示。
例程15-7:mr\15\wy_vote\WebRoot\bottom_back.jsp
<%
String account=(String)session.getAttribute("account");
if(account==null){
%>
<script language="javascript">
alert("您已经与服务器断开了,请您重新登录!!!");
window.location.href='login.jsp';
</script>
<%}%>
15.4.8 维护投票主题模块
当管理员输入正确的账号和密码时,单击“登录”按钮,进入后台首页面,如图15.14所示。

图15.14 后台首页面
1.查询主题操作
使用的数据表:tb_title。
主要技术:通过JavaBean技术实现投票主题查询功能。
通过JavaBean技术访问JDBConnection类中executeQuery()方法的关键代码如例程15-8所示。
例程15-8:mr\15\wy_vote\WebRoot\main_back.jsp
<jsp:useBean id="connection" scope="request" class="com.tool.JDBConnection"/>
<body>
<table width="600" border="1" cellpadding="0" cellspacing="0" bordercolor="#FFFFFF" bordercolordark= "#DEDFDE" bordercolorlight="#FFFFFF">
<tr align="center" bgcolor="#FFFFFF">
<td width="66" height="24">主题序号</td>
<td width="177">主题名称</td>
<td width="152">创建时间</td>
<td width="147">操作</td>
</tr>
<%
int number=0;
String sql="select * from tb_title";
ResultSet rs=connection.executeQuery(sql);
try{
while(rs.next()){
number++;
%>
<tr align="center" bgcolor="#FFFFFF">
<td height="27"><%=number%></td>
<td><a href="vote_back.jsp?title=<%=rs.getString(1)%>"><%=rs.getString(1)%></a></td>
<td><%=rs.getString(2)%></td>
<td><a href="updateTitle_back.jsp?name=<%=rs.getString(1)%>">修改</a> <a href="javascript:deleteInformation('<%=rs.getString(1)%>')">删除</a></td>
</tr>
<%}}catch(Exception e){}%>
</table>
<table width="600" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="556" height="26" align="right" bgcolor="#FFFFFF"><a href="addTitle_back.jsp">添加主题</a></td>
<td width="44" align="right" bgcolor="#FFFFFF"> </td>
</tr>
</table></td>
</tr>
</table>
2.添加主题操作
使用的数据表:tb_title。
主要技术:通过JavaBean技术实现投票主题添加功能。
在图15.14中单击“添加主题”超级链接,进入添加主题信息页面,如图15.15所示。

图15.15 添加主题信息页面
通过form表单编写添加主题的关键代码如例程15-9所示。
例程15-9:mr\15\wy_vote\WebRoot\addTitle_back.jsp
<jsp:useBean id="showTime" scope="request" class="com.tool.ShowTime"/>
<jsp:useBean id="chinese" scope="request" class="com.tool.Chinese"/>
<b><font size="+1">添加主题</font></b>
<form name="form" method="post" action="dealWith.jsp?method=2">
<table width="527" border="1" cellpadding="0" cellspacing="0" bordercolor="#FFFFFF" bordercolordark= "#DEDFDE" bordercolorlight="#FFFFFF">
<tr align="center" bgcolor="#FFFFFF">
<td width="130" height="40" bgcolor="#FFFFFF">主题名称:</td>
<td width="391" bgcolor="#FFFFFF"><input name="name" type="text" size="50"></td>
</tr>
<tr align="center" bgcolor="#FFFFFF">
<td height="40" bgcolor="#FFFFFF">创建时间:</td>
<td bgcolor="#FFFFFF"> <%=showTime.currentlyTime()%><input name="time" type="hidden" value="<%=showTime.currentlyTime()%>"></td>
</tr>
</table><br>
<input type="submit" name="Submit" value="添加">
<input type="reset" name="Submit2" value="重置">
<input type="button" name="Submit3" value="返回" onClick="javascript:window.location.href= 'main_back.jsp';">
</form></td>
</tr>
</table><br>
<%if(request.getParameter("information")!=null){out.print(chinese.toChinese(request.getParameter("infor- mation")));} %>
在图15.15中输入主题信息后,单击“添加”按钮,触发的“dealWith.jsp?method=2”,当method=2时,在dealWith.jsp页中实现的主题信息添加功能,实现主题信息添加功能的关键代码如例程15-10所示。
例程15-10:mr\15\wy_vote\WebRoot\dealWith.jsp
<jsp:useBean id="chinese" class="com.tool.Chinese" scope="request"/>
<jsp:useBean id="connection" class="com.tool.JDBConnection" scope="request"/>
<%
int method=Integer.parseInt(request.getParameter("method"));
String sql_title="";
String sql_vote="";
String information="";
switch(method){
case 2: //添加主题信息操作
String addName=chinese.toChinese(request.getParameter("name")).trim();
String addTime=chinese.toChinese(request.getParameter("time")).trim();
sql_title="insert into tb_title values ('"+addName+"','"+addTime+"')";
information="由于您添加主题的名称重复,添加数据失败!!!";
if(connection.executeUpdate(sql_title)){
information="添加主题成功,请继续添加!!!";
}
connection.closeConnection();
%>
<script language="javascript">window.location.href='addTitle_back.jsp?information= <%=information%>'; </script>
<%
break;
}
%>
3.修改主题操作
使用的数据表:tb_title。
主要技术:通过JavaBean技术实现修改投票主题的功能。
如图15.14所示,选择一组要修改的信息,单击相应的“修改”超链接,进入修改主题信息页面,如图15.16所示。

图15.16 修改主题信息页面
通过form表单编写修改主题的关键代码如例程15-11所示。
例程15-11:mr\15\wy_vote\WebRoot\updateTitle_back.jsp
<jsp:useBean id="showTime" scope="request" class="com.tool.ShowTime"/>
<jsp:useBean id="chinese" scope="request" class="com.tool.Chinese"/>
<form name="form" method="post" action="dealWith.jsp?method=3&oldName=<%= chinese.toChinese (request.getParameter("name"))%>">
<table width="527" border="1" cellpadding="0" cellspacing="0">
<tr align="center" bgcolor="#FFFFFF">
<td width="130" height="40" bgcolor="#FFFFFF">修改主题名称:</td>
<td width="391" bgcolor="#FFFFFF"><input name="name" type="text" size="50" value="<%= chinese.toChinese(request.getParameter("name"))%>"></td> //事先修改主题信息内容
</tr>
<tr align="center" bgcolor="#FFFFFF">
<td height="40" bgcolor="#FFFFFF">修改创建时间:</td>
<td bgcolor="#FFFFFF"> <%=showTime.currentlyTime()%><input name="time" type= "hidden" value="<%=showTime.currentlyTime()%>"></td>
</tr>
</table><br>
<input type="submit" name="Submit" value="修改">
<input type="reset" name="Submit2" value="重置">
<input type="button" name="Submit3" value="返回" onClick="javascript:window. location.href= 'main_back.jsp';">
</form></td>
通过上述代码修改主题信息后,单击“修改”按钮,触发“dealWith.jsp?method=3”,当method=3时,在dealWith.jsp页中实现主题信息的修改功能。实现主题信息修改功能的关键代码如例程15-12所示。
例程15-12:mr\15\wy_vote\WebRoot\dealWith.jsp
<jsp:useBean id="chinese" class="com.tool.Chinese" scope="request"/>
<jsp:useBean id="connection" class="com.tool.JDBConnection" scope="request"/>
<%
int method=Integer.parseInt(request.getParameter("method"));
String sql_title="";
String sql_vote="";
String information="";
switch(method){
case 3: //修改主题信息操作
String oldName=chinese.toChinese(request.getParameter("oldName")).trim();
String updateName=chinese.toChinese(request.getParameter("name")).trim();
String updateTime=chinese.toChinese(request.getParameter("time")).trim();
sql_title="update tb_title set name='"+updateName+"',createTime='"+updateTime+"' where name= '"+oldName+"'";
information="由于您修改主题的名称重复,修改数据失败!!!";
if(connection.executeUpdate(sql_title)){
sql_vote="update tb_votetitle set title='"+updateName+"' where title='"+oldName+"'";
connection.executeUpdate(sql_vote);
information="修改主题成功!!!";
}
connection.closeConnection();
%>
<script language="javascript">window.location.href='addTitle_back.jsp?information= <%=information%>'; </script>
<%
break;
}
%>
4.删除主题操作
使用的数据表:tb_title。
主要技术:通过JavaBean技术实现删除投票主题的功能。
如图15.14所示,选择一组要删除的信息,单击相应的“删除”超链接,触发的是要删除该信息的脚本语言,该脚本语言在validate.js文件中,具体代码如例程15-13所示。
例程15-13:mr\15\wy_vote\WebRoot\js\validate.js
function deleteInformation(title){
if(confirm("您真的要删除吗?")){
window.location.href="dealWith.jsp?method=4&title="+title;
}
}
单击“删除”超级链接,触发上面的代码,弹出如图15.17所示的提示信息。
单击“确定”按钮,触发的是“dealWith.jsp?method=4”。当method=4时,在dealWith.jsp页中实现删除主题信息的功能。实现删除主题信息的关键代码如例程15-14所示。
例程15-14:mr\15\wy_vote\WebRoot\dealWith.jsp
<jsp:useBean id="chinese" class="com.tool.Chinese" scope="request"/>
<jsp:useBean id="connection" class="com.tool.JDBConnection" scope="request"/>
<%
int method=Integer.parseInt(request.getParameter("method"));
String sql_title="";
String sql_vote="";
String information="";
switch(method){
case 4: //删除主题信息操作
String deleteName=chinese.toChinese(request.getParameter("title")).trim();
sql_title="delete from tb_title where name='"+deleteName+"'";
sql_vote="delete from tb_votetitle where title='"+deleteName+"'";
connection.executeUpdate(sql_title);
connection.executeUpdate(sql_vote);
information="删除主题成功!!!";
connection.closeConnection();
%>
<script language="javascript">window.location.href='addTitle_back.jsp?information= <%=information%>'; </script>
<%
break;}%>
5.安全退出模块
当管理员对后台信息维护完毕后,单击网页上侧的“安全退出”超链接,该超链接触发的是脚本语言的quit()方法。该脚本语言在validate.js文件中代码如例程15-15所示。
例程15-15:mr\15\wy_vote\WebRoot\js\validate.js
function quit(){
if(confirm("您真的要退出吗?")){
window.location.href="dealWith.jsp?method=1";
}
}
单击“安全退出”超级链接,触发上面的代码,弹出如图15.18所示的提示信息。
单击“确定”按钮,触发的是“dealWith.jsp?method=1”。当method=1时,在dealWith.jsp页面中实现退出后台功能。实现退出后台功能的关键代码如例程15-16所示。
例程15-16:mr\15\wy_vote\WebRoot\dealWith.jsp
switch(method){
case 1: //管理员安全退出操作
session.invalidate();
response.sendRedirect("index.jsp"); //页面重定向为网站的首页面
break;
}
注意:如图15.14所示,选中一组投票主题信息,单击相应的主题名称的超链接,进入维护该主题选项的模块,该模块与维护投票主题模块实现的功能基本相同,读者可以参考光盘中的源程序,这里就不再赘述了。
15.4.9 用户投票模块
使用的数据表:tb_title、tb_titlevote。
主要技术:通过JavaBean技术实现用户投票的功能。
在网站的首页面中单击“进入投票页面”超级链接,触发的是vote_front.jsp页面,该页面的运行结果如图15.19所示。

图15.19 用户进行投票选项
由于后台数据库中只存在两个主题信息,因此,页面中只显示两个投票选项,该页面的关键代码如例程15-17所示。
例程15-17:mr\15\wy_vote\WebRoot\vote_front.jsp
<jsp:useBean id="connection" scope="request" class="com.tool.JDBConnection"/>
<form name="form" method="post" action="dealWith.jsp?method=8">
<%
int i=0;
try{
String title="";
String sql_title="select * from tb_title";
ResultSet rs_title=connection.executeQuery(sql_title);
while(rs_title.next()){ //循环tb _title表中的内容
title=rs_title.getString("name");
i++;
%>
<table width="594" height="32" border="0" cellpadding="0" cellspacing="0" >
<tr align="center">
<td width="645"><br><strong><%=i%>.<%=title%></strong><br><br>
<table width="229" height="32" border="1" cellpadding="0" cellspacing="0">
<%
String sql_vote="select * from tb_votetitle where title='"+title+"'";
ResultSet rs_vote=connection.executeQuery(sql_vote);
int j=0;
while(rs_vote.next()){ //循环tb_votetitle表中的内容
int number=Integer.parseInt(rs_vote.getString("number"));
j++;
%>
<tr align="center">
<td width="163"><%=rs_vote.getString("voteName")%></td>
<td width="60"><input type="checkbox" name="id_<%=j%>" value="<%=rs_vote.getString("id")%>" ></td>
</tr>
<%}%>
</table>
</tr>
</table>
<hr> <%}%>
<div align="right">
<%}catch (Exception e){}%>
<input type="image" name="Submit" src="image/sure.jpg">
</div></td>
<td width="50"> </td>
</tr> </form>
在上述代码中,用户对投票选项选择后,单击“投票”按钮,触发的是“dealWith.jsp? method=8”。当method=8时,在dealWith.jsp页面中实现投票功能。实现投票功能的关键代码如例程15-18所示。
例程15-18:mr\15\wy_vote\WebRoot\dealWith.jsp
<jsp:useBean id="chinese" class="com.tool.Chinese" scope="request"/>
<jsp:useBean id="connection" class="com.tool.JDBConnection" scope="request"/>
<%
int method=Integer.parseInt(request.getParameter("method"));
String sql_title="";
String sql_vote="";
String information="";
switch(method){
case 8: //进行投票
int count=0;
sql_vote="select * from tb_votetitle";
ResultSet rs=connection.executeQuery(sql_vote);
try{
while (rs.next()){
count=count+1;
}
}catch(Exception e){}
for(int i=0;i<count;i++){ //以下代码实现的是循环更新的操作
String strId=request.getParameter("id_"+String.valueOf(i+1));
if(strId!=null){
String sql="update tb_votetitle set number=number+1 where id='"+strId+"'";
connection.executeUpdate(sql);
}
connection.closeConnection();
}
session.setAttribute("vote","voted"); //将已经投票过的客户端机器保存session中
%>
<script language="javascript">window.location.href='addTitle_back.jsp?information=<%=information%>'; </script>
<%
break;
}
%>
15.4.10 查询投票模块
使用的数据表:tb_title、tb_titlevote。
主要技术:通过JavaBean技术实现用户投票查询功能。
在网站的首页中单击“进入查看票数页面”超级链接,触发的是query_front.jsp页,该页的运行结果如图15.20所示。
实现查询投票统计的关键代码如例程15-19所示。

图15.20 查询投票统计
例程15-19: mr\15\wy_vote\WebRoot\query_front.jsp
<jsp:useBean id="connection" scope="request" class="com.tool.JDBConnection"/>
<%
//以下代码将tb_title表中投票主题进行循环
int i=0;
try{
String title="";
String sql_title="select * from tb_title";
ResultSet rs_title=connection.executeQuery(sql_title);
while(rs_title.next()){
title=rs_title.getString("name");
i++;
%>
<table width="645" height="32" border="0" cellpadding="0" cellspacing="0" >
<tr align="center">
<td width="645"><br><strong><%=i%>.<%=title%></strong><br><br>
<table height="32" border="1" cellpadding="0" cellspacing="0">
<%
//以下代码将投票主题的所有票数进行累加
int count=0;
String sqlcount="select sum(number) as number from tb_votetitle where title='"+title+"'";
ResultSet rscount=connection.executeQuery(sqlcount);
while(rscount.next()){
count=Integer.parseInt(rscount.getString("number"));
if(count==0){
count=1;
}
}
//以下代码将投票主题所对应的选项进行循环显示
String sql_vote="select * from tb_votetitle where title='"+title+"'";
ResultSet rs_vote=connection.executeQuery(sql_vote);
while(rs_vote.next()){
int number=Integer.parseInt(rs_vote.getString("number"));
%>
<tr align="center">
<td width="74">选项名称:</td>
<td width="210"><%=rs_vote.getString("voteName")%></td>
<td width="99">票数:</td>
<td width="74"><%=number%></td>
<td width="82">所占比例:</td>
<td width="61"><%=number*100/count%>%</td>
</tr>
<%}%>
</table><br></td>
</tr>
</table>
<hr>
<%}%>
<%}catch (Exception e){}%> </td>
<td width="50"> </td>
</tr>
</table>
15.4.11 用户一次性投票
在处理用户一次性投票时,本例将验证客户端用户是否进行投票的代码放在vote_front.jsp页面中。在该页面中验证用户是否进行投票的关键代码如例程15-20所示。
例程15-20:mr\15\wy_vote\WebRoot\vote_front.jsp
<%
String vote=(String)session.getAttribute("vote");
if(vote!=null){
response.sendRedirect("index.jsp");
}
%>





