Lan上的Java会话Bean

时间:2012-05-29 18:24:34

标签: ejb ejb-3.0

您已创建一个界面

@Remote
public interface MathInter{
    public int add(int x, int y);
    public int  showResult();
}

和班级为

@Stateful(mappedName="test")
public class MathImp implements MathInter{
    public int result;
    public int showResult()
    {
        return result;
    }
    @Override
    public int add(int x, int y) {
        result = x + y;
        return x+y;
    }

}

并在client.jsp

上使用它
<%!
    @EJB(mappedName="abc")
    MathInter m;
%>

<%
    out.write("previous result was "+m.showResult());
    out.write("result is "+m.add((int)(Math.random()*100), (int)(Math.random()*100)));
%>

问题是在Lan上,我有两台IP地址为192.168.1.4和192.168.1.2的计算机。服务器开始192.168.1.4,当我从服务器访问client.jsp页面时,创建了一个新的MathImp对象,然后当我通过其他comp访问时,似乎使用了相同的对象

新客户端的新请求是否需要创建新对象?

1 个答案:

答案 0 :(得分:1)

很快:一个JSP - &gt;相应Servlet的一个实例 - &gt; EJB注入一次 - &gt;所有请求之间共享相同的实例,无论哪个客户端。

更长的解释:

不,容器不需要为每个新客户端创建新实例。但是对于每个依赖注入(如在您的情况下),并且对于每个JNDI查找容器,都需要创建有状态会话bean的新实例。

在您的情况下,注射只发生一次。这是因为容器将JSP编译为Servlet,并且该Servlet只有一个实例(因此只向该servlet的字段注入ejbs一次),它为所有请求提供服务。这就是为什么MathInter的相同实例在所有请求之间共享的原因。

如果你需要每个客户端实例(就像有状态会话bean一样),你不应该将它们注入到servlet中,而只是查找它们并存储对HttpSession的引用。