2014-10-17 76 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(还有更多)可能已经在那里修复了。