为什么commandButton actionListener不起作用?

时间:2014-10-28 02:38:37

标签: jsf-2 primefaces actionlistener

我在login.xhtml中有以下代码:

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

<h:head><title>Login</title></h:head>
<h:body>
    <h:form>
        <p:commandButton id="loginBtn"  value="Login" type="submit" actionListener="#{userMB.login}"/>
    </h:form>
</h:body>
</html>

我有以下bean:

@ManagedBean(name="userMB")
@RequestScoped
public class UsersManagedBean implements Serializable {
    public void login(ActionEvent event) {
        System.out.println("print here...");
    }
}

我没有打印邮件,因为login()方法尚未被调用。有什么不对吗?

web.xml文件是:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   id="WebApp_ID"
   version="2.5">    
<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>
 <servlet>
     <servlet-name>Faces Servlet</servlet-name>
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
     <load-on-startup>1</load-on-startup>
   </servlet>
 <servlet-mapping>
     <servlet-name>Faces Servlet</servlet-name>
     <url-pattern> *.xhtml</url-pattern>
   </servlet-mapping>
</web-app>

3 个答案:

答案 0 :(得分:1)

确保使用javax.faces.event.ActionEvent。

XHTML

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

    <h:head><title>Login</title></h:head>
    <h:body>
        <h:form>
            <p:commandButton id="loginBtn" 
                             value="Login" 
                             type="submit" 
                             actionListener="#{userMB.login}"/>
        </h:form>
    </h:body>
</html>

managedbean

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.ActionEvent;

@ManagedBean(name = "userMB")
@RequestScoped
public class UsersManagedBean implements Serializable {

    public void login(ActionEvent event) {
        System.out.println("print here...");
    }
}

答案 1 :(得分:1)

删除type="submit"

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

<h:head><title>Login</title></h:head>
<h:body>
    <h:form>
        <p:commandButton id="loginBtn" value="Login" action="#{userMB.login}"/>
    </h:form>
</h:body>
</html>

你的ManagedBean应该是这样的。

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.ActionEvent;

@ManagedBean(name = "userMB")
@RequestScoped
public class UsersManagedBean implements Serializable {

    public void login() {
        System.out.println("print here...");
    }
}

答案 2 :(得分:1)

我已将完整的示例login.xhtml页面复制到我的testproject,它运行正常。我自己创建的托管bean。

你是否试图避免使用素数?使用标准JSF实现并再试一次:

<h:commandButton id="loginBtn"  value="Login" type="submit" actionListener="#{userMB.login}"/>

请注意<h:的{​​{1}}而不是<p:

顺便说一句:commandButton是PrimeFaces中的默认设置,省略或使用值type="sumbit"的此属性(PrimeFaces用户指南5.1,第108页)不应有任何区别。