??xml version="1.0" encoding="utf-8" standalone="yes"?>
Session监听嘛,没什么好解释的,java提供了很灉|的事件机制来
监听sessionQ可以监听session的创建和销毁,监控session所携带数据的创建、变化和销毁,可以监听session的锐化和钝化Q了?
对象序列化的兄弟应该知道q个Q,其他的^台是个什么情冉|不太清楚Q估计也差不多吧。如果能够对所有客Lsessionq行监控Q就不用再去操作ȝ
而危险的Application了?br />
Xmlhttp是MS推的一Ҏ术,功能很复杂,可以做很多事情,比如客户端可以在单的
HTML中打开HTTPq接Q主动向serverh数据q获得返回数据,是DOM技术一个非帔R要的应用Q利用它来写无刷新的动态页面简直是
so easyQ做qweb开发的兄弟应该明白它的意义有多么重大?br />
一、 session监听
servlet中对
session的监听有很多接口Q功能很灉|Q最常用的是监听Session和Attribute。这里要澄清一下概念,servlet中的
session监听和Attribute监听含义有差别,session监听指的不是我们一般所理解的放|一个session或者销毁一?
sessionQ这是Attribute监听的功能,因ؓservlet中放|session的语法是session.setAttribute
(“session名?要放入的对象)。而session监听Q监听的是HTTPq接Q只要有用户与serverq接Q就连接的是一个空白的jsp?
面,也会触发session事gQ所以此处的session实际上指的是connectionQ用来统计当前在U用h最合适了。不知道我说清楚了没有?
下面分别讲解q两U监听方式?br />
1、 session监听
首先~写一个session监听c,实作HttpSessionListener接口Q它的作用是计算当前有多个在线用户Q?br />
怎么P是不是一目了Ӟcount被定义ؓstaticQ是因ؓ要保证整个系l只有这一个count。如果你实在不放心,可以把它写成一个单例类?br />
然后在web.xml中声明这个监听器Q?br /><listener>
<listener-class>
org.bromon.test.SessionCount
</listener-class>
</listener>
~写一个测试页面test.jspQ内Ҏ获得countQ?br /><%
int count=org.bromon.test.SessionCount.getCount();
out.println(count);
%>
需要注意的是,q里Ҏ不涉及Q何session的操作。重启动App serverQ试着q接test.jspQ可以看到监听器已经开始工作?br />
2、 Attribute监听
作ؓ一个站内消息系l,肯定要获得所有登陆者的IDQ才有可能互发消息。这涉及Attribute监听。假设我们写了个用户登陆的模块,用户通过w䆾验证之后会生一个sessionQ保存它的相关信息,比如Q?br />
做过jsp的兄弟应该对q段代码再熟悉不q了Q下面写个监听器来监听用L陆,把所有用LID保存C个List当中Q这个监听器实作HttpSessionAttributeListener接口Q?br />
写个单的jsp来得到用户列表:
<%
java.util.List list=org.bromon.test.OnlineList.getList();
out.println(“共有?list.size()+”名用户已登陆:?;
for(int I=0;I<lise.size();i++)
{
out.println(list.get(i));
}
%>
也许你说Q这有什么神奇呢Q监听session而已Q不着急,看看xmlhttp?br />
二、 XMLHTTP
XMLHTTP的用处很多,q里只说我们需要的Q就是无h的与server通信Q看q段代码Q?br />
豁然开朗,q段代码是打开一个HTTPq接Q以标准
的HTTP格式传递数据,如果你喜Ƣ,可以用XML的格式来传递。更改一下xml对象的构造方式就可以兼容Mozilla和Netscape。下面来写一
个轮询,每隔一D|间刷Cơ用户列表,当然Q是不需要刷新页面的Q?br />
<Environment name="maxExemptions" type="java.lang.Integer"
value="15"/>
<Parameter name="context.param.name" value="context.param.value"
override="false"/>
<Resource name="jdbc/tzwdb" auth="Container"
type="oracle.jdbc.pool.OracleDataSource"/>
<ResourceParams name="jdbc/tzwdb">
<parameter><name>factory</name><value>oracle.jdbc.pool.OracleDataSourceFactory</value></parameter>
<parameter><name>driverClassName</name><value>oracle.jdbc.driver.OracleDriver</value></parameter>
<parameter><name>url</name><value>jdbc:oracle:thin:@127.0.0.1:1521:ORCL</value></parameter>
<parameter><name>username</name><value>demo</value></parameter>
<parameter><name>password</name><value>demo</value></parameter>
<parameter><name>serverName</name><value>127.0.0.1</value></parameter>
<parameter><name>databaseName</name><value>ORCL</value></parameter>
<parameter><name>portNumber</name><value>1521</value></parameter>
<parameter><name>maxActive</name><value>30</value></parameter>
<parameter><name>maxIdle</name><value>10</value></parameter>
<parameter><name>maxWait</name><value>500</value></parameter>
<parameter><name>description</name><value>oracle</value></parameter>
</ResourceParams>
<Resource name="mail/Session" auth="Container"
type="javax.mail.Session"/>
<ResourceParams name="mail/session">
<parameter>
<name>mail.smtp.host</name>
<value>localhost</value>
</parameter>
</ResourceParams>
</Context>
2、连接数据库
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
/**
* @author : 萧秋?br /> *
* @contact me :
cnyanhai@hotmail.com
*
*/
public class DBManager {
static Logger logger = Logger.getLogger(DBManager.class.getClass());
private Context initCtx = null;
private Context ctx = null;
private DataSource ds = null;
private long timeout = 5000;
private Statement theStatement = null;
private PreparedStatement thePstmt = null;
private static final String userName = "tzw";
private static final String password = "ywsoft";
/***************************************************************************
*
* 初试化initCtx
*
* 取得数据源对?br /> *
**************************************************************************/
public DBManager() {
try {
initCtx = new InitialContext();
//init contextQread config web.xml
if (initCtx == null) {
throw new Exception("Initial Failed!");
}
ctx = (Context) initCtx.lookup("java:comp/env");
//find "jdbc/tzwdb" object this configruation in the SERVER.XML of
// Tomcat
if (ctx != null) {
ds = (DataSource) ctx.lookup("jdbc/tzwdb");
}
if (ds == null) {
throw new Exception("Look up DataSource Failed!");
}
} catch (Exception e) {
logger.error("Look up DataSource error! -- " + e.getMessage());
}
}
/***************************************************************************
*
* get Connection
*
* @return Connection
*
**************************************************************************/
public synchronized Connection getConnection() {
//get connection and set to delay time
long startTime = new java.util.Date().getTime();
Connection con = null;
while (con == null) {
con = newConnection();
if (con != null) {
logger.info("Create New Connection!");
break;
}
try {
logger.info("Connection timeoutQPlease wait " + timeout + "ms");
wait(timeout);
} catch (InterruptedException e) {
logger.warn("Connection timeout! -- " + e.getMessage());
}
if ((new java.util.Date().getTime() - startTime) >= timeout) {
logger.warn("Connection timeout!");
break;
}
}
return con;
}
private Connection newConnection() {
Connection con = null;
try {
con = ds.getConnection(userName, password);
if (con == null) {
throw new Exception("Create Connection Failed!");
}
} catch (Exception e) {
logger.warn("Create Connection Failed! -- " + e.getMessage());
}
return con;
}
/***************************************************************************
*
* release the connection
*
**************************************************************************/
public synchronized void freeConnection(Connection conn, PreparedStatement pstmt) {
try {
//close PreparedStatement
if (pstmt != null) {
pstmt.close();
pstmt = null;
}
} catch (Exception e) {
logger.warn("release stmt,pstmt error! -- " + e.getMessage());
}
try {
//close Connection
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
logger.warn("release conn error! -- " + e.getMessage());
}
}
在JSP中我们经常要调用服务器端的一些dos命oQ已辑ֈ一些特D的效果Q但同时调用服务器端的dos命o也存在着一些安全隐患,因此需要慎重用?/font>
以下以一个例子来说明用jsp执行dos的过E,比如在服务器端每天都会自动生成一个目录(目录名称为当天的日期Q,再此目录下会生成一些当天的新闻? Ӟ理员会把这些文件几个月作一ơ备份,备䆾完后在把q些文g删除?/font>
如果在服务器上,我们可以在dos下直接执行c:\j2sdk\jar cf d:\bak\200502.jar d:\news\20050101 命oQ?然后再把20050101目录删除卛_?/font>
在JSP中我们应当这么来?/font>
<%
//执行dos命o
String commandstr = "c:/j2sdk/jar cf d:/bak/200502.jar d:/news/20050101";
Process p ;
try {
p = Runtime.getRuntime().exec(commandstr);
//{待刚刚执行的命令的l束
while (true){
if(p.waitFor() == 0) break;
}
} catch (Exception e) {
out.println(e.toString());
}
//删除已经打包的文件及其目?br />File f = new File("d:/news/20020101");
String[] allFiles = f.list();
for (int i = 0; i < allFiles.length; i++) {
File delF = new File("d:/news/20050101/"+allFiles[i]);
delF.delete();
}
File delD = new File("d:/news/20050101");
delD.delete();
%>
在jsp中以下代码必L行,如果没有该代码,则由于删除文件的速度快于打包的速度Q因此当压羃包还没有打包完成Q一些文件已l被删除Q加入下面的代码Q?
会在此一直做循环Q一直p.waitFor()Q这个方法的说明是:{待子进E的l束Q如果已l结束,一般返?Q返?为止才会接着执行后面的代?br />while (true){
if(p.waitFor() == 0) break;
}