1

您好已创建一个界面为

@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)));
%>

问题是在局域网上,我有两台电脑,IP 地址分别为 192.168.1.4 和 192.168.1.2。服务器从192.168.1.4开始,当我从服务器访问client.jsp页面时,创建了一个新的MathImp对象,然后当我通过另一个comp访问时,似乎使用了相同的对象

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

4

1 回答 1

1

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

更长的解释:

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

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

如果您需要每个客户端实例(如有状态会话 bean 的情况),则不应将它们注入 servlet,而只是例如查找它们并存储对 HttpSession 的引用。

于 2012-05-29T18:45:24.287 回答