我有一個簡單的登錄形式的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");
}
}
人們想要[MCVE](https://stackoverflow.com/help/mcve)。對於這樣一個簡單的例子,我期望看到你已經用單一方法測試了一個具有單一支持bean的單一命令按鈕。如果您不能在簡單示例中重新創建問題,請逐漸添加更改,直到您可以,並且很可能您會回答自己的問題。 – DavidS
我有很多其他地方的commandButtons。這很簡單。除了兩個領域和一個單一的行動方法,我已經剝離了所有其他的東西。有一個單一的命令按鈕形式。支持bean只是getters/setters和登錄函數。有一些我錯過了。 –
如果你剝離了「其他所有東西」,但它仍然不起作用,那麼你還沒有足夠的剝離。 _Something_正在導致失敗。你應該能夠將它隔離爲「如果我這樣做了一件事,它就會失敗。」 – DavidS