【问题标题】:a4j:commandButton doesn't worka4j:commandButton 不起作用
【发布时间】:2012-04-10 12:48:00
【问题描述】:

我是 JSF 和 RichFaces 的新手。 我有一个按钮应该调用 bean 上的方法。当我使用

<h:commandButton action="#{loginBean.userLogin}" value="Login" />

它工作正常,但是当我点击

<a4j:commandButton action="#{loginBean.userLogin}" value="Login" />

什么都没有发生。

我的 bean 代码:

public class LoginBean {

@Size(min = 2, max = 20, message = "Must be betwen 2 and 20 chars")
private String          login;
@Size(min = 1, message = "Please Enter your password")
private String          password;

//getters and setters

public String userLogin() {
    //user login code

}
}

我的 JSP 页面代码:

<body>
<f:view>
<div >
   <h:form id="loginForm">
       <h:panelGrid columns="3">
           <h:outputLabel for="login" value="Login:" />
           <h:inputText id="login" value="#{loginBean.login}" >

           </h:inputText>
           <rich:message for="login" />

           <h:outputLabel for="password" value="Password:" />
           <h:inputSecret id="password" value="#{loginBean.password}" />
           <rich:message for="password" />
       </h:panelGrid>

        <div>
            <h:commandButton action="#{loginBean.login}" value="Login" />
            <a4j:commandButton action="#{loginBean.login}" value="Login" />
        </div>
        <div>
            <a href="<%= request.getContextPath() %>/registration.jsf">Registration</a>
        </div>
    </h:form>
</div>
</f:view>
</body>

如您所见,我什至添加了两个按钮。一个工作正常,第二个什么都不做。

UPD:一开始我没有使用 RichFaces,我的应用程序运行良好。所以我猜导航规则等都很好。不起作用的是我刚刚添加的 a4j:commandButton。

UPD2:这是我的 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<display-name>webappsaichuk</display-name>
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<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>*.jsf</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>

<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

【问题讨论】:

  • 你能添加你的支持 bean 代码吗?
  • 添加了 bean 和页面代码

标签: java ajax jsf richfaces


【解决方案1】:

您的方法的名称必须与您的属性不同。

public class LoginBean {

    @Size(min = 2, max = 20, message = "Must be betwen 2 and 20 chars")
    private String login;
    @Size(min = 1, message = "Please Enter your password")
    private String password;

    //getters and setters...

    public String userLogin() {
        //user login code
    }
}
<h:inputText id="login" value="#{loginBean.login}" styleClass="rowInput">
<h:commandButton action="#{loginBean.userLogin}" value="Login" />
<a4j:commandButton action="#{loginBean.userLogin}" value="Login" />

更新

您应该将 RichFaces 过滤器添加到 web.xml(基于 Getting started with RichFaces):

<!-- some context params to get better performance for RichFaces -->
<context-param>
    <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>org.ajax4jsf.SKIN</param-name>
    <param-value>classic</param-value>
</context-param>
<context-param>
    <param-name>org.ajax4jsf.handleViewExpiredOnClient</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>org.richfaces.LoadScriptStrategy</param-name>
    <param-value>ALL</param-value>
</context-param>
<context-param>
    <param-name>org.richfaces.LoadStyleStrategy</param-name>
    <param-value>ALL</param-value>
</context-param>
<!-- main filter for RichFaces -->
<filter>
    <display-name>Ajax4jsf Filter</display-name>
    <filter-name>ajax4jsf</filter-name>
    <filter-class>org.ajax4jsf.Filter</filter-class>
</filter>

<filter-mapping>
    <filter-name>ajax4jsf</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
</filter-mapping>

【讨论】:

  • @MaxSaichuk 你为你的 JSP 页面写了导航规则吗?
  • 当然。起初我没有使用 RichFaces,我的应用程序运行良好。我试图添加 RichFaces。旧功能仍然可以正常工作。不起作用的是 a4j:commandButton
  • 很多代码。它使用了我创建的几个类。它实际上做的是从数据库中获取用户,检查输入的密码是否正确,使用 FacesContext.addMessage() 方法附加一条消息并返回所需导航规则的字符串
  • @MaxSaichuk AFAIK 问题可能出在您的代码中,或者 web.xml 缺少 RichFaces 的全部或部分配置。也许如果您发布该文件,社区可以提供帮助。
  • 作为 UPD2 添加到主题中的主消息
【解决方案2】:

a4j:commandButton 是一个 ajax 提交。因此,除非您重新渲染根据操作更改的屏幕部分,否则不会发生任何事情。

【讨论】:

  • 他的“登录”函数返回一个String,因此a4j:commandButton 将执行ajax 提交并继续导航规则。
  • 在我的 userLogin() 方法中,我从数据库中进行了 SELECT。我将我的应用程序部署到 JBoss 6。在执行操作时 - 我可以在日志中看到 SELECT。所以我确定我的 a4j:commandButton 没有做任何事情。
  • 有趣。我不确定重点是什么。但如果是这种情况,那么它仍然应该为验证消息重新渲染屏幕的一部分。
猜你喜欢
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
相关资源
最近更新 更多