2012-05-29 31 views
1

嗨已创建一个接口Java的会话Bean上兰

@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上,我有2台电脑,IP地址为192.168.1.4和192.168.1.2。服务器开始192.168.1.4,当我从服务器访问client.jsp页面时,创建MathImp的一个新对象,然后当我通过另一个comp访问时,似乎使用同一对象

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

回答

1

简而言之:一个JSP - >相应Servlet的一个实例 - > EJB注入一次 - >所有请求之间共享同一个实例,而不管哪个客户端。

更详细的解释:

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

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

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

+0

谢谢,但如果我们将它存储在HttpSession中,那么在会话中存储一个普通对象和存储一个会话bean对象会有什么区别? (因为两者都可以保留到会话过期,并且两者的行为相同) – Akash

+0

这取决于您是否有理由首先使用EJB。一些常见的原因是:交易,安全性,分配(用于性能或故障转移等)。 –

+0

k谢谢你的帮助 – Akash