struts2和DBUtils结合做的一个投票系统练习

需求分析:

题目:投票

二 功能要求

具体要求如下:

项目首页显示所有投票结果,按照创建时间降序排列

点击主题进入到查看页面,每次点击后,查看次数都增加1.查看页面效果图如下。百分比计算是根据总票数和该主题人数计算出的

当点击“我要投票”时,先判断用户是否选择了一项,如果没有选择给出下面提示

如果用户正确操作,对该选项的投票次数加1,并让主题表subjects中相关主题的投票人数加1。完成把最总结过显示到相关页面中

给定如下数据表结构

-------投票系统入口-------------index.jsp-------<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>投票系统入口</title>
</head>
<body>
    <a href="${pageContext.request.contextPath }/vote_findAll.action">入口</a>
</body>
</html>
--------------主题页面展示----------------------------------------votelist.jsp------------------------<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查看投票信息</title>
</head>
<body>
 <table border="1px" align="center">
  <tr align="center">
    <td>序号</td>
    <td>主题</td>
    <td>投票/查看</td>
    <td>创建时间</td>
  </tr>
  <c:forEach items="${sublist }" var="vote">
  <tr>
      <td>${vote.id }</td>
    <td><a href="${pageContext.request.contextPath }/vote_selectVote.action?id=${ vote.id }">${ vote.title }</a></td>
    <td>${vote.totalVotes }/${vote.viewTimes }</td>
    <td>${vote.createDate }</td>
    </tr>
  </c:forEach>
  </table>
</body>
</html>
-----------------------投票页面-------------------------------------------------------------handlevote.jsp----------------------------------<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="js/jquery-2.1.4.js"></script>
<title>投票页面</title>
</head>
<body>
<center>
<input type="hidden" value="${subjects.id }" id="sid">
<h3>${subjects.title }</h3>
${subjects.viewTimes}次查看,共有${subjects.totalVotes }人投票
  <form method="post" action="${pageContext.request.contextPath }/vote_finishVote.action?optContent=${op.optContent}&sid=${subjects.id }">
    <table>
    <c:forEach items="${optlist }" var="op">
    <tr>
        <td>${op.id }</td>
        <td><input type="radio" name="optContent" value="${op.optContent }">${op.optContent}</td>
        <td>${op.vote }票</td>
        <td><fmt:formatNumber type="number" value="${op.vote/subjects.totalVotes*100 }" maxFractionDigits="2"/>%</td>
    </tr>
    </c:forEach>
    <tr>
        <td colspan="3"><input type="submit" value="我要投票" onclick="return chooseVote()"/><td>
        <td><a href="${pageContext.request.contextPath }/vote_findAll.action">返回首页</a></td>
    </tr>
    </table>
  </form>
</center>
</body>

    <script type="text/javascript">
        function chooseVote(){
            var content = $("input[name=‘optContent‘]:checked").val();
            if(content == null){
                alert("请从列表中选择一项完成投票!!!");
                return false;
            }
            return true;
        }
    </script>
</html>
--------------------------投票完成后展示的页面----------------------------------------------------------finishhandle.jsp---------------------------------<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
       <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
       <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>完成</title>
</head>
<body>
<h3>完成投票:${subjects.title }</h3>
${subjects.viewTimes}次查看,共有${subjects.totalVotes }人投票
<table>
 <c:forEach items="${optlist }" var="op">
    <tr>
        <td>${op.id }</td>
        <td>${op.vote }票</td>
        <td><fmt:formatNumber type="number" value="${op.vote/subjects.totalVotes*100 }" maxFractionDigits="2"/>%</td>
    </tr>
    </c:forEach>
    <tr>
        <td><a href="${pageContext.request.contextPath }/vote_findAll.action">返回首页</a></td>
    </tr>
    </table>
</body>
</html>

Struts.jsp和struts-vote.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 配置常量-->
    <!-- 配置struts2编码常量只针对post提交方式
         get提交方式的乱码问题需要我们手动解决
    -->
    <constant name="struts.i18n.encoding" value="UTF-8"/>
    <!-- 配置访问action的后缀名 -->
    <constant name="struts.action.extension" value="action,,"/>
    <!--
        struts.devMode:struts2的开发者模式
        在开发阶段:我们一般都会设置为true,这样我们在修改struts.xml的时候,就不用重启服务器了
        生产环境,设置为false
     -->
    <constant name="struts.devMode" value="true"/>
    <!-- 引入关联配置文件 -->
    <include file="struts-vote.xml"/>

</struts>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="bamaw" namespace="/" extends="struts-default">
        <action name="vote_*" class="com.tbamaw.web.action.VoteAction" method="{1}">
            <result name="queryAll">/WEB-INF/jsp/votelist.jsp</result>
            <result name="selectVote">/WEB-INF/jsp/handlevote.jsp</result>
            <result name="finishVote">/WEB-INF/jsp/finishhandle.jsp</result>
        </action>
    </package>
</struts>

action

package com.tbamaw.web.action;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.tbamaw.domain.Options;
import com.tbamaw.domain.Subjects;
import com.tbamaw.service.OptionsService;
import com.tbamaw.service.SubjectsService;

public class VoteAction extends ActionSupport{

    private static final long serialVersionUID = 1L;
    private int id;
    private int sid;
    private String optContent;
    private Subjects subjects = new Subjects();
    private SubjectsService subjectsService = new SubjectsService();
    private List<Subjects> sublist = new ArrayList<Subjects>();
    private List<Options> optlist = new ArrayList<Options>();

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public Subjects getSubjects() {
        return subjects;
    }
    public void setSubjects(Subjects subjects) {
        this.subjects = subjects;
    }
    public List<Options> getOptlist() {
        return optlist;
    }
    public void setOptlist(List<Options> optlist) {
        this.optlist = optlist;
    }
    public List<Subjects> getSublist() {
        return sublist;
    }
    public void setSublist(List<Subjects> sublist) {
        this.sublist = sublist;
    }
    public String getOptContent() {
        return optContent;
    }
    public void setOptContent(String optContent) {
        this.optContent = optContent;
    }
    /**
     * 查询首页信息 subject
     * @return 跳转到votelist.jsp
     * @throws SQLException
     */
    public String findAll() throws SQLException {
        sublist = subjectsService.findAll();
        return "queryAll";
    }

    /**
     * 选择投票
     * @return 跳转到投票页面
     * @throws SQLException
     */
    public String selectVote() throws SQLException {
        subjectsService.checkCount(id);
        optlist = OptionsService.findForOptionsBySid(id);
        subjects = subjectsService.findById(id);
        return "selectVote";
    }

    /**
     * 投票完成后执行
     * @return 跳转到finishVote对应的页面
     * @throws SQLException
     * 问题:通过jsp传过来的optContent中存在“,”;经过各种尝试,没能实现去掉逗号
     *        只能采取optContent.substring(optContent.indexOf(",")+2)这种方法;
     *
     */
    public String finishVote() throws SQLException {

        //用户正确操作,对该选项的投票次数加1
        optContent = optContent.substring(optContent.indexOf(",")+2);
        OptionsService.updateVoteNumber(optContent,sid);
        //给主题表subjects中相关主题的投票人数加1,然后响应到页面
        subjectsService.updateTotalVotes(sid);
        //再查询一次,核算投票百分比
        optlist = OptionsService.findForOptionsBySid(sid);
        subjects = subjectsService.findById(sid);
        return "finishVote";

    }
}

service(OptionsService和SubjectsService)

package com.tbamaw.service;

import java.sql.SQLException;
import java.util.List;

import com.tbamaw.dao.OptionsDao;
import com.tbamaw.domain.Options;

public class OptionsService {

    /**
     * 通过options中的sid查出options里面的内容
     * @param id = sid
     * @return
     * @throws SQLException
     */
    public static List<Options> findForOptionsBySid(int id) throws SQLException {
        return OptionsDao.findForOptionsBySid(id);
    }

    /**
     * 用户正确操作,对该选项的投票次数加1
     * @param optContent 选项内容
     * @param id = sid
     * @throws SQLException
     */
    public static void updateVoteNumber(String optContent, int sid) throws SQLException {
        OptionsDao.updateVoteNumber(optContent,sid);
    }

}
package com.tbamaw.service;

import java.sql.SQLException;
import java.util.List;
import com.tbamaw.dao.SubjectsDao;
import com.tbamaw.domain.Subjects;

public class SubjectsService {

    private SubjectsDao subjectsDao = new SubjectsDao();

    /**
     * 查询首页信息
     * @return voteDao.findAll();
     * @throws SQLException
     */
    public List<Subjects> findAll() throws SQLException {
        return subjectsDao.findAll();
    }
    /**
     * 增加查看次数
     * @param id
     * @throws SQLException
     */
    public void checkCount(int id) throws SQLException {
        subjectsDao.checkCount(id);
    }

    /**
     * 通过sub的id查询跳转过来的查看次数和投票数
     * @param id
     * @return
     * @throws SQLException
     */
    public Subjects findById(int id) throws SQLException {
        return subjectsDao.findById(id);
    }

    /**
     * 给主题表subjects中相关主题的投票人数加1
     * @param id = sid
     * @return subjects
     * @throws SQLException
     */
    public void updateTotalVotes(int id) throws SQLException {
        subjectsDao.updateTotalVotes(id);
    }
}

dao(OptionsDao和SubjectsDao)

public class OptionsDao {

    /**
     * 通过options中的sid查出options里面的内容
     * @param id = sid
     * @return
     * @throws SQLException
     */
    public static List<Options> findForOptionsBySid(int id) throws SQLException {
        QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "select * from options where sid =?";
        return qr.query(sql, new BeanListHandler<Options>(Options.class),id);
    }

    /**
     * 用户正确操作,对该选项的投票次数加1
     * @param optContent 选项内容
     * @param id = sid
     * @throws SQLException
     */
    public static void updateVoteNumber(String optContent, int sid) throws SQLException {
        QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "update options set vote=(vote+1) where sid=? and optContent=?";
        qr.update(sql,sid,optContent);

    }

}
public class SubjectsDao {

    /**
     * 查询首页
     * @return
     * @throws SQLException
     */
    public List<Subjects> findAll() throws SQLException {
        QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "select * from subjects";
        return qr.query(sql, new BeanListHandler<Subjects>(Subjects.class));
    }

    /**
     * 增加查看次数
     * @param id
     * @throws SQLException
     */
    public void checkCount(int id) throws SQLException {
        QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "update subjects set viewTimes=(viewTimes+1) where id=?";
        qr.update(sql,id);
    }

    /**
     * 通过sub的id查询跳转过来的查看次数和投票数
     * @param id
     * @return
     * @throws SQLException
     */
    public Subjects findById(int id) throws SQLException {
        QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "select * from subjects where id = ?";
        return qr.query(sql, new BeanHandler<Subjects>(Subjects.class),id);
    }

    /**
     * 给主题表subjects中相关主题的投票人数加1
     * @param id = sid
     * @return subjects
     * @throws SQLException
     */
    public void updateTotalVotes(int id) throws SQLException {
        QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "update subjects set totalVotes=(totalVotes+1) where id=?";
        qr.update(sql,id);
    }

}

domain

public class Options {
    private int id;//选项id
    private String optContent;//选项内容
    private int vote;//得票数
    private int sid;//主题id
    public Options() {}

    public Options(String optContent, int vote, int sid) {
        this.optContent = optContent;
        this.vote = vote;
        this.sid = sid;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getOptContent() {
        return optContent;
    }
    public void setOptContent(String optContent) {
        this.optContent = optContent;
    }
    public int getVote() {
        return vote;
    }
    public void setVote(int vote) {
        this.vote = vote;
    }
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
}
public class Subjects {

    private int id;//主题id
    private String title;//主题名
    private int totalVotes;//投票人数
    private int viewTimes;//查看次数
    private Date createDate;//创建时间
    public Subjects() {}

    public Subjects(String title, int totalVotes, int viewTimes, Date createDate) {
        this.title = title;
        this.totalVotes = totalVotes;
        this.viewTimes = viewTimes;
        this.createDate = createDate;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public int getTotalVotes() {
        return totalVotes;
    }
    public void setTotalVotes(int totalVotes) {
        this.totalVotes = totalVotes;
    }
    public int getViewTimes() {
        return viewTimes;
    }
    public void setViewTimes(int viewTimes) {
        this.viewTimes = viewTimes;
    }
    public Date getCreateDate() {
        return createDate;
    }
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
}

结构图:

首页主题展示

判断

投票

投票完成

时间: 2024-11-07 19:43:39

struts2和DBUtils结合做的一个投票系统练习的相关文章

mvc4中使用angularjs实现一个投票系统

数据库是用EF操作,数据表都很简单中,从代码中也能猜出表的结构,所以关于数据库表就不列出了 投票系统实现还是比较简单,投票部分使用ajax实现,评论部分是使用angularjs实现,并且页面每隔几秒(可以自己间隔时间)就从服务器异步获取评论数据,并通过angularjs的双向绑定功能自动更新数据(这部分其实完全可以使用websocket - singarlR完成,将更加简洁).评论是按分页显示,所以还使用到了pagedList组件,具体可以看我以前部分. 使用到的 js <link href=&qu

利用django创建一个投票网站(五)

创建你的第一个 Django 项目, 第五部分 这一篇从第四部分(en)结尾的地方继续讲起.我们在前几章成功的构建了一个在线投票应用,在这一部分里我们将其创建一些自动化测试. 自动化测试简介 自动化测试是什么? 测试,是用来检查代码正确性的一些简单的程序. 测试在不同的层次中都存在.有些测试只关注某个很小的细节(某个模型的某个方法的返回值是否满足预期?),而另一些测试可能检查对莫个软件的一系列操作(某一用户输入序列是否造成了预期的结果?).其实这和我们在教程的第一部分(zh)里做的并没有什么不同

利用django创建一个投票网站(四)

创建你的第一个 Django 项目, 第四部分 这一篇从第三部分(zh)结尾的地方继续讲起.我们将继续编写投票应用,专注于简单的表单处理并且精简我们的代码. 编写一个简单的表单 让我们更新一下在上一个教程中编写的投票详细页面的模板("polls/detail.html"),让它包含一个 HTML <form>元素: <!--- polls/template/polls/detail.html --> <h1>{{ question.question_

django 搭建一个投票类网站(一)

写在最前,之前零零散散的看过django,但是由于比较杂,学的云里雾里的,所以就停了一段落,但是我最近找到了一个django的书,是李建编著的django入门与实践,于是,打算照着书上的步骤来写好一个网站,希望能在结束后了解并懂得怎么使用django了吧,共勉 话不多说,这本书前面写了很详细的html,js,css,以及python编程基础,我就直接从django部分开始吧 在开始之前一定要安装django 1.创建Django工程 首先创建一个名为demo的文件,然后在cmd里进入demo目录

FMX相当于在界面上自己又做了一个小操作系统

FMX的自画界面我也不看好,比如复制粘贴,太丑了,系统做得很好很精细的复制粘贴界面,就是无法调出,比如MIUI,复制粘贴还能有个放大镜,可以选择到屏幕边缘的文字,可以选择剪贴板内多个可粘贴的文字:还有那个Memo,有的时候该折行的不折行,有的文字看不到了.文本输入框,隐藏剪贴板后,再点击就弹不出来了:系统本身的文本框就没有这个问题.底部输入框输入时自动上移界面,好像是操作系统本身就有的吧,FMX还得自己编很多代码,也不一定编好.自己编码补漏洞是另外一回事.FMX给我的感觉是在界面上自己又做了一个

【随笔】昨晚做了一个梦

昨晚做了一个梦,可能是最近玩<魔兽世界>的缘故,梦的风格很游戏~ 当然,关键不在于这个梦的风格啦,在于一个片段的内容.与 邪恶者的斗争过程中,兄弟我临危受命,去寻找传说中的“先知”(不知道在梦中叫什 么,因为记不清了,叫“仙女”??).我自然是不费吹灰之力就找到了那妹妹~并非出现在天上,只是坐着马车的一个白衣妹妹.见到她,当然很高兴,可是在我 询问问题的时候,似乎忘记了我的使命,问出的问题居然是“我和小耗子会幸福一生么?”答案我很满意,她说“当然,你们会幸福一生”,嗯嗯,尽管是个梦,可 是说不

自己做的一个输入输出缓冲池

2014-05-15 22:02 by Jeff Li 前言 系列文章:[传送门] 马上快要期末考试了,为了学点什么.就准备这系列的博客,记录复习的成果. 正文-计数  概率 概率论研究随机事件.它源于赌徒的研究.即使是今天,概率论也常用于赌博.随机事件的结果是否只凭运气呢?高明的赌徒发现了赌博中的规律.尽管我无法预知事件的具体结果,但我可以了解每种结果出现的可能性.这是概率论的核心. "概率"到底是什么?这在数学上还有争议."频率派"认为概率是重复尝试多次,某种结

用MVVM做了一个保存网页的工具-上篇

前言: 你是否有过收藏了别人博客或文章,当想用的时候却找不到?你是否有过收藏了别人博客或文章,却因为没有网络而打不开网页?OK,下面是我做的一个工具,有兴趣的同学们可以download 玩下,哈哈^.^

我想做产品,我希望设计一个电脑系统的一个自动化管理程序

我希望能做一个电脑系统的程序,它能够,让我自定义的,选择是电脑上某些时候,自动的开启,自动关机,然后帮我充的,以保证秩序的顺序,打开我的某些程序,并进入到某些步骤,或者说保留我的某些不知道工作. 原因,因为,我们,作为一个如何现在现在画的现代化的一个工作,大概很多人都会与电脑经常打交道,甚至有非常多的人每天,的工作就是借助电脑来完成,所以说大家一定让他教他的时间非常多,然后在这个时候我们会开启不同的关机,不让他去打开电脑,浪费了很多时间和精力,去,降低我们的效率,如果说有一个程序能够帮我们实现,