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>
${page}/${pages}
<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">
共有${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">
投票截止时间剩余:
<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();
}
}
}