2012-04-03 59 views
1

我正在學習RichFaces。將a4j:commandButton添加到.xhtml。下面是我.xhtml代碼,a4j:commandButton不起作用。點擊沒有發生任何操作

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:rich="http://richfaces.org/rich" 
xmlns:a4j="http://richfaces.org/a4j"> 
    <h:head> 
    </h:head> 

    <h:body> 
    <h:form> 
    <rich:panel> 
     <h:panelGrid column="2"> 
      <h:inputText value="#{echoBean.name}"/> 
      <h:outputText value="#{echoBean.name}" id="echoTxt" /> 
      <h:outputText value="Count" /> 
      <h:outputText id="countTxt" value="#{echoBean.count}" /> 
     </h:panelGrid> 
     <a4j:commandButton value="Send" actionListener="#{echoBean.incrementCount}" reRender="echoTxt, countTxt"/> 
    </rich:panel> 
    </h:form> 
    </h:body> 
</html> 

我使用RichFaces的4。所以我沒有給任何A4J過濾器

但A4J:的commandButton不工作。它不會對點擊進行任何操作。堆棧跟蹤沒有錯誤。

我錯過了什麼嗎?

感謝

更新:

我已經取代了的ActionListener與行動。 現在的onclick它拋出以下異常按鈕的

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
    at java.util.ArrayList.rangeCheck(ArrayList.java:604) 
    at java.util.ArrayList.get(ArrayList.java:382) 
    at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:165) 
    at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1560) 
    at com.sun.faces.application.view.StateManagementStrategyImpl$2.visit(StateManagementStrategyImpl.java:267) 
    at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1590) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601) 
    at javax.faces.component.UIForm.visitTree(UIForm.java:344) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601) 
    at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:254) 
    at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:188) 
    at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:453) 
    at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:148) 
    at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:303) 
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:192) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

我Managed Bean的代碼,

/** * * /

package org.droidaceapps.src; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 
import javax.faces.bean.SessionScoped; 
import javax.faces.event.ActionEvent; 

/** 
* @author yasodavenkat 
* 
*/ 
@ManagedBean(name="echoBean") 
@SessionScoped 
public class EchoBean { 

    private String name; 
    private int count; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getCount() { 
     return count; 
    } 

    public void setCount(int count) { 
     this.count = count; 
    } 

    public EchoBean() { 
    } 

    public void incrementCount(ActionEvent e){ 
     count = name.length(); 
    } 
} 

我明白,這是相關國家管理問題。我的猜測是正確的嗎?我想念其他什麼嗎?

謝謝

+0

服務器日誌/螢火蟲的任何錯誤? – Daniel 2012-04-03 10:52:20

+0

@Daniel - 服務器日誌中沒有錯誤。其實我期待在OutputText中顯示文本字段中給定字符串的長度。正常的commandButton正在發生。但是,如果我使用a4j:commandButton它根本不工作。 – droidsites 2012-04-03 13:12:08

回答

1

您使用actionListener您的命令按鈕,您應該使用action使它工作。

<a4j:commandButton value="Send" action="#{echoBean.incrementCount}" 
    reRender="echoTxt, countTxt"/> 

另外,不要忘記將你加入了execute屬性標籤發送數據。默認情況下,它會提交所有表單。您可以在component documentation中找到更多信息,您可以參考online showcase

UPDATE:

name變量爲空,這就是爲什麼它拋出這個錯誤。那是因爲你在使用。這是因爲,你這樣做是

<h:inputText value="#{echoBean.name}"/> 
<h:outputText value="#{echoBean.name}" id="echoTxt" /> 

echoBean.name在你的bean被設置好的兩次,第一次與inputText的值(你輸入的文字)和第二次用的outputText值(NULL) 。如果你想要這種行爲,你應該看看我在我的文章中添加的展示鏈接,並分析它是如何完成的。

+0

感謝您的回覆。只是看你的回覆,我嘗試添加action而不是actionListener。它採取了點擊事件,但它拋出了一個異常。當然,我不認爲這與此有關,但你可以幫助我。請在Managed Bean和錯誤跟蹤的問題中查看我的更新。 – droidsites 2012-04-03 14:23:56

+0

@droidsites我更新了我的答案。 – 2012-04-03 14:47:33

+0

只是急切地問....它是這個錯誤背後的原因,然後我想我是如何工作的,我用h:commandButton。然後自己回答,當使用h:commandButton時,它會刷新整個頁面,以便這些狀態值可用。但是在a4j的情況下:狀態是如何更新的? – droidsites 2012-04-03 15:37:33

0

這些是一些步驟來解決或檢查您的問題的解決方案。請注意,這是不完整的解決方案,由於有關項目較少資訊(支持bean不在這裏)

  1. 嘗試「H」或「T」的標籤,並嘗試運行它
  2. 檢查你提到管理豆你的bean範圍把它放在sessionscope

如果不行再來找你的支持bean和faces-config.xml中

+0

這個bean的範圍在這裏不是問題,因爲這個動作甚至可以通過'ApplicationScope'來觸發一個bean。 – 2012-04-03 13:56:57