在该项目版本一中,主要涉及最基本的java web基础知识。本篇博文仍然是基本知识,不过在版本一中,所有投票不计名不限定ip,bug很多。在版本二中有所改善,主要在投票之前加上了登录这一块,如果该用户名已经投票则自动跳转投票结果页面。
如果您对EL表达式不熟悉,请阅读我前面相关EL的基础博文
EL表达式(一):http://my.oschina.net/passer007/blog/608675
EL表达式(二):http://my.oschina.net/passer007/blog/610221
EL表达式中的隐含对象: http://my.oschina.net/passer007/blog/610380如果你在翻阅版本二之前还没有阅读版本一请移步版本一,因为版本一中出现的版本二中不需要修改的页面我将不会在此博文中粘贴出来:
EL+servlet+jsp实现简单的投票程序版本一:http://my.oschina.net/passer007/blog/610513
写在前面的tips:由于是简单的投票程序,我在验证用户是否投票这一过程中直接采用用户名验证,不需要取数据库再验证用户密码,需要验证密码的同学可以自己完善程序。
在版本二中由于验证用户名,必须需要建立数据库连接,一下是连接数据库的基础代码:
package com.zhong.el;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DataBaseUtil {
public static Connection getConnection(){
System.out.println("正在尝试为您连接数据库,请稍等。。。");
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/Book";
String user = "root";
String password = "123456";
conn = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接已成功,请确定您当前连接的数据库:Book");
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
System.out.println("数据库连接失败,请检查用户名密码!");
e.printStackTrace();
}
return conn;
}
public static void closeConnection(Connection conn){
if(conn!=null){
try {
System.out.println("数据库正在关闭,请稍等。。。");
conn.close();
System.out.println("数据库关闭成功!");
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("数据库关闭失败,请检查后重试!");
e.printStackTrace();
}
}else{
System.out.println("请检查您的连接是否为空!");
}
}
}
由于知识简单的验证用户名,因此,用户DAO显得相对简单,只需要进数据表查取用户名即可
package com.zhong.el;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDao {
public boolean isExistUsername(String username){
Connection conn = DataBaseUtil.getConnection();
String sql = "select * from tab_user where username = ?";
try {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ResultSet rs = ps.executeQuery();
if(!rs.next()){
return true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
}
下面是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>Insert title here</title>
</head>
<body>
<form action = "<%=request.getContextPath() %>/LoginInServlet" method = "post">
输入用户名:<input type = "text" name = "username">
<input type = "submit" value = "登录">
</form>
</body>
</html>
最后是对用户登录界面传来的用户名进行验证并产生相对应的处理的servlet
package com.zhong.el;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LoginInServlet
*/
@WebServlet("/LoginInServlet")
public class LoginInServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginInServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String username = request.getParameter("username");
UserDao userdao = new UserDao();
PrintWriter pw = response.getWriter();
if(userdao.isExistUsername(username)){
pw.println("<script>alert('用户可以投票!');window.location.href = 'EL/index.jsp';</script>");
}else{
pw.println("<script>alert('该用户已经投票!');window.location.href = 'showResult.jsp'</script>");
}
}
}
好了,版本二中新添的功能在此结束,请注意投票的主代码在版本一中,请阅读开头的版本一进去相应连接。
最后是两个问题:版本二中最严重的问题是我并没有在投票界面获取用户,也就是说在不登录的情况下直接访问投票页面是可以无限制投票的。这一问题的解决方案是:
其一:限制必须登录之后才可以访问该界面
其二:在该界面进行用户名检测
(以上问题已经修改,代码已经重新上传)
第二个问题是:
没有对已经投票的用户名进行入库(这一问题也相对简单,不会再更新,留给读者自己完成)
如果有第三版的话我会在第三版中进行修改,没有第三版的话就请各位自行修改了~(到此也不会再出第三版,除非以后哪天的生活中需要用到我一定会拿来好好更新的,以上全部都是简单的例子,供大家一起学习交流吧,欢迎各路大神指责。)
系列博文如有转载请注明出处
来源:oschina
链接:https://my.oschina.net/u/2391943/blog/610741