为什么在具有ViewScoped的RichFaces 4.3组件内多次调用PostConstruct方法?

时间:2013-11-05 16:16:08

标签: ajax jsf-2 richfaces view-scope postconstruct

我遇到了关于Tomcat 7的JSF 2.2,richfaces 4.3.2的问题。 我的网页已注明ViewScoped。 我显示第一个表格。当我更改值并选择特定值时,我会在rich:panel内通过ajax显示a4j:outputPanel元素。 在此a4j:outputPanelrich:panel组件中,我有一个执行表单的h:commandButton。 如果字段为空(例如其他内容)

,我想检索表单的消息错误

但是当我点击h:commandButton时,视图会重新显示,并且会重新执行@postcontruct方法。它应该只在视图范围内执行一次,我错了吗?

我不希望视图被反应化,我希望在我点击ajaxoutputPanel内部时显示h:commandButton。(我希望看到我旁边的h:messages形式领域......不多问:-))

我读到了一些bug ...有没有办法改变这种行为,而不是传递给SessionScoped。

谢谢老兄。

    <fieldset>

    <h:form>

        <h:panelGrid columns="3">

            <h:outputText value ="Nom de l'étude : "></h:outputText> 
            <h:inputText id="study_name" value="#{analyse.study_name}"   size="20" required="true"  label="Nom de l'étude" />
            <h:message for="study_name" style="color:red" />

            <h:outputText value ="Analyse : "> </h:outputText> 
            <h:selectOneMenu  id = "analyse" value="#{analyse.analyse_type}">
            <f:selectItems value="#{analyse.analyse_type2Value}" />
                  <f:ajax execute="analyse" render=":ajaxOutputPanelAnalyse"  /> 
            </h:selectOneMenu>

         </h:panelGrid>

    </h:form>

</fieldset>

    <a4j:outputPanel id="ajaxOutputPanelAnalyse" layout="block" ajaxRendered="true"  >

    <rich:panel  id="richPanelAnalyse"  rendered="#{analyse.analyse_type == 'NGS' and request.isUserInRole('ROLE_ADMIN_PROFILER_NGS')}" >

        <h:form id ="NGS_form" >

            <h:panelGrid columns="4">

                <h:outputText value ="Run # :"> </h:outputText> 
                <h:inputText id="run_number" value="# {analyse.run_number}" size="20" required="true" label="Run" />
                <h:message for="run_number" style="color:red" />
                <h:outputText></h:outputText>


            </h:panelGrid>



                 <h:commandButton value="Submit" action="#{analyse.addAnalyse}"/>


            </h:form>

    </rich:panel>




  </a4j:outputPanel>

在豆...

@PostConstruct
public void setFlashParam(){

    System.out.println("POST CONSTRUCT MON POTE");

    FacesContext facesContext = FacesContext.getCurrentInstance();


     return;
}

public String addAnalyse(){


    System.out.println("Kikou");

    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(" - Ajout de l'analyse ?"+" pour le patient ?"+" dans l'étude "+ study_name +" -"));


    return "pretty:home";

}

1 个答案:

答案 0 :(得分:1)

感谢BalusC的这篇文章(一如既往)http://balusc.blogspot.fr/2011/09/communication-in-jsf-20.html#AjaxRenderingOfContentWhichContainsAnotherForm

编辑:但是当你尝试添加一个rich:fileupload时,它不再有效:h:inputFile ...当你点击按钮时,它会在新的textarea中显示奇怪的html代码。 ......这很奇怪......

           <rich:fileUpload  id="upload" fileUploadListener="#{analyse.test}"  acceptedTypes="bam,pdf,png" ontyperejected="alert('Seulement les fichiers avec l'extension bam et pdf sont acceptés.');" maxFilesQuantity="3">
                  <a4j:ajax event="uploadcomplete" execute="@none" render="upload" />        
            </rich:fileUpload>