javaweb项目----在线投票系统总结

javaweb项目----在线投票系统总结

1.注册
  • 使用Ajax进行验证注册的账户名是否已经存在,失去焦点事件

     $(function(){
            	 $("#username").blur(function(){
            		 var username=$("#username").val();	//获取输入框的值
            		 $.ajax({
            			 url:"${pageContext.request.contextPath}/RegisterServlet",
            			 data:{"username":username},
            			 type:"post",
            			 dataType: "json",
            			 success: function(data){
            				 if(data.flag==true){
            					 $("#msg").text("通过");	
            					 
            				 }else{
            					 $("#msg").text("账号已经存在,请重新输入");	
            				 }        				 
            			 },
            			 error:function(){
            				 alert("异步请求失败");
            			 }
            		 })
            	 })
             });
            					 
    
  • 传到后台servlet

    	String name=request.getParameter("username");
    	String password=request.getParameter("password");
    	String password1=request.getParameter("password1");
    

    	UserDao ud=new UserDao();
    	HttpSession session = request.getSession(false);
    	User user = null;
    	if (password1 == null) {
    		user = ud.SearchUser(name);//调用dao里面的方法查看用户名是否存在
    		PrintWriter out = response.getWriter();
    		if (user != null) {
    			user.setFlag(false);//表示用户名存在
    		} else {
    		//不存在就把注册的用户名存到数据库里面,发送到页面,在页面显示该用户名可以注册
    			user = new User();
    			user.setFlag(true);
    			user.setUsername(name);
    			session.setAttribute("user", user);
    		}
    		String userStr = JSONObject.toJSONString(user);
    		out.print(userStr);
    		return;
    	}
    	//如果用户名和密码不为空,就进行注册,把它存到数据库里面
    	if (name != null && password1 != null) {
    		ud.RegUser(name, password1);
    	}
    	request.getRequestDispatcher("registerSuccess.jsp").forward(request,
    			response);
    
    }
    
  • 验证密码是否一致

     function sub(){
    				var password=$("#password").val();//获取密码的值
    				var password1=$("#password1").val();
    				 
    			     if(password==""){//比较第一个密码框是否
    			            $("#pmsg1").html("密码不能为空");
    			      }else if(password1==""){
    			          $("#pmsg").html("sorry,重复密码不能为空");
    			      }else if(password!=password1){
    			          $("#pmsg").html("密码不一致");
    			      }else{
    			          $("#form").submit();
    			      }
    			 }
    
2.显示列表分页

private int page = 1;//第一页
private int pageSize = 5;//当前页面的大小
  • 调用dao里面的方法,使用MySQL关键字limit

    public List<Article> findArticle(int page,int pageSize){
    		Connection con=DBUtil.getConnection();
    		List<Article> articles=new ArrayList<Article>();
    		String sql="select * from article limit ?,?";
    		try {
    			PreparedStatement pstm=con.prepareStatement(sql);
    			
    			pstm.setInt(1, (page-1)*pageSize);
    			pstm.setInt(2, pageSize);
    			ResultSet rs=pstm.executeQuery();
    
  • 统计总页数

    public int totalPage(int pageSize) {
    	Connection con = DBUtil.getConnection();
    	String sql = "select count(*) as num from user";
    	PreparedStatement pstm = null;
    	ResultSet rs = null;
    	int num = 0;
    	try {
    		pstm = con.prepareStatement(sql);
    		rs = pstm.executeQuery();
    		rs.next();
    		num = rs.getInt("num");
    	} catch (SQLException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} finally {
    		try {
    			con.close();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	if (num % pageSize == 0) {
    		return num / pageSize;
    	} else {
    		return num / pageSize + 1;
    	}
    
    }
    
  • 在servlet里调用,存到session里发送到页面

    int pages = ad.totalPage(pageSize);
    List<Article> articles = ad.findArticle(page, pageSize);
    session.setAttribute("page", page);
    session.setAttribute("pages", pages);
    request.getRequestDispatcher("voteList.jsp").forward(request, response);		
    
  • 页面调用

    <tr>
    					<td style="padding-left: 400px">
    						<c:choose>
        					<c:when test="${page>1}">
    						<a href="${pageContext.request.contextPath}/IndexServlet?page=${page-1}">上一页</a>
        					</c:when>
        
        				<c:otherwise>
                                  	    首页
        				</c:otherwise>
        				 </c:choose>
        					 &nbsp;&nbsp;${page}/${pages}&nbsp;&nbsp;
       					 <c:choose>
          					<c:when test="${page<pages}">
            				<a href="${pageContext.request.contextPath}/IndexServlet?page=${page+1}">下一页</a>
          					</c:when>
          				<c:otherwise>
                                           		最后一页
         				 </c:otherwise>
        
         				</c:choose>
    						
    		</td>
    				</tr>
    				
    
3.倒计时功能的实现
  • 在数据库获取截止时间

    //查询article表中的所有信息
    public List<Article> findArticle(int page,int pageSize){
    	Connection con=DBUtil.getConnection();
    	List<Article> articles=new ArrayList<Article>();
    	String sql="select * from article limit ?,?";
    	try {
    		PreparedStatement pstm=con.prepareStatement(sql);		
    		pstm.setInt(1, (page-1)*pageSize);
    		pstm.setInt(2, pageSize);
    		ResultSet rs=pstm.executeQuery();	
    		while(rs.next()){
    			Article article=new Article();
    			article.setId(rs.getInt("id"));
    			article.setTitle(rs.getString("title"));
    			article.setType(rs.getInt("type"));
    			article.setCreatime(rs.getTimestamp("createtime"));
    			article.setEndtime(rs.getTimestamp("endtime"));//获取截止时间,存到Article类里面
    			//统计选项总数
    			String sql1="SELECT COUNT(*) as sum FROM optionss where articleid=?";
    			PreparedStatement pstm1=con.prepareStatement(sql1);
    			pstm1.setInt(1, article.getId());
    			ResultSet rs1=pstm1.executeQuery();	
    			while(rs1.next()){		
    			article.setNum(rs1.getInt("sum"));
    			//System.out.println("显示计数"+article.getNum());
    			}
    			//统计有多少人投票
    			String sql_2="SELECT COUNT(DISTINCT `voterid`) AS num FROM `vote` WHERE `articleid`=?";
    			PreparedStatement pstm_2=con.prepareStatement(sql_2);
    			pstm_2.setInt(1, article.getId());
    			ResultSet rs_2=pstm_2.executeQuery();
    			while(rs_2.next()){
    				article.setSum(rs_2.getInt("num"));
    				//System.out.println("统计投票总人数为="+article.getSum());
    			}
    
    			articles.add(article);
    		}
    	} catch (SQLException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}finally{
    		try {
    			con.close();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	return articles;
    }
    
  • 在servlet里面调用,发送到页面

    List<Article> articles = ad.findArticle(page, pageSize);
    		
      		List<Timestamp> endTimes=new ArrayList<Timestamp>();
    	    for(Article art :articles){
    	    	Timestamp endTime=art.getEndtime();
    	    	endTimes.add(endTime);  
    	    } 
    		session.setAttribute("endTime", endTimes);
    		
    		request.getRequestDispatcher("voteList.jsp").forward(request, response);
    
    
  • 在页面显示(因为在页面使用了foreach,所以需要在页面写Java代码显示)

    			<c:forEach items="${articles}" var="art" >
    				<c:set var="cI" value="${art}" scope="request"></c:set>//方便在页面使用Java代码调用el表达式
    				<tr>
    					<td width="810px">
    					<span class="p1">
    					<img src="./image/vote_icon.gif">
    					 <a href="${pageContext.request.contextPath}/LookVote?titleId=${art.id}" id="h1">${art.title}</a>
    					 </span><br>
    					 <span class="p2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    					共有${art.num}个选项,已有${art.sum}个网友参与了投票。
    					</span>
    					
    					
    					<%
    						Article art = (Article)request.getAttribute("cI");
    						Timestamp time = art.getEndtime();
    						Date oDate = new Date();//获取当前日期对象
    					    Long oldTime = oDate.getTime();//现在距离1970年的毫秒数
    					    Date newDate = new Date(time.getTime());//获取数据库中的截止时间
    					    Long newTime = newDate.getTime();//2020年距离1970年的毫秒数
    					    int second = (int)Math.floor((newTime - oldTime) / 1000);//未来时间距离现在的秒数
    					    int day=0;
    					    int hour =0;
    					    int minute = 0;
    					    if(second >=0){
    					    	day = (int)Math.floor(second / 86400);//整数部分代表的是天;一天有24*60*60=86400秒 ;
    						    second = second % 86400;//余数代表剩下的秒数;
    						    hour = (int)Math.floor(second / 3600);//整数部分代表小时;一个小时有3600秒
    						    second %= 3600; //余数代表 剩下的秒数;
    						    minute = (int)Math.floor(second / 60);//一分钟有60秒
    						    second %= 60;    
    					    }else{				
    					    	day = 0;
    						    second = second % 86400;
    						    hour = 0;
    						    second %= 3600; 
    						    minute = 0;
    						    second %= 60; 
    						    second=0;
    					    }
    					    
    					%>
    					<p class="p2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    					投票截止时间剩余:
    					<span style="color:red"><%=day+"天"+hour+"小时"+minute+"分钟"+second+"秒" %></span>
    					</p>
    
4.添加投票实现
  • 在页面设置input的name的值一样

    添加新投票
    			<form action="AddServlet" method="post" οnsubmit="return check()">
    				<table style="width: 480px">
    					<tbody><tr>
    						<td>投票内容:</td>
    						<td><input type="text" name="title" class="bb"></td>
    					</tr>
    					<tr>
    						<td>投票类型:</td>
    						<td align="left">
    							<input type="radio" name="type" value="single" checked="checked">单选
    							<input type="radio" name="type" value="more">多选
    						</td>
    					</tr>
    					</tbody><tbody id="addTr">
    					<tr>
    						<td>投票选项:</td>   //投票选项的name都一样
    						<td><input type="text" name="option" class="bb"></td>
    					</tr>
    					<tr>
    						<td></td>
    						<td><input type="text" name="option" class="bb"></td>
    					</tr>
    					
    					</tbody>
    					<tbody>
    						<tr>
    					<td>截止日期:</td>
    					<td>	
    					<input type="text" placeholder="请选择日期和时间" id="datetime" class="bb" name="endTime">
    					</td>
    					</tr>
    					
    					<tr>
    						<td></td>
    
  • 传到后台servlet

    • 使用getParameterValues获取多个name=option的值,用数组存起来
    String[] option = request.getParameterValues("option");
    
  • 传到dao里面,存进数据库

    public void AddVote(String title,String[] option,String type,int voterId,String endTime){
    	Connection con=DBUtil.getConnection();
    	String sql="insert into article(title,type,voterid,endtime)values(?,?,?,?)";
    	String sql1="select id from article where title=?";
    	String sql2="insert into optionss(optionvalue,articleid)values(?,?)";
    	Article article=null;
    	int form=0;
    	try {
    		PreparedStatement ps=con.prepareStatement(sql);
    		PreparedStatement pstm_1=con.prepareStatement(sql1);
    		PreparedStatement pstm_2=con.prepareStatement(sql2);
    		ps.setString(1, title);
    		if(type.equals("single")){
    			ps.setInt(2, form);
    		}else if(type.equals("more")){
    			form=1;
    			ps.setInt(2, form);
    		}
    		ps.setInt(3, voterId);
    		ps.setString(4, endTime);
    		ps.executeUpdate();
    		
    		pstm_1.setString(1, title);
    		ResultSet rs_1=pstm_1.executeQuery();
    		while(rs_1.next()){
    			article=new Article();
    			article.setId(rs_1.getInt("id"));
    			
    			for(int i=0;i< option.length;i++){
    			//System.out.println("+++++"+option[i]);
    			pstm_2.setString(1, option[i]);
    			pstm_2.setInt(2, article.getId());
    			pstm_2.executeUpdate();
    		}
    			
    		}
    	
    	} catch (SQLException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}finally{
    		try {
    			con.close();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    			
    }
    
基于javaweb在线投票系统,可以通过以下方式进行设计和开发: 1. 需求分析:首先,需要了解系统的基本功能和用户需求。包括用户注册、登录、创建投票、参与投票、查看投票结果等功能。 2. 数据库设计:设计合适的数据库结构,包括用户表、投票表、选项表等。使用数据库来存储用户信息、投票信息和结果。 3. 前端页面设计:设计用户友好的前端页面,包括注册页面、登录页面、创建投票页面、投票页面、结果页面等。使用HTML、CSS和JavaScript等技术进行页面的设计和布局。 4. 后端逻辑开发:使用Java语言编写后端逻辑代码,处理用户注册登录、创建投票、参与投票、计算结果等操作。可以使用基于Spring框架的MVC模式进行开发。 5. 数据库交互:编写Java代码与数据库进行交互,包括用户信息的验证、投票信息的存取、结果的计算与展示等操作。 6. 安全性保证:为了保护用户的隐私和系统的安全,需要对用户密码进行加密存储,并使用适当的鉴权和权限控制,防止非法操作和数据泄露。 7. 测试和优化:对系统进行全面的测试,包括功能测试、性能测试和安全测试等。根据测试结果,对系统进行优化和改进,提高系统的可用性和性能。 8. 部署和运维:将系统部署到服务器上,确保系统能够正常运行。定期进行系统维护和监控,及时处理潜在的故障和安全问题。 总之,基于javaweb在线投票系统需要综合运用前端页面设计、后端逻辑开发和数据库交互等技术,保证系统的功能完整和安全性。通过完善的测试和优化,提供给用户便捷、高效的投票体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值