2010-12-04 77 views
1

我有這個網站:問題與H:形式和p:阿賈克斯(鑽嘴魚科2.0.2和2.0.2 Primefaces)

<!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:p="http://primefaces.prime.com.tr/ui"> 

<h:head></h:head> 
<h:body> 


    <h:form id="form-some"> 
     <h:inputText id="copingFilePhaseFocus"> 
      <p:ajax event="focus" actionListener="#{installationController.startCopyingWarFile}" /> 
     </h:inputText> 
    </h:form> 


</h:body> 
</html> 

和備份豆:

@ManagedBean(name = "installationController") 
@SessionScoped 
public class InstallationController implements IPluginInstallationListener { 

    // Some methods here (...) 

    public void startCopyingWarFile(ActionEvent event) { 
     System.out.println("\n\n\n\nStarted\n\n\n\n"); 
    } 
} 

此代碼是在MyFaces 2.0.0下工作。但是在MyFaces 2.0.2或Mojarra 2.0.2下沒有。 通過告訴「不起作用」,我的意思是單擊(聚焦)輸入文本不會觸發actionListener(文本「開始」不會出現在標準輸出中)。 有沒有人有類似的問題?

EDIT 1(改變P上之後:AJAX到f:AJAX):

<p:outputPanel id="copingFilePhase"> 
     <p:accordionPanel speed="0.2" 
      rendered="#{pluginInstallerWebBean.copingFilePhase}"> 
      <p:tab 
       title="#{msg['installPlugin.copyingWar']} ... #{pluginInstallerWebBean.copingFilePhaseState}"> 
       <h:form prependId="false"> 
        <p:focus for="copingFilePhaseFocus" /> 
        <h:inputText id="copingFilePhaseFocus" 
         rendered="#{pluginInstallerWebBean.copingFilePhaseFocus}" 
         style="display:none;"> 
         <f:ajax event="focus" 
          render="copingFilePhase obtainingPluginInformationPhase" 
          listener="#{installationController.startCopyingWarFile}" /> 
        </h:inputText> 
       </h:form> 
       #{msg['installPlugin.copyingWarDescription']} 
      </p:tab> 
     </p:accordionPanel> 
    </p:outputPanel> 

    <p:outputPanel id="obtainingPluginInformationPhase">(...)</p:outputPanel> 

和錯誤是:

javax.faces.FacesException: 包含未知ID 「copingFilePhase ' - 不能在組件的上下文找到它 copingFilePhaseFocus

回答

4

這可能有兩種原因:

  1. 的Primefaces資源的servlet配置不正確,這將導致必要的Java腳本就不會被加載。您應該能夠通過檢查Web瀏覽器中的JS錯誤控制檯查看輸入聚焦時發生的任何JS錯誤。在Firefox中,控制檯可通過按Ctrl + Shift + J

    資源servlet將自動在Servlet的加載3.0環境(Glassfish的第三版下,Tomcat 7時,JBoss 6等),然而,在舊的環境中,你需要在web.xml手動進行配置:

    <servlet> 
        <servlet-name>PrimeFaces Resource Servlet</servlet-name> 
        <servlet-class>org.primefaces.resource.ResourceServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>PrimeFaces Resource Servlet</servlet-name> 
        <url-pattern>/primefaces_resource/*</url-pattern> 
    </servlet-mapping> 
    
  2. 方法簽名是錯誤的。您應該能夠通過讀取服務器日誌並在日誌中看到javax.el.MethodNotFoundException來查看它。您問題中的代碼示例是正確的,但在ActionEvent中存在歧義。 java.awt.event包中有一個同名的課程。您可能會意外(自動)導入它。驗證它是否確實是javax.faces.event.ActionEvent而不是別的。

如果沒有幫助,你可能要考慮的標準JSF 2.0 f:ajax更換PrimeFaces p:ajax

<f:ajax event="focus" listener="#{installationController.startCopyingWarFile}" /> 

public void startCopyingWarFile(AjaxBehaviorEvent event) { 
    // ... 
} 

其中AjaxBehaviorEventjavax.faces.event.AjaxBehaviorEvent

+0

廣告。 1:我的web.xml文件中有適當的條目。廣告。 2:這也不是問題。我確實導入了javax.faces.event.ActionEvent,並且在我的日誌文件中沒有關於錯誤的條目。 f:阿賈克斯似乎是正確的。但在f:ajax而不是「update」屬性中有「渲染」。可以「渲染」渲染組件在h:form組件之外嗎?我有一個錯誤,找不到組件「copingFilePhase」。我將在我原來的問題中附上代碼(編輯:代碼附後)。使用`:`前綴ID: – 2010-12-04 17:21:39