您已创建一个界面
@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访问时,似乎使用了相同的对象
新客户端的新请求是否需要创建新对象?
答案 0 :(得分:1)
很快:一个JSP - &gt;相应Servlet的一个实例 - &gt; EJB注入一次 - &gt;所有请求之间共享相同的实例,无论哪个客户端。
更长的解释:
不,容器不需要为每个新客户端创建新实例。但是对于每个依赖注入(如在您的情况下),并且对于每个JNDI查找容器,都需要创建有状态会话bean的新实例。
在您的情况下,注射只发生一次。这是因为容器将JSP编译为Servlet,并且该Servlet只有一个实例(因此只向该servlet的字段注入ejbs一次),它为所有请求提供服务。这就是为什么MathInter的相同实例在所有请求之间共享的原因。
如果你需要每个客户端实例(就像有状态会话bean一样),你不应该将它们注入到servlet中,而只是查找它们并存储对HttpSession的引用。