Jsf 2 在facelets模板上重用JSF2视图范围Bean
我有一个共同的任务,选择一个或多个“LocalizaoTo”,然后再在页面上执行任何其他操作 目前,数据检索/处理/ajax事件等的逻辑都是在一个名为“SeletorLocalizaoMB”的Jsf 2 在facelets模板上重用JSF2视图范围Bean,jsf-2,cdi,facelets,backing-beans,Jsf 2,Cdi,Facelets,Backing Beans,我有一个共同的任务,选择一个或多个“LocalizaoTo”,然后再在页面上执行任何其他操作 目前,数据检索/处理/ajax事件等的逻辑都是在一个名为“SeletorLocalizaoMB”的ViewScopedbean上维护的,我希望在同一页面上使用同一bean的多个实例 首先,我使用复合组件,但当我选择一个节点时,它存储在页面的最后一个bean中 如果我在TesteSeletorMB上声明了3个实例: @Named @ViewScoped public class TesteSeletorM
ViewScoped
bean上维护的,我希望在同一页面上使用同一bean的多个实例
首先,我使用复合组件,但当我选择一个节点时,它存储在页面的最后一个bean中
如果我在TesteSeletorMB上声明了3个实例:
@Named
@ViewScoped
public class TesteSeletorMB implements Serializable {
@Inject
@Getter @Setter
private SeletorLocalizacaoMB instanceOne;
@Inject
@Getter @Setter
private SeletorLocalizacaoMB instanceTwo;
@Inject
@Getter @Setter
private SeletorLocalizacaoMB instanceThree;
}
无论我使用页面上的哪个组件,instanceThree始终保留值
根据一些研究,我了解到复合组件不是解决这个问题的理想方案
因此,我更改了UI实现,并使用Facelets创建了一个名为seletor.xhtml的“模板”
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
xmlns:o="http://omnifaces.org/ui">
<p:dialog header="Busca Hierarquica"
id="#{id}ModalTree"
widgetVar="dlgSelecaoHierarquica"
showEffect="fade"
hideEffect="fade"
closeOnEscape="true"
modal="#{bloqueiaModal}"
height="400px"
width="500px">
<h:panelGrid columns="2">
<p:commandButton id="#{id}btnSelecao"
value="Selecionar e Voltar"
action="#{mb['selecionarLocalHierarquico']}"
update="@(.#{id}-auto-complete)"
oncomplete="bloqueiaAutoMulti();"/>
<p:commandButton value="Voltar"
type="button"
onclick="PF('dlgSelecaoHierarquica').hide();" />
</h:panelGrid>
<p:scrollPanel style="width:100%;height:350;" mode="native">
<p:tree id="#{id}Tree"
style="width:100%;height:100%;"
styleClass="estilo-arvore"
value="#{mb.arvoreHierarquica}"
var="local"
selectionMode="multiple"
dynamic="true"
animate="true">
<p:ajax event="select" listener="#{mb['onNodeSelect']}" update="@this"/>
<p:treeNode >
<h:outputText value="#{local.cdClasseLocal}: #{local.cdLocalizacao} #{local.niveis}" />
</p:treeNode>
</p:tree>
</p:scrollPanel>
</p:dialog>
</ui:composition>
“seletor.xhtml”上使用的CDIBean
import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@Named
@ViewScoped
public class SeletorLocalizacaoMB implements Serializable {
private List<LocalizacaoTO> locaisHierarquicosSelecionados;
private TreeNode arvoreHierarquica;
//PostConstruct, Ajax events and things :)
}
import javax.inject.Named;
导入org.omnifaces.cdi.ViewScoped;
@命名
@视域
公共类SeletorLocalizaoMB实现可序列化{
私人名单地方等级;
私人特列诺德·阿沃雷赫拉基卡;
//后期构造、Ajax事件和其他内容:)
}
在我的示例中,我希望TesteSeletorMB变量(seletorAlpha和seletorBravo)在其列表中包含不同的值。可能吗 我试图将SeletorLocalizaoMB的作用域更改为
@Dependent
,但它也不起作用。这就是事情变得混乱的地方。在阅读中,第一个州说:
使用scope@Dependent声明的bean的行为与使用其他>内置范围类型的bean不同。当一个bean被声明为具有scope@Dependent时:
在多个injection>点之间从未共享bean的注入实例
它不应该持有相同的实例,对吗
环境
- WebSphere Application Server 8.5.5.2
- ApacheMyFaces2.0.2
- PrimeFaces 5.0
- OmniFaces 1.7
import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@Named
@ViewScoped
public class TesteSeletorMB implements Serializable {
@Inject
@Getter @Setter
private SeletorLocalizacaoMB seletorAlpha;
@Inject
@Getter @Setter
private SeletorLocalizacaoMB seletorBravo;
}
import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@Named
@ViewScoped
public class SeletorLocalizacaoMB implements Serializable {
private List<LocalizacaoTO> locaisHierarquicosSelecionados;
private TreeNode arvoreHierarquica;
//PostConstruct, Ajax events and things :)
}