1,Session
創(chuàng)新互聯(lián)建站成立于2013年,先為康平等服務(wù)建站,康平等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為康平企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
在JavaWeb中使用HttpSession(以下簡(jiǎn)稱session)對(duì)象來表示一個(gè)會(huì)話。
正在裝載數(shù)據(jù)…… Session的創(chuàng)建(代表會(huì)話周期的開始):第一次調(diào)用request.getSession()方法時(shí),會(huì)創(chuàng)建一個(gè)session對(duì)象。
Session的銷毀(代表會(huì)話周期的結(jié)束):在某個(gè)請(qǐng)求周期內(nèi)調(diào)用了Session.invalidate()方法,此請(qǐng)求周期結(jié)束后,session被銷毀;或者是session超時(shí)后自動(dòng)銷毀。
對(duì)于JSP,如果指定了%@ page session="false"%,則在JSP中無法直接訪問內(nèi)置的session變量,同時(shí)也不會(huì)主動(dòng)創(chuàng)建session,因?yàn)榇藭r(shí)JSP未自動(dòng)執(zhí)行request.getSession()操作獲取session。
在session對(duì)象剛創(chuàng)建的第一個(gè)請(qǐng)求周期內(nèi),調(diào)用session.isNew()方法將得到true。
可以在web.xml文件中配置session默認(rèn)的超時(shí)時(shí)間(分鐘):
session-config
session-timeout10session-timeout
session-config
也可以調(diào)用session. setMaxInactiveInterval()方法設(shè)置session超時(shí)時(shí)間(分鐘)
2,SessionListener
通過SessionListenr可以監(jiān)聽session的創(chuàng)建和銷毀,步驟:
1.寫一個(gè)類MySessionListener,實(shí)現(xiàn)javax.servlet.http.HttpSessionListener接口及其sessionCreated()、sessionDestroyed()方法
2.在web.xml中配置SessionListener:
listener
listener-classMySessionListener類全名listener-class
listener
當(dāng) session被創(chuàng)建和銷毀時(shí),容器會(huì)分別調(diào)用SessionListener的sessionCreated()方法和 sessionDestroyed()方法,這兩個(gè)方法中傳入了一個(gè)參數(shù)對(duì)象HttpSessionEvent,可以通過此對(duì)象的 getSession()方法獲取session對(duì)象
public class Counter {
private int count;
// 每訪問一次,計(jì)數(shù)器自加一
public int getCount() {
return ++count;
}
public void setCount(int count) {
this.count = count;
}
}
%-- 定義一個(gè) session 范圍內(nèi)的計(jì)數(shù)器 記錄個(gè)人訪問信息 --%
jsp:useBean id="personCount" class="com.helloweenvsfei.jspweb.bean.Counter" scope="session" /
%-- 定義一個(gè) application 范圍內(nèi)的計(jì)數(shù)器 記錄所有人的訪問信息 --%
jsp:useBean id="totalCount" class="com.helloweenvsfei.jspweb.bean.Counter" scope="application" /
div align="center"
form action="method.jsp" method="get"
fieldset style='width: 300'
legend計(jì)數(shù)器/legend
table align="center" width="400"
tr
td width=150 align="right" style="font-weight:bold; "您的訪問次數(shù):/td
td
%-- 獲取個(gè)人的 訪問次數(shù) --%
jsp:getProperty name="personCount" property="count" / 次
/td
/tr
tr
td width=150 align="right" style="font-weight:bold; "總共的訪問次數(shù):/td
td
%-- 獲取所有人的 訪問次數(shù) --%
jsp:getProperty name="totalCount" property="count" / 次
/td
/tr
/table
/fieldset
/form
/div
希望你能幫到你
步驟一、建一個(gè)表,表名任意,這里取名為:visitorcounter,表的結(jié)構(gòu)如下所示:
+-------+------------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+------------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| vdate | date | NO | | 2000-01-01 | |
| vnum | int(11) | NO | | 0 | |
+-------+------------------+------+-----+------------+----------------+
步驟二、建立一個(gè)java類,名字也為:visitorcounter,類的內(nèi)容如下:
package com.hdzx.pub;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;
public class VisitorCounter {
private final static String TABLE_NAME = "visitorcounter";
private static String today = null;
private static long today_num = 0;
private static long total_num = 0;
//加載訪問量
public static void loadNum(){
if(total_num1)
loadTotalNum();
if(today_num1)
loadToadyNum();
}
//加載今日訪問量
private static void loadToadyNum() {
// TODO Auto-generated method stub
DBConnect db = null;
ResultSet rs = null;
if(today==null)
today = getTodayDate();
String sql = "select vnum from "+TABLE_NAME+" where vdate='"+today+"'";
try {
db = new DBConnect();
rs = db.executeQuery(sql);
if(rs.next()){
today_num = rs.getLong("vnum");
}
else
{
sql = "insert into "+TABLE_NAME+"(vdate,vnum) values('"+today+"',0)";
db.executeUpdate(sql);
today_num = 0;
}
} catch (Exception e) {
// TODO: handle exception
today_num = 0;
System.out.println("com.hdzx.pub~VisitorCounter.incTotalCounter:獲得訪問人數(shù)");
}
}
//加載總訪問量
private static void loadTotalNum() {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
DBConnect db = null;
ResultSet rs = null;
if(today==null)
today = getTodayDate();
String sql = "select vnum from "+TABLE_NAME+" where id=1";
try {
db = new DBConnect();
rs = db.executeQuery(sql);
if(rs.next()){
total_num = rs.getLong("vnum");
}
else
{
total_num = 0;
}
} catch (Exception e) {
// TODO: handle exception
total_num = 0;
System.out.println("com.hdzx.pub~VisitorCounter.incTotalCounter:獲得訪問人數(shù)");
}
}
//增加總的訪問量
private static int incTotalCounter(){
int k = 0;
DBConnect db = null;
loadNum();
total_num = total_num+1;
String sql = "update "+TABLE_NAME+" set vnum="+total_num+" where id=1";
try {
db = new DBConnect();
k = db.executeUpdate(sql);
} catch (Exception e) {
// TODO: handle exception
System.out.println("com.hdzx.pub~VisitorCounter.incTotalCounter:增加訪問人數(shù)");
}
return k;
}
//增加今日的訪問量
public static int incTodayCounter(){
int k = 0;
DBConnect db = null;
String sql = null;
loadNum();
today_num += 1;
sql = "update "+TABLE_NAME+" set vnum="+today_num+" where vdate='"+today+"'";
try {
db = new DBConnect();
k = db.executeUpdate(sql);
if(k 0)
incTotalCounter();
} catch (Exception e) {
// TODO: handle exception
System.out.println("com.hdzx.pub~VisitorCounter.incTotalCounter:增加訪問人數(shù)");
}
return k;
}
//獲得今天的日期
private static String getTodayDate(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(new Date());
}
///獲得今日訪問量
public static long getTodayNum(){
loadNum();
return today_num;
}
//獲得總的訪問量
public static long getTotalNum(){
loadNum();
return total_num;
}
}
步驟三、經(jīng)過以上的步驟后,在頁面中加入以下的代碼,就可以實(shí)現(xiàn)網(wǎng)站訪問量的統(tǒng)計(jì)工作:
if(session.isNew())
{
VisitorCounter.incTodayCounter();
}
%
今日訪問量:%=VisitorCounter.getTodayNum() %br/
總的訪問量: %=VisitorCounter.getTotalNum() %
大約要三張表
A表(地區(qū)名):
地區(qū)代碼 地區(qū)名 總訪問次數(shù)
1 廣東省 0
2 江蘇省 0
...
B表(日訪問表)
地區(qū)代碼 訪問時(shí)間 日訪問次數(shù)
1 20131224 0
8 20131224 0
C表(ip來源表)
序號(hào) 來訪IP 地區(qū)代碼 時(shí)間
處理流程基本上就是
1、先取用戶ip,從ip庫中查詢出用戶地區(qū)(這種代碼隨處可以找到,比如)一般就是純真ip庫,有了地區(qū)后,從A表中查出地區(qū)代碼
2、向C表中添加記錄
3、然后查一下B表有沒有當(dāng)日該地區(qū)記錄,如果沒有就在B表中新增一條,如果有就將B表對(duì)應(yīng)的次數(shù)加1,然后A表中對(duì)應(yīng)地區(qū)代碼次數(shù)統(tǒng)計(jì)也加1
然后比如你要查2013年12月24日的各地區(qū)統(tǒng)計(jì)就可以是
select * from a,b where a.地區(qū)代碼=b.地區(qū)代碼 and b.訪問時(shí)間=20131224