Java @无状态会话Bean充当@Singleton Bean
我正在尝试一个使用EJB会话bean的示例。我想看看他们之间的区别。我的基本项目图如下 这个项目就像一个购物车。当我通过注入的EJB调用托管bean以获得添加的URON对象的结果时,结果列表必须是最后一个URON对象。因为我的EJB是@无状态bean。但是,当我运行应用程序时,它会保留所有新添加的Urun对象。但它是无状态的,它必须在每个操作中保留最后一个Urun对象。然后,当我在另一个web浏览器中打开应用程序页面时,它会列出之前添加的Urun对象的列表。但在我的模型中,托管bean和Ejb是无状态的。但它扮演着一个独生子的角色。我的问题在哪里Java @无状态会话Bean充当@Singleton Bean,java,singleton,ejb-3.0,stateless,Java,Singleton,Ejb 3.0,Stateless,我正在尝试一个使用EJB会话bean的示例。我想看看他们之间的区别。我的基本项目图如下 这个项目就像一个购物车。当我通过注入的EJB调用托管bean以获得添加的URON对象的结果时,结果列表必须是最后一个URON对象。因为我的EJB是@无状态bean。但是,当我运行应用程序时,它会保留所有新添加的Urun对象。但它是无状态的,它必须在每个操作中保留最后一个Urun对象。然后,当我在另一个web浏览器中打开应用程序页面时,它会列出之前添加的Urun对象的列表。但在我的模型中,托管bean和Ejb
@Stateless
public class AlisverisSepetiEJB {
List<Urun> urunler=new ArrayList<>();
public List<Urun> getUrunler() {
return urunler;
}
public void setUrunler(List<Urun> urunler) {
this.urunler = urunler;
}
public void urunEkle(Urun urun){
urunler.add(urun);
}
}
阿尔维里塞佩蒂
阿尔维里塞佩蒂
调用之间很可能共享相同的AliverissepiteEJB
实例(容器可以这样做,这是完全合法的)。正是由于@stateless
EJB的无状态特性,您不应该在其中声明实例属性
删除列表urunler=new ArrayList()代码>声明和所有相关方法,将无状态bean视为一个类,其中其所有方法都是静态的,这意味着它们不能使用任何实例属性,并且必须完全独立于实例数据;如果在调用之间需要维护任何状态,则必须将其作为参数从调用EJB的点传递出去。@Stateless
EJB中唯一允许的实例变量是属性,这些属性本身是无状态和/或不可变的
如果需要在调用之间维护购物车的状态,则必须将其保存在有状态上下文(例如,web应用程序的会话
上下文)中的其他位置,或者将EJB标记为@stateful
。如果@Stateless bean中确实有一些成员变量,那么它应该只是一个不包含任何“状态”信息的EntityManager。无状态bean可能包含所有类型的状态,用户可观察状态除外。因此,一个entitymanager,可能是一个连接到某个东西等都是好的,只要它们在内部用作缓存或性能优化。在发布时,请不要发布本地化的源代码。
@ManagedBean(name="bean")
@RequestScoped
public class JSFYonetimliNesne {
public JSFYonetimliNesne(){
System.out.println("Yönetimli nesne çalıştı");
}
@EJB
AlisverisSepetiEJB alisverisSepeti;
Urun urun=new Urun();
List<Urun> urunler;
public List<Urun> getUrunler() {
return alisverisSepeti.getUrunler();
}
public void setUrunler(List<Urun> urunler) {
this.urunler = urunler;
}
public Urun getUrun() {
return urun;
}
public void setUrun(Urun urun) {
this.urun = urun;
}
public void sepeteKoy(){
alisverisSepeti.urunEkle(urun);
urun=new Urun();
}
}
public class Urun {
String urunAdi;
Long fiyat;
Long gramaj;
public Long getFiyat() {
return fiyat;
}
public void setFiyat(Long fiyat) {
this.fiyat = fiyat;
}
public Long getGramaj() {
return gramaj;
}
public void setGramaj(Long gramaj) {
this.gramaj = gramaj;
}
public String getUrunAdi() {
return urunAdi;
}
public void setUrunAdi(String urunAdi) {
this.urunAdi = urunAdi;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Alışveriş Sepeti</title>
</h:head>
<h:body>
Alışveriş Sepeti
<h:form>
<h:panelGrid columns="2">
<h:outputLabel value="Ürün adı : "/>
<h:inputText value="#{bean.urun.urunAdi}"/>
<h:outputLabel value="Ürün fiyatı : "/>
<h:inputText value="#{bean.urun.fiyat}"/>
<h:outputLabel value="ÜRün gramajı : "/>
<h:inputText value="#{bean.urun.gramaj}"/>
</h:panelGrid>
<h:commandButton action="#{bean.sepeteKoy}" value="Sepete Ekle"/>
<br><h:outputLabel value="Sepetteki Ürünler"/></br>
<h:dataTable value="#{bean.urunler}" var="item" border="1">
<h:column >
<f:facet name="header">
<h:outputLabel value="Ürün adı"/>
</f:facet>
<h:outputText value="#{item.urunAdi}"/>
</h:column>
<h:column >
<f:facet name="header">
<h:outputLabel value="Ürün fiyatı"/>
</f:facet>
<h:outputText value="#{item.fiyat}"/>
</h:column>
<h:column >
<f:facet name="header">
<h:outputLabel value="Ürün gramajı"/>
</f:facet>
<h:outputText value="#{item.gramaj}"/>
</h:column>
</h:dataTable>
</h:form>
</h:body>
</html>