Jsf 2 @ManagedProperty初始化

Jsf 2 @ManagedProperty初始化,jsf-2,primefaces,Jsf 2,Primefaces,我想将第一个属性ManagedBean“refCont”的选定值存储在托管bean的第二个属性中,然后发布。但在第二次选择后,该值将显示,知道显示的值是第一次选择的值。我不知道是什么缘故 .xhtml <h:outputText value="* Contact" /> <h:selectOneMenu id="contact" value="#{reclamationMB.refCont}" onchange="lazyload()"> <c:se

我想将第一个属性ManagedBean“refCont”的选定值存储在托管bean的第二个属性中,然后发布。但在第二次选择后,该值将显示,知道显示的值是第一次选择的值。我不知道是什么缘故

.xhtml

<h:outputText value="* Contact" /> 
<h:selectOneMenu   id="contact" value="#{reclamationMB.refCont}"  onchange="lazyload()">
    <c:set value="#{reclamationMB.refCont}" target="#{contactMB}" property="refContt" />
    <f:ajax  listener="#{contactMB.affichReclContact}" />
    <f:selectItem itemLabel="Select One"  noSelectionOption="true" itemValue="---" /> 
    <f:selectItems value="#{contactMB.contactsClient}" noSelectionValue="" var="contact" itemValue="#{contact.refCont}" itemLabel="#{contact.nomCont}" />
    <f:selectItems itemLabel="Autre" itemValue=""></f:selectItems>
</h:selectOneMenu>
二熟豆

 @RequestScoped 
    public class ContactMB extends AbstractMB implements Serializable {
    @ManagedProperty("#{reclamationMB.refCont}")
            private int refContt;
            .....
    //getter an setter
    public void affichReclContact(AjaxBehaviorEvent event){
            contact=service.AffichContact(refContt);
            setContact(contact);
    }

问题在于JSTL的
是一个视图构建时标记处理程序,而不是视图呈现时UI组件,因此您的问题是一个经典的问题:当您希望它设置值时,它不再存在于组件树中。此外,它在根本没有
标记的情况下运行

当然,如果
实现了
ActionSource
,就像
一样,您可以嵌套JSF
,以便使用所需的值设置bean属性,如
中所示。但你不能那样做

基本上你可以做两件事:

  • 使用PrimeFaces
    标记,它可以保存上述操作侦听器以设置所需的值,并在
    onchange
    方法中调用它。在堆栈溢出和优秀的PrimeFaces文档中,有很多这样的例子
  • 使用bean注入,而不仅仅是bean属性注入。在前一种情况下,表达式
    reclamationMB.getRefCont()
    将始终在holder bean中产生正确的结果,前提是
    reclamationMB
    是通过
    @ManagedProperty
    保存注入bean的变量

  • 谢谢你的解释,但是我不能做第一个,因为我已经使用了我在这里称之为的
    ,我想我不能在同一次更改中调用两个
    。第二个:我有一个错误,当我使用“bean injection”时,找不到
    property=“reclamationMB.refCont”
    。首先,您可以调用几个远程函数,但这不是必需的,而且可能太贵。不过,您可以将/nest
    添加到该
    中。至于第二个,
    只运行一次,所以您不能用它来解决您的问题>。相反,*注入整个bean来完成工作:
    @ManagedProperty(“{reclamationMB}”)private reclamationMB reclamationMB使用getter/setter,在这种情况下,您不需要任何其他东西,以防注入的bean被及时初始化。很好,它可以工作,但是在第二个选择中。我注入整个豆子,然后添加
    
     @RequestScoped 
        public class ContactMB extends AbstractMB implements Serializable {
        @ManagedProperty("#{reclamationMB.refCont}")
                private int refContt;
                .....
        //getter an setter
        public void affichReclContact(AjaxBehaviorEvent event){
                contact=service.AffichContact(refContt);
                setContact(contact);
        }