在該項目版本一中,主要涉及最基本的java web基礎知識。本篇博文仍然是基本知識,不過在版本一中,全部投票不計名不限定ip,bug不少。在版本二中有所改善,主要在投票以前加上了登陸這一塊,若是該用戶名已經投票則自動跳轉投票結果頁面。 html
若是您對EL表達式不熟悉,請閱讀我前面相關EL的基礎博文 java
EL表達式(一):http://my.oschina.net/passer007/blog/608675 mysql
EL表達式(二):http://my.oschina.net/passer007/blog/610221 web
EL表達式中的隱含對象: http://my.oschina.net/passer007/blog/610380若是你在翻閱版本二以前尚未閱讀版本一請移步版本一,由於版本一中出現的版本二中不須要修改的頁面我將不會在此博文中粘貼出來: sql
EL+servlet+jsp實現簡單的投票程序版本一:http://my.oschina.net/passer007/blog/610513 數據庫
寫在前面的tips:因爲是簡單的投票程序,我在驗證用戶是否投票這一過程當中直接採用用戶名驗證,不須要取數據庫再驗證用戶密碼,須要驗證密碼的同窗能夠本身完善程序。 app
在版本二中因爲驗證用戶名,必須須要創建數據庫鏈接,一下是鏈接數據庫的基礎代碼: jsp
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>"); } } }好了,版本二中新添的功能在此結束,請注意投票的主代碼在版本一中,請閱讀開頭的版本一進去相應鏈接。
最後是兩個問題:版本二中最嚴重的問題是我並無在投票界面獲取用戶,也就是說在不登陸的狀況下直接訪問投票頁面是能夠無限制投票的。這一問題的解決方案是: post
其一:限制必須登陸以後才能夠訪問該界面 學習
其二:在該界面進行用戶名檢測
(以上問題已經修改,代碼已經從新上傳)
第二個問題是:
沒有對已經投票的用戶名進行入庫(這一問題也相對簡單,不會再更新,留給讀者本身完成)
若是有第三版的話我會在第三版中進行修改,沒有第三版的話就請各位自行修改了~(到此也不會再出第三版,除非之後哪天的生活中須要用到我必定會拿來好好更新的,以上所有都是簡單的例子,供你們一塊兒學習交流吧,歡迎各路大神指責。)
系列博文若有轉載請註明出處