不同jsp访问同一个stateful session bean的困惑

04-02-18 iter
jsp1访问一个SFSB,比如就用counter,第一次返回1,刷新页面第二次返回2,。。3,456,的确是保存了state

这是用另外一个jsp2.jsp,里面代码与jsp1完全相同,这时候第一次返回是多少???

两个页面在同一个web container中的sessionid是一样。

竟然是不是记忆下上次的状态而是从1开始,然后递增。。。

Why??

//bean code

package com.test;

import javax.ejb.SessionBean;

import javax.ejb.SessionContext;

import javax.ejb.CreateException;

public class CounterBean

implements SessionBean {

SessionContext sessionContext;

private int i = 0;

public void ejbCreate() throws CreateException {

log("counter create");

}

public void ejbRemove() {

log("remove");

}

public void ejbActivate() {

log("activate");

}

public void ejbPassivate() {

log("passivate");

}

public void setSessionContext(SessionContext sessionContext) {

this.sessionContext = sessionContext;

}

public int count() {

log("counter called");

return ++i;

}

public void log(String s){

System.out.println(s);

}

}

//jsp code

<%@ page import="com.test.*" %>

<%@ page import="javax.ejb.*" %>

<%@ page import="java.util.*" %>

<%@ page import="javax.naming.*" %>

<%@ page import="javax.rmi.PortableRemoteObject" %>

<%@ page import="java.rmi.RemoteException" %>

<%!

private Counter counter = null;

public void jspInit() {

try {

InitialContext ic = new InitialContext();

Object objRef = ic.lookup("Counter");

if(objRef==null)

System.out.println("object is null");

else

System.out.println("object is not null");

CounterHome home = (CounterHome)PortableRemoteObject.narrow(objRef, CounterHome.class);

System.out.println("aaaa");

counter = home.create();

System.out.println("bbb");

} catch (RemoteException ex) {

System.out.println("Couldn't create bean."+ ex.getMessage());

} catch (CreateException ex) {

System.out.println("Couldn't create bean."+ ex.getMessage());

} catch (NamingException ex) {

System.out.println("Unable to lookup home"+ ex.getMessage());

}

}

public void jspDestroy() {

counter = null;

}

%>

<%=counter.count()%>

比如当前jsp1.jsp返回10,在另外一台机器上测试,同样一个页面竟然从11开始,而不是从一开始,问题出在哪里?

如果是这样,那么stateful session bean的状态和http session还是有很大的不同,

http session可以追综同一个sessionid下的状态,

而sfsb可以获得同一个程序全部访问的状态(包括不同机器,不同http session的状态),如果是不同app访问同一sfsb 则状态却不保存。

那位兄弟解释一下,tks

猜你喜欢