1. 程式人生 > >【Jsp】利用Application物件實現訪問人數統計功能

【Jsp】利用Application物件實現訪問人數統計功能

利用Application物件實現訪問人數的統計很常見,但是一些書籍講解這一技術的時候,往往沒有做完整。一旦伺服器重啟,由於Application會被銷燬,重新建立,人數統計則會再一次從零開始。解決方法,個人認為,應該同時利用到資料庫,這樣無論伺服器要重啟或者遭遇到停機什麼,被統計的人數還是會一直累計上去,不會丟失。下面就介紹一個例子,解決利用Application物件實現訪問人數統計功能由於伺服器重啟或者停機而導致從零開始的問題,同時介紹如果利用Application物件把儲存到web.xml的致命的資料庫資訊取出來,不但解決安全性問題,而且是一個全域性變數,不用每次連線資料庫,都寫一串長長的資料。

一、基本目標

統計一個頁面的訪問人數,而且這個訪問人數,在伺服器重啟之後不會丟失。


二、基本準備

在Mysql中的test資料庫建立一張visitcount的表,裡面沒有主鍵,就一列,也就是說就一個屬性,visitCount,不自增,預設值為0,當然不設定預設值也可以。型別是整形。


在網站的工程目錄的lib資料夾下,放入資料庫驅動,配置資料來源,也就是放入一個mysql-connector-java-5.1.32.jar,這東西版本號不用管,網上搜一下就有。網站目錄結構如下圖:


在web.xml裡面加入如下片段,或者直接就寫出這樣的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<context-param>
		<param-name>url</param-name>
		<param-value>jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf8&amp;useOldAliasMetadataBehavior=true</param-value>
	</context-param>
	<context-param>
		<param-name>user</param-name>
		<param-value>root</param-value>
	</context-param>
	<context-param>
		<param-name>pwd</param-name>
		<param-value>root</param-value>
	</context-param>
</web-app>

這樣,以後,url,user,root就是我們連線資料庫的全域性變量了,至於Jsp如何連線資料庫,可以參考我之前的《【Mysql】Java中對Mysql資料庫的增刪改查、Java的System類》(點選開啟連結

整個網站工程的所有頁面,利用application.getInitParameter("");方法一取就可以去到這些全域性變量了。這裡值得注意的是,原本的&號,必須寫成轉義字元&amp;否則web.xml會把&當作一個編譯符號,整個網路工程無法在tomcat伺服器中啟動。

三、製作過程

在index.jsp寫入如下的程式碼,則可以完成了,注意在開頭引入相應的java包,同時把網站編碼改成utf-8。

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ page import="java.sql.*"%>
<!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>index</title>
</head>
<body>
<%
//取出web.xml中的全域性變數
String url=application.getInitParameter("url");
String user=application.getInitParameter("user");
String pwd=application.getInitParameter("pwd");
//連線資料庫,把訪問人數+1
String sql = null;
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection(url,user,pwd);
sql = "update visitcount set visitCount=visitCount+1";
con.createStatement().execute(sql);
sql = "select visitCount from visitcount";
ResultSet rs=con.prepareStatement(sql).executeQuery();
//這裡由於整個資料庫表只有一行,所以無需用到while迴圈來取
//只需要把指向第0行的遊標向下移一個位置就可以了
rs.next();
//把這個變數寫到application
application.setAttribute("counter",String.valueOf(rs.getInt("visitCount")));
//再把這個變數取出來,讓訪問網站的所有人看到
out.print("你是第"+application.getAttribute("counter")+"個訪問本站的人!"); 
%>
</body>
</html>