本篇文章要用最簡短的篇幅將「 JSP 網站瀏覽數統計」實作出來並解說,在這之前要先了解如何將 JSP 連線至 MySQL,這部分要安裝 JDBC 驅動程式,就可以讓 JSP 連線到 MySQL 囉!接著就可以撰寫 JSP 程式來做出網站瀏覽數統計,這些數值將使用 MySQL 資料庫儲存,並且使用 Session 來判斷是否 +1,這是避免短時間內的重複計算,不過這要視您的需求來客製化程式。本文就分成幾個章節逐步實作!本文使用 XAMPP 下的 Tomcat 做為示範環境。
Tomcat 伺服器為 JSP 的運作環境,XAMPP 能幫助您快速安裝,教學:XAMPP & Tomcat:建立 JSP 運行環境 & 讓 JSP 連接 SQL 資料庫
本文章節
讓 Tomcat 伺服器能連線至 MySQL
JSP 隱含物件 Session 解說
瀏覽數統計 JSP 程式詳解
使用
錨點導覽,請直接點擊標題可移至該章節。
讓 Tomcat 伺服器能連線至 MySQL 
▲ 先到「MySQL Connector/J」下載檔案,解壓縮後把裡面的將「mysql-connector-java-(版本).jar」放入「C:\xampp\tomcat\lib」,這樣 Tomcat 就可以連接 MySQL 資料庫了!也代表 JSP 程式可以連 MySQL 資料庫了!
JSP 隱含物件 Session 解說 
以瀏覽數統計來說,如果有新的 Session 才將統計數字 +1,並存回資料庫,一個 Session 什麼時候結束呢?當使用者關閉瀏覽器、伺服器關閉、使用者對伺服器未提出請求超過預設時間(Tomcat 預設為 30 分鐘)或程式關閉 Session,所以要測試統計數字是否正常 +1,就要換個瀏覽器跑跑看,就知道有沒有成功了!
▲ Session 運作示意圖。
瀏覽數統計 JSP 程式詳解 
至於 JSP 程式到底如何撰寫才能連接 MySQL 資料庫?這個就直接用程式碼解說了!
▲ 程式碼預覽、執行結果和 MySQL 資料庫存放的統計數值(使用 phpMyAdmin 查看,使用教學:XAMPP:phpMyAdmin 連接內部或外部 MySQL 伺服器完整教學)。
先來看看專案目錄:
專案目錄
├index.jsp (首頁)
└counter.jsp (瀏覽數統計)
基本上瀏覽數統計會寫在單獨的 JSP 檔案中,最後再把需要統計與顯示統計數字的網頁(例如:index.jsp)中加上:
<%@include file="counter.jsp"%>
這樣就可以啦!那接下來直接看「counter.jsp」的原始碼與註解囉!
<%@ page import = "java.sql.*, java.util.*"%> | |
<!-- 引入資源 --> | |
<%@page contentType="text/html" pageEncoding="utf-8"%> | |
<html> | |
<head> | |
<title>網站總瀏覽數統計</title> | |
<meta charset="utf-8"> | |
</head> | |
<body> | |
<% | |
try { // 例外處理 | |
Class.forName("com.mysql.jdbc.Driver"); // 啟動 JDBC 驅動程式 | |
try { // 例外處理 | |
String url="jdbc:mysql://localhost/?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"; // url 是連接 MySQL 的位址(IP 或網域) | |
String sql=""; // 建立字串變數 sql | |
Connection con=DriverManager.getConnection(url,"root","1234"); // 連接 MySQL 資料庫(帳號:root;密碼:1234) | |
if(con.isClosed()) // con.isClosed() 回傳 ture 代表連線關閉 | |
out.println("警告:連線建立失敗!"); // 連線關閉代表連線沒有被建立 | |
else { // 連線成功建立就可以開始取得與更新資料庫的資料 | |
sql="use cych"; // SQL 語法:使用 cych 資料庫 | |
con.createStatement().execute(sql); // 執行上一行的 SQL | |
sql="select * from counter"; // SQL 語法:取得 counter 資料表中的所有資料 | |
ResultSet rs=con.createStatement().executeQuery(sql); // ResultSet 用來儲存查詢結果 (*註解1),將上一行 SQL 執行後並儲存結果 | |
while(rs.next()) // 一筆一筆讀取資料,回傳 false 表示讀取結束 | |
{ | |
String c_S= rs.getString(1); // 取得資料表第一個欄位的資料到 c_S 這個字串中 | |
int c=Integer.parseInt(c_S); // 將 c_S 這個字串轉成 int 整數並存至 c 變數 | |
if (session.isNew()) { // 如果使用者是使用新的 Session 連入 | |
c++; // c 變數 +1 | |
out.print(c); // 印出 c 變數 | |
} | |
else // 如果使用者不是使用新的 Session 連入 | |
{ | |
out.print(c); // 直接印出 c 變數 | |
} | |
sql="update counter set count=\'" + c + "\'"; // SQL 語法:將 c 的數字更新到 counter 資料表中的 count 欄位 | |
} | |
con.createStatement().execute(sql); // 執行剛剛的 SQL 語法 | |
con.close(); // 關閉 MySQL 連線 | |
} | |
} | |
catch (SQLException sExec) { | |
out.println("警告:MySQL 錯誤!"+sExec.toString()); // MySQL 錯誤警告 | |
} | |
} | |
catch (ClassNotFoundException err) { | |
out.println("警告:class 錯誤!"+err.toString()); // JDBC 錯誤警告 | |
} | |
%> | |
</body> | |
</html> |
註解:
註解1:ResultSet 用來儲存查詢結果,有幾個重要的函數:
(1) Next():取得下一筆資料,若無資料則回傳 false。
(2) getString(int i):取得資料表中的第 i 個欄位資料,由 1 開始。
(3) getString(String name):name 為欄位名稱(不區分大小寫)。
留言區 / Comments
萌芽論壇