【问题标题】:p:commandButton not invoking actionp:commandButton 不调用动作
【发布时间】:2015-09-04 10:57:16
【问题描述】:

我有一个简单的登录表单中的 p:commandButton。动作没有触发。我已经验证了控制器和函数是否存在,检查了嵌套的 f:forms,将所有内容都包含在 f:view 中,删除了验证要求,但该操作没有触发。

动作侦听器只是设置登录标志,然后页面刷新为新的渲染。如果我直接引用侦听器函数,它会触发,但不会从 commandButton 触发。

这是控制器 bean:

@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>

更新

好的,很抱歉在 cmets 中发布了 sn-ps。我通常为自己解决问题。这是我第一次不得不寻求帮助,而且我不熟悉发帖。不是 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。对于这样一个简单的示例,我希望看到您已经使用单个方法测试了单个表单中的单个命令按钮和单个 backing-bean。如果您无法在简单示例中重现问题,请逐渐添加更改,直到可以为止,并且很有可能您已经回答了自己的问题。
  • 这里是被剥离的 html:
    `跨度>
  • 显然是什么导致了失败。我不是新手。我已经找到了解决比这更复杂的事情的方法,但是这里缺少一些东西。你是要帮我还是一直告诉我我有问题?
  • FWIW,这是我第一次在这里发布问题。另一方面,我已经在这里搜索并找到了数千次答案。
  • 无论我去掉什么,我都无法解决问题。我没有故意删除 styleClass,可能在编辑中丢失了它。

标签: jsf primefaces action


【解决方案1】:

您的命名空间声明可能存在问题。您使用过:

<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">

说实话,我不熟悉这些命名空间声明的工作原理,所以我不知道这是否或为什么会有所作为。我本来想把它放在评论中,但它太长了。

【讨论】:

  • 没有区别。我只需要暂时离开这件事,然后再做一遍。
  • 这很奇怪。它确实对我有影响,但是,就像我说的,我不确定命名空间是如何工作的,所以我想我不应该对它没有解决你的问题感到惊讶。我会把我的答案留在这里作为证据。
  • @LokiSmokes:“……暂时远离这个,然后再做一遍。”这是一个好主意,但只是为了强调这基本上是创建 MCVE 的方式:从头开始并重现问题。
猜你喜欢
  • 2017-11-23
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
相关资源
最近更新 更多