2014-10-17 56 views
1

我看到不同的行爲和在包含多個窗體的頁面中。PostConstruct方法與richfaces 4.2再次調用,與我的工作正常

這是我支持bean:

import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

@ManagedBean 
@ViewScoped 
public class MultiFormBean 
{ 
    String inputText1 = ""; 
    String inputText2 = ""; 

    @PostConstruct 
    public void initializeBean(){ 
     System.out.println("PostConstruct Called ------------------"); 
    } 

    public String getInputText1() 
    { 
     return inputText1; 
    } 

    public void setInputText1(String inputText1) 
    { 
     this.inputText1 = inputText1; 
    } 

    public String getInputText2() 
    { 
     return inputText2; 
    } 

    public void setInputText2(String inputText2) 
    { 
     this.inputText2 = inputText2; 
    } 

    public void doSubmit1() { 
     inputText2 = inputText1; 
    } 

    public void doSubmit2() { 
     inputText1 = inputText2; 
    } 

} 

當我使用下面的XHTML,點擊Submit1和Submit2任意次數不會叫@PostConstruct不止一次:

<h:body> 
     <h:form id="firstForm" prependId="false"> 
      <h:panelGroup layout="block" id="renderTarget1"/> 
      <h:inputText id="first_input" value="#{multiFormBean.inputText1}"/> 
      <h:commandButton id="click1" action="#{multiFormBean.doSubmit1}" value="submit1" type="submit" 
          onclick="javascript:jsf.ajax.request(this, event, {execute:'firstForm', render:'renderTarget1 secondForm'}); return false;"> 
      </h:commandButton> 
     </h:form> 
     <h:form id="secondForm" prependId="false"> 
      <h:panelGroup layout="block" id="renderTarget2"/> 
      <h:inputText id="second_input" value="#{multiFormBean.inputText2}"/> 
      <h:commandButton id="click2" action="#{multiFormBean.doSubmit2}" value="submit2" type="submit" 
          onclick="javascript:jsf.ajax.request(this, event, {execute:'secondForm', render:'renderTarget2 firstForm'}); return false;"> 

      </h:commandButton> 

     </h:form>  
</h:body> 

但下面的XHTML將調用@PostConstruct不止一次:

<h:body> 
     <h:form id="firstForm" prependId="false"> 
      <h:panelGroup layout="block" id="renderTarget1"/> 
      <h:inputText id="first_input" value="#{multiFormBean.inputText1}"/> 
<a4j:commandButton id="click1" action="#{multiFormBean.doSubmit1}" value="submit1" type="submit" execute="@form" render="renderTarget1,secondForm"/> 
     </h:form> 
     <h:form id="secondForm" prependId="false"> 
      <h:panelGroup layout="block" id="renderTarget2"/> 
      <h:inputText id="second_input" value="#{multiFormBean.inputText2}"/> 

      <a4j:commandButton id="click2" action="#{multiFormBean.doSubmit2}" value="submit2" type="submit" execute="@form" render="renderTarget2,firstForm"/> 


     </h:form>  
    </h:body> 

可以請一個nyone幫我用<a4j:commandButton>代替<h:commandButton>

而且我知道我不能調用方法doSubmit2()與A4J的commandButton

+0

另外我看到,我不能調用方法doSubmit2()與a4j commandButton – user3161574 2014-10-17 22:26:37

回答

0

我覺得這裏的問題是在內部JSF2和Richfaces4錯誤。從4版開始,Richfaces開始使用JSF嵌入式ajax功能。並且在使用Ajax請求的頁面上使用多個表單存在一個錯誤。 richfaces渲染當前呈現視圖狀態的id的特殊隱藏輸入的問題。當新的視圖被渲染時,這個id被改變。它也會隨每個請求一起提交,以表明它屬於某個特定的視圖。因此,當第一個Ajax請求之後,同一頁面上有多個表單時,視圖狀態出錯了,並且不能再次提交。有時行爲看起來非常非常粗糙,沒有邏輯描述。

PostConstruct被調用兩次,因爲服務器認爲兩個請求屬於不同的視圖(視圖狀態不是合併的),並且就bean的視圖範圍而言,它被創建兩次。在點擊ajax之後,可以完全停止使用它,因爲服務器無法識別該視圖(可能是您無法單擊第二個提交按鈕時看到的內容)。

首先,我建議您使用最新版本的JSF和Richfaces。這個bug(還有更多)可能已經在那裏修復了。