投票系统开发总结struts2,jfreechart,cookie应用,以及前端技术

 

struts2配置web.xml+struts.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <filter>                                <!--定义核心Filter FilterDispatcher -->
        <filter-name>struts2</filter-name>    <!-- 定义核心Filter的名称 -->
        <filter-class>                        <!--定义核心Filter的实现类 -->
            org.apache.struts2.dispatcher.FilterDispatcher
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name><!--核心Filter的名称 -->
        <url-pattern>/*</url-pattern><!--使用该核心Filter过滤所有的Web请求 -->
    </filter-mapping>
</web-app>

 

struts.xml里配置action:

<?xml version="1.0" encoding="UTF-8" ?><!-- XML声明 -->
<!DOCTYPE struts PUBLIC
 "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
 "http://struts.apache.org/dtds/struts-2.1.dtd"><!-- 指定Struts 2配置文件的DTD信息 -->
<struts><!-- 根节点 -->
    <constant name="struts.i18n.encoding" value="gb2312"></constant>
    <package name="struts2" extends="jfreechart-default">
         <action name="addVote" class="com.sanqing.action.AddVoteAction">
             <result name="success">/admin/addVote.jsp</result>
         </action>
         <action name="showVote" class="com.sanqing.action.ShowVoteAction">
             <result name="success">/admin/showVote.jsp</result>
         </action>
         <action name="deleteVote" class="com.sanqing.action.DeleteVoteAction">
             <result name="success" type="chain">showVote</result>
         </action>
         <action name="showVoteByChannel" class="com.sanqing.action.ShowVoteByChannelAction">
             <result name="success">index.jsp</result>
             <result name="input">index.jsp</result>
         </action>
         <action name="voteResult" class="com.sanqing.action.VoteResultAction">
             <result name="success" type="chart">
                 <param name="width">400</param>
                 <param name="height">300</param>
             </result>
         </action>
         <action name="doVote" class="com.sanqing.action.DoVoteAction">
             <result name="success" type="chain">voteResult</result>
             <result name="input" type="chain">showVoteByChannel</result>
         </action>
     </package>    
</struts>

 AddVoteAction.java:

package com.sanqing.action;

import java.util.UUID;

import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.bean.Vote;
import com.sanqing.bean.VoteOption;
import com.sanqing.dao.VoteDAO;
import com.sanqing.dao.VoteOptionDAO;
import com.sanqing.daoFactory.VoteDAOFactory;
import com.sanqing.daoFactory.VoteOptionDAOFactory;

public class AddVoteAction extends ActionSupport {
    private int channel;        // 封装channel参数
    private String voteName;    // 封装voteName参数
    private String[] voteOption;// 封装voteOption参数

    public int getChannel() {
        return channel;
    }

    public void setChannel(int channel) {
        this.channel = channel;
    }

    public String getVoteName() {
        return voteName;
    }

    public void setVoteName(String voteName) {
        this.voteName = voteName;
    }

    public String[] getVoteOption() {
        return voteOption;
    }

    public void setVoteOption(String[] voteOption) {
        this.voteOption = voteOption;
    }

    public String execute() throws Exception {
        VoteDAO voteDAO = VoteDAOFactory.getVoteDAOInstance();//获得VoteDAO实例
        VoteOptionDAO voteOptionDAO = 
            VoteOptionDAOFactory.getVoteOptionDAOInstance();//获得voteOption实例
        //首先保存投票,然后再保存投票选项
        Vote vote = new Vote();
        vote.setChannelID(channel);
        vote.setVoteName(voteName);
        voteDAO.addVote(vote);
        //查询投票ID
        int voteID = voteDAO.findVoteByName(voteName).getVoteID();
        //保存投票选项
        for(String voteOptionName : voteOption) {
            VoteOption vp = new VoteOption();
            vp.setVoteID(voteID);
            vp.setVoteOptionName(voteOptionName);
            voteOptionDAO.addVoteOption(vp);
        }
        return this.SUCCESS;
    }

}

 struts2下面JfreeChart,参考:http://www.cnblogs.com/rixiang/p/5249560.html

struts.xml下配置action:

   <action name="voteResult" class="com.sanqing.action.VoteResultAction">
    <result name="success" type="chart">
     <param name="width">400</param>
     <param name="height">300</param>
    </result>
   </action>

action:

package com.sanqing.action;

import java.util.List;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;

import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.bean.Vote;
import com.sanqing.bean.VoteOption;
import com.sanqing.dao.VoteDAO;
import com.sanqing.dao.VoteOptionDAO;
import com.sanqing.daoFactory.VoteDAOFactory;
import com.sanqing.daoFactory.VoteOptionDAOFactory;

public class VoteResultAction extends ActionSupport {
    private JFreeChart chart;
    private int voteID;//投票ID
    
    public int getVoteID() {
        return voteID;
    }

    public void setVoteID(int voteID) {
        this.voteID = voteID;
    }

    public JFreeChart getChart() {
        VoteDAO voteDAO = VoteDAOFactory.getVoteDAOInstance();//获得VoteDAO实例
        VoteOptionDAO voteOptionDAO = 
            VoteOptionDAOFactory.getVoteOptionDAOInstance();//获得voteOption实例
        //根据投票ID得到的投票
        Vote vote = voteDAO.findVoteById(voteID);
        String voteName = vote.getVoteName();    //得到投票名称
        
        //根据投票ID得到所有的投票选项
        List<VoteOption> voteOptions = voteOptionDAO.findVoteOptionByVoteID(voteID);
        
        DefaultCategoryDataset dcd = new DefaultCategoryDataset();//数据源
        
        //设置数据
        for(VoteOption voteOption : voteOptions) {
            dcd.setValue(voteOption.getTicketNum(),"",voteOption.getVoteOptionName());
        }
        //使用工厂类创建柱状图
        JFreeChart chart = ChartFactory.createBarChart3D(
                voteName,
                "投票选项",
                "投票数", 
                dcd,
                PlotOrientation.VERTICAL ,
                false, 
                true,
                false);
        
        return chart;
    }

    public void setChart(JFreeChart chart) {
        this.chart = chart;
    }
    
    public String execute() throws Exception {
        return SUCCESS;
    }
}

 在项目中,如何防止用户一天之内重复投票呢?

有两种方法,一种是,数据库里保存投票记录,一种是使用cookie。

package com.sanqing.action;

import javax.servlet.http.Cookie;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.bean.VoteOption;
import com.sanqing.dao.VoteOptionDAO;
import com.sanqing.daoFactory.VoteOptionDAOFactory;

public class DoVoteAction extends ActionSupport{
    private int voteOptionID;
    private String otherOption;
    private int voteID;
    private int channelID;

    public int getChannelID() {
        return channelID;
    }
    public void setChannelID(int channelID) {
        this.channelID = channelID;
    }
    public int getVoteID() {
        return voteID;
    }

    public void setVoteID(int voteID) {
        this.voteID = voteID;
    }

    public int getVoteOptionID() {
        return voteOptionID;
    }

    public void setVoteOptionID(int voteOptionID) {
        this.voteOptionID = voteOptionID;
    }

    public String getOtherOption() {
        return otherOption;
    }

    public void setOtherOption(String otherOption) {
        this.otherOption = otherOption;
    }

    public String execute() throws Exception {
        VoteOptionDAO voteOptionDAO = VoteOptionDAOFactory
        .getVoteOptionDAOInstance();
        //首先判断用户是否能进行投票
        Cookie cookies[]= ServletActionContext.getRequest().getCookies();//取出cookies
        
        for(Cookie cookie : cookies) {//遍历cookies
            
            if(cookie.getValue().equals(Integer.toString(voteID))) {//如果用户已经投过票
                this.addActionError("您今天已经投过票了,请明天再来!");
                return this.INPUT;
            }
        }
        //判断是否选择其他选项
        if(voteOptionID == 0) {
            //添加该选项
            VoteOption voteOption = new VoteOption();
            voteOption.setVoteID(voteID);
            voteOption.setVoteOptionName(otherOption);
            voteOption.setTicketNum(1);
            voteOptionDAO.addVoteOption(voteOption);
        }else {
            //取出以前的投票选项
            VoteOption voteOption = voteOptionDAO.findVoteOptionById(voteOptionID);
            int ticketNum = voteOption.getTicketNum();
            //更新选项的投票数
            voteOption.setTicketNum(ticketNum + 1);
            voteOptionDAO.updateVoteOption(voteOption);
            //更新完成后,添加cookie,防止重复投票
            Cookie cookie = new Cookie("hasVote" + voteID,Integer.toString(voteID));
            ServletActionContext.getResponse().addCookie(cookie);
        }
        return this.SUCCESS;
    }
    
}

 

posted on 2016-03-07 09:42  J·Marcus  阅读(320)  评论(0编辑  收藏  举报

导航