@ManagedProperty初始化

时间:2013-05-05 15:33:34

标签: jsf-2 primefaces

我想将第一个属性managedabean“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>

第一个ManagedBean:

 @RequestScoped
    public class ReclamationMB extends AbstractMB implements Serializable {
        private int refCont;//ref contact recuperé pour la creation de la  reclamation 
        .....
//getter and setter

第二个豆科植物

 @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);
    }

1 个答案:

答案 0 :(得分:0)

问题是JSTL的<c:set>是一个视图构建时标记处理程序,而不是视图渲染时间 UI组件,所以你的问题是经典的一:当你期望它设置值时,它不再存在于组件树中。此外,它在没有<h:selectOneMenu>标签的情况下运行。

当然,如果<h:selectOneMenu>已实现ActionSource,就像<h:commandButton>一样,您可以嵌套JSF <f:setPropertyActionListener>,原因是使用所需的值设置bean属性,与<f:setPropertyActionListener target="#{contactMB.refContt}" value="#{reclamationMB.refCont}">中一样。但你不能这样做。

基本上你可以做两件事:

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