2015-06-18 26 views
-1

我有一個簡單的登錄形式的p:commandButton。行動沒有解僱。我已驗證控制器和函數存在,檢查嵌套的f:窗體,將所有內容都包含在f:view中,取消了驗證要求,但操作不會觸發。p:commandbutton不調用動作

動作偵聽器只設置登錄標誌,然後頁面刷新爲新渲染。如果我直接引用偵聽器函數,它會觸發,但不會從commandButton觸發。

這裏的控制器豆:

@ManagedBean(name = "uiController") 
@SessionScoped 
public class UiController implements Serializable { 

private Boolean isLoggedIn; 
private String userName; 
private String password; 

public UiController() { 
    isLoggedIn = false; 
} 

public String getUserName() { 
    return userName; 
} 

public void setUserName(String userName) { 
    this.userName = userName; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public Boolean getIsLoggedIn() { 
    return isLoggedIn; 
} 

public String getLoginLogoTopLine() { 
    return "Yoyodyne"; 
} 

public String getLoginLogoBottomLine() { 
    return "Corporation"; 
} 

public void login() { 
    isLoggedIn = true; 
} 

} 

這裏的HTML:

<h:head> 
    <h:outputStylesheet library="css" name="jsfcrud.css"/> 
    <h:outputStylesheet library="css" name="transend-ui.css"/> 
    <h:outputScript library="js" name="jsfcrud.js"/> 
</h:head> 
<h:body id="enchilada"> 
    <f:view> 
     <p:growl id="growl" life="3000" /> 
     <h:panelGroup id="loginContainer" styleClass="ts-page-container ts-login-container" rendered="#{!uiController.isLoggedIn}"> 
      <h:panelGroup styleClass="ts-northwest-container"> 
       <h:outputText value="#{uiController.loginLogoTopLine}" styleClass="ts-login-logo-top" /> 
       <h:outputText value="#{uiController.loginLogoBottomLine}" styleClass="ts-login-logo-bottom" /> 
      </h:panelGroup> 
      <h:panelGroup styleClass="ts-centered-container"> 

       <h:form id="LoginForm"> 
        <h:inputHidden value="#{shipperCode}" /> 
        <p:panelGrid styleClass="ts-login-panel"> 
         <p:row> 
          <p:column styleClass=""> 
           <p:panelGrid styleClass=""> 
            <p:row> 
             <p:column> 
              <p:outputLabel styleClass="ts-login-prompt" value="#{bundle.LoginLabel_userName}" for="userName" /> 
             </p:column> 
             <p:column> 
              <p:inputText value="#{uiController.userName}" id="userName" title="#{bundle.LoginTitle_userName}"/> 
             </p:column> 
            </p:row> 
            <p:row> 
             <p:column> 
              <p:outputLabel styleClass="ts-login-prompt" value="#{bundle.LoginLabel_password}" for="password" /> 
             </p:column> 
             <p:column> 
              <p:inputText value="#{uiController.password}" id="password" title="#{bundle.LoginTitle_password}"/> 
             </p:column> 
            </p:row> 
           </p:panelGrid> 

          </p:column> 
          <p:column> 
           <p:commandButton action="#{uiController.login}" value="login" oncomplete="window.location.replace(window.location.href);"/> 
          </p:column> 
         </p:row> 
        </p:panelGrid> 
       </h:form> 
       <h:messages /> 
      </h:panelGroup> 
     </h:panelGroup> 
     <h:panelGroup id="mainContainer" styleClass="ts-page-container ts-main-container" rendered="#{uiController.isLoggedIn}"> 
     </h:panelGroup> 
    </f:view> 
</h:body> 

UPDATE

在評論張貼片段OK遺憾。我通常爲自己工作。這是我第一次不得不尋求幫助,我不熟悉發佈。不是Java的新手,絕對是一個新手。

這是我現在有一個HTML:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:f="http://xmlns.jcp.org/jsf/core" 
     xmlns:p="http://primefaces.org/ui"> 
    <h:head> 
    </h:head> 
    <h:body id="enchilada"> 
     <f:view> 
      <h:form id="LoginForm"> 
       <p:commandButton action="#{uiController.login}" value="login"/> 
      </h:form> 
     </f:view> 
    </h:body> 

</html> 

這裏的豆:

@ManagedBean(name = "uiController") 
    @SessionScoped 
    public class UiController implements Serializable { 

    public void login() { 
     System.out.println("login invoked"); 
    } 
} 
+1

人們想要[MCVE](https://stackoverflow.com/help/mcve)。對於這樣一個簡單的例子,我期望看到你已經用單一方法測試了一個具有單一支持bean的單一命令按鈕。如果您不能在簡單示例中重新創建問題,請逐漸添加更改,直到您可以,並且很可能您會回答自己的問題。 – DavidS

+0

我有很多其他地方的commandButtons。這很簡單。除了兩個領域和一個單一的行動方法,我已經剝離了所有其他的東西。有一個單一的命令按鈕形式。支持bean只是getters/setters和登錄函數。有一些我錯過了。 –

+0

如果你剝離了「其他所有東西」,但它仍然不起作用,那麼你還沒有足夠的剝離。 _Something_正在導致失敗。你應該能夠將它隔離爲「如果我這樣做了一件事,它就會失敗。」 – DavidS

回答

0

有可能是您的命名空間聲明的一個問題。您已經使用:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:f="http://xmlns.jcp.org/jsf/core" 
     xmlns:p="http://primefaces.org/ui"> 

替換上面:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:f="http://java.sun.com/jsf/core"> 

說實話,我不熟悉這些名稱空間聲明是如何工作的,所以我不知道是否或爲什麼會做出改變。我會在評論中提出這個問題,但時間太長。

+0

沒有區別。我只需要離開這一段時間然後做完。 –

+0

這很奇怪。它確實對我有所幫助,但就像我說的,我並不確定名稱空間是如何工作的,所以我想我不應該感到驚訝,它並不能解決您的問題。我會在這裏留下我的答案作爲證據。 – DavidS

+0

@LokiSmokes:「......離開這一段時間,然後結束。」這是一個好主意,但僅僅強調這基本上就是你如何創建一個MCVE:你從頭開始並重現問題。 – DavidS

相關問題