1. 程式人生 > >jsp案例分析(一)-線上投票系統-4-程式碼分析

jsp案例分析(一)-線上投票系統-4-程式碼分析

原本的原始碼是沒有myeclipse工程的,資料庫採用sqlserver2000,伺服器採用tomcat.

本人將所有程式碼放到myeclipse10裡面,部署到apache-tomcat-6.0.35,資料庫改用sqlserver2008,發現原來的驅動還可以用,也可以用(http://blog.csdn.net/flyuniverse_shell/article/details/7351016)中說明的新的驅動。

在我本機部署成功的原始碼:

關鍵原始碼:

 (DB.java)

package com.yxq.toolbean;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.yxq.valuebean.TempSingle;
import com.yxq.valuebean.VoteSingle;

public class DB {
 private String className;

 private String url;

 private String username;

 private String password;

 private Connection con;

 private Statement stm;

 private ResultSet rs;

 public DB() {
  className = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
  url = "jdbc:microsoft:sqlserver://localhost:1433;databaseName=db_vote";
  username = "sa";
  password = "xiexie";
 }

 /**
  * @功能 載入資料庫驅動程式
  */
 public void loadDrive() {
  try {
   Class.forName(className);
  } catch (ClassNotFoundException e) {
   System.out.println("載入資料庫驅動程式失敗!");
   e.printStackTrace();
  }
 }
 
 /**
  * @功能 獲取資料庫連線
  */
 public void getCon() {
  loadDrive();
  try {
   con = DriverManager.getConnection(url, username, password);
  } catch (Exception e) {
   System.out.println("連線資料庫失敗!");
   e.printStackTrace();
  }
 }
 
 /**
  * @功能 獲取Statement物件
  */
 public void getStm() {
  getCon();
  try {
   stm = con.createStatement();
  } catch (Exception e) {
   System.out.println("獲取Statement物件失敗!");
   e.printStackTrace();
  }
 }

 /**
  * @功能 查詢資料表,獲取結果集
  */
 public void getRs(String sql) {
  getStm();
  try {
   rs = stm.executeQuery(sql);
  } catch (Exception e) {   
   System.out.println("查詢資料庫失敗!");
   e.printStackTrace();
  }
 }
 
 /**
  * @功能 查詢資料表,獲取投票選項
  */
 public List selectVote(String sql) {
  List votelist = null;
  if (sql != null && !sql.equals("")) {
   getRs(sql);
   if (rs != null) {
    votelist = new ArrayList();
    try {
     while (rs.next()) {
      VoteSingle voteSingle = new VoteSingle();
      voteSingle.setId(MyTools.intToStr(rs.getInt(1)));
      voteSingle.setTitle(rs.getString(2));
      voteSingle.setNum(MyTools.intToStr(rs.getInt(3)));
      voteSingle.setOrder(MyTools.intToStr(rs.getInt(4)));
      votelist.add(voteSingle);
     }
    } catch (Exception e) {
     System.out.println("封裝tb_vote表中資料失敗!");
     e.printStackTrace();
    } finally {
     closed();
    }
   }
  }
  return votelist;
 }

 /**
  * @功能 查詢資料表,獲取指定IP最後一次投票的記錄
  */
 public TempSingle selectTemp(String sql) {
  TempSingle tempSingle = null;
  if (sql != null && !sql.equals("")) {
   getRs(sql);
   if (rs != null) {
    try {
     while (rs.next()) {
      tempSingle = new TempSingle();
      tempSingle.setId(MyTools.intToStr(rs.getInt(1)));
      tempSingle.setVoteIp(rs.getString(2));
      tempSingle.setVoteMSEL(rs.getLong(3));
      tempSingle.setVoteTime(rs.getString(4));
     }
    } catch (Exception e) {
     System.out.println("封裝tb_temp表中資料失敗!");
     e.printStackTrace();
    } finally {
     closed();
    }
   }
  }
  return tempSingle;
 }
 
 /**
  * @功能 更新資料表
  */
 public int update(String sql) {
  int i = -1;
  if (sql != null && !sql.equals("")) {
   getStm();
   try {
    i = stm.executeUpdate(sql);
   } catch (Exception e) {
    System.out.println("更新資料庫失敗!");
    e.printStackTrace();
   } finally {
    closed();
   }
  }
  return i;
 }
 /**
  * @功能 關閉資料庫連線
  */
 public void closed() {
  try {
   if (rs != null)
    rs.close();
   if (stm != null)
    stm.close();
   if (con != null)
    con.close();
  } catch (Exception e) {
   System.out.println("關閉資料庫失敗!");
   e.printStackTrace();
  }
 }
}

投票演算法原始碼:

(doVote.jsp)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="com.yxq.valuebean.TempSingle" %>
<%@ page import="com.yxq.toolbean.MyTools" %>
<%@ page import="java.util.Date" %>

<jsp:useBean id="myDb" class="com.yxq.toolbean.DB"/>
<%
  String mess="";
  String selectId=request.getParameter("ilike");   //獲取使用者選擇
  if(selectId==null||selectId.equals("")){     //沒有選擇
   mess="請選擇投票!";
  }
  else{                //選擇了
   boolean mark=false;           //是否允許投票的標誌
   long today=(new Date()).getTime();       //new Date()獲取當前時間,通過呼叫Date類的getTime()方法獲取從1970年1月1日00:00:00起到當前時間的毫秒數
   long last=0;             //上次投票的時間(以毫秒顯示)
   String ip=request.getRemoteAddr();       //獲取使用者IP地址
   String sql="SELECT * FROM tb_temp WHERE voteMSEL = (SELECT MAX(voteMSEL) FROM tb_temp WHERE voteIp='"+ip+"')"; //SQL語句,功能:從資料表中獲取當前使用者上次投票時的記錄
   TempSingle single=myDb.selectTemp(sql);
   if(single==null)           //在tb_temp表中不存在當前IP
    mark=true;              //允許投票
   else{              //存在當前IP,則判斷從上次投票到現在是否超過指定時間,本系統指定為60分鐘
        last=single.getVoteMSEL();         //從該JavaBean中獲取上次投票的時間(以毫秒顯示)
        String result=MyTools.compareTime(today,last);    //將現在時間與上次投票時的時間進行比較
       if(result.equals("yes"))          //返回"yes",表示時間差已超過60分鐘,允許投票
        mark=true;
         else               //否則,不允許投票
        mark=false;   
     }  
 
   String strTime=MyTools.formatDate(today);     //將當前投票時間(以毫秒顯示的)轉為"年-月-日 時:分:秒"的形式
   if(mark){             //允許投票
    /** 【1】記錄使用者IP和投票時間 **/
    sql="insert into tb_temp values('"+ip+"','"+today+"','"+strTime+"')";
    int i=myDb.update(sql);
         
    /** 【2】判斷記錄使用者IP是否成功 **/
    if(i<=0)              //記錄IP失敗      
     mess="系統在記錄您的IP地址時出錯!";
    else{               //記錄IP成功
     /** 更新票數 **/
        sql="update tb_vote set vote_num=vote_num+1 where id="+selectId;
        i=myDb.update(sql);            //更新成功
        if(i>0)
         mess="投票生效! <img src='images/spic.jpg'>";
        else                //更新失敗
         mess="投票失敗!";   
    }
   }
   else{              //不允許投票
    mess="對不起,通過判斷您的IP,您已經投過票了!<br>上次投票時間:"+single.getVoteTime()+"<br>60分鐘之內不允許再進行投票!";
   }
  }

  session.setAttribute("mess",mess);      //儲存提示資訊到session範圍內
  response.sendRedirect("messages.jsp");     //將請求重定向到messages.jsp頁面,進行提示
%>