1、include指令与include标签的区别
<%@ include file="myfile.jsp"%>
<jsp:include page="myfile.jsp" flush="true"></jsp:include>
include指令所引用的文件,在编译阶段被servlet容器处理,而jsp标签所引用的文件在请求(request)的时候才被编译处理,并且输出处理结果。
2、如果一个类ClassA 要存入 session中,并且从session中取出后能 还原成 类ClassA,则该类需要被 序列化,即实现 java.io.serializable 接口。
3、sessionListener监听器
package com.myCompany.util;
import java.util.Date;
import javax.servlet.http.*;
import com.myCompany.dao.*;
import java.io.Serializable;
//监听登录的整个过程
public class SessionListener implements HttpSessionBindingListener,Serializable {
private String sessionID = "";// 创建监听器时,初始化sessionID
private String IP = "";// 用户IP
private String userAgent = "";// 用户浏览器
private String userRegion = "";// 用户地区信息
private String channel = "";// 访问渠道
private int userID = 0;// 用户ID
private int visiteDepth_A = 0;// 用户的A访问深度
private int visiteDepth_B = 0;// 用户的B访问深度
public SessionListener(String sessionID,String IP,String userAgent,String userRegion,String channel) {
this.sessionID = sessionID;
this.IP = IP;
this.userAgent = userAgent;
this.userRegion = userRegion;
this.channel = channel;
}
public String getSessionID(){
return this.sessionID;
}
public int getuserID(){
return this.userID;
}
public int getVisiteDepth_A(){
return this.visiteDepth_A;
}
public void setVisiteDepth_A(int depth){
if(depth > this.visiteDepth_A){
this.visiteDepth_A = depth;
}
}
public int getVisiteDepth_B(){
return this.visiteDepth_B;
}
public void setVisiteDepth_B(int depth){
if(depth > this.visiteDepth_B){
this.visiteDepth_B = depth;
}
}
// 初始化SessionListener将会调用
public void valueBound(HttpSessionBindingEvent event)
{
Date date = new Date();
System.out.println("sessionListener created at "+date.toString());
this.userID = UserDAO.getUserIDBySessionID(sessionID);//判断user是否存在
if( this.userID > 0 ){//用户已经存在
System.out.println("session already exists!");
}else{//新建用户
boolean f = UserDAO.insertOneUser(sessionID, IP, userAgent, userRegion, channel);//插入临时用户信息,设置userID
if(f){
System.out.println("插入临时用户信息成功!");
this.userID = UserDAO.getUserIDBySessionID(sessionID);
System.out.println("userID="+userID);
}else{
System.out.println("插入临时用户信息失败!");
}
}
}
// 删除SessionListener将会调用
public void valueUnbound(HttpSessionBindingEvent event)
{
Date date = new Date();
System.out.println("sessionListener removed at "+date.toString());
// 更新访问深度
boolean isUpdateSucc = UserDAO.updateVisiteDepth(visiteDepth_A, visiteDepth_B, this.userID);
if(isUpdateSucc){
System.out.println("用户"+this.userID+"访问深度更新成功!");
}else{
System.out.println("用户"+this.userID+"访问深度更新失败!");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}