为什么a4j:commandButton在第一次点击时没有反应?

时间:2011-12-19 16:52:15

标签: ajax jsf richfaces

有人可以解释为什么 a4j:commandButton 在下一个场景中第一次点击时没有反应吗? 为了让行动得以执行,我必须打两次......

facelets复合模板,名为principal.xhtml:

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE html>


      <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:ui="http://java.sun.com/jsf/facelets"
                xmlns:a4j="http://richfaces.org/a4j"
                xmlns:rich="http://richfaces.org/rich">


                <f:view contentType="text/html">

                          <h:head>
                                    <meta http-equiv="content-type" content="text/xhtml; charset=UTF-8" />
                          </h:head>

                          <h:body>

                                    <div id="heading">
                                              <ui:insert name="heading">
                                                        <ui:include src="/adm/includes/menu.xhtml"/>
                                              </ui:insert>
                                    </div>

                                    <div id="content">
                                              <br />
                                                        <a4j:outputPanel ajaxRendered="true">
                                                                  <ui:insert name="content"/>
                                                        </a4j:outputPanel>
                                              <br />
                                    </div>   

                                    <div id="footer">
                                              <ui:insert name="footer">
                                                        <ui:include src="/adm/includes/footer.xhtml"/>
                                              </ui:insert>
                                    </div>

                          </h:body>

                </f:view>
      </html>

带有问题的ajax按钮的JSF页面:

                <ui:composition template="/adm/templates/principal.xhtml">
                          <ui:define name="content">
                                    <rich:panel header="#{msgs.usuariosNuevo}">

                                              <h:form id="formUsuariosNuevo" prependId="false">


                                                        <h:panelGrid columns="3">

                                                                  <h:outputText value="#{msgs.email}" />
                                                                  <h:inputText value="#{usuarioCtrl.mdl.email}" id="email" />

                                                                  <h:outputText value="#{msgs.pwd}" />
                                                                  <h:inputSecret value="#{usuarioCtrl.mdl.pwd}" id="pwd"  />

                                                        </h:panelGrid>


                                                        <a4j:commandButton value="#{msgs.guardar}" action="#{usuarioCtrl.guardarUsuarioAction}" />

                                              </h:form>

                                    </rich:panel>
                          </ui:define>
            </ui:composition>

...和'顶部'工具栏菜单menu.xhtml:

<h:form prependId="false" id="formMenu">

    <rich:toolbar height="26px">                                                                                        

        <rich:dropDownMenu mode="ajax">
            <f:facet name="label">
                <h:panelGroup>
                    <h:graphicImage value="/resources/img/icon/usuarios.png" styleClass="pic" width="20" height="20" />                         
                    <h:outputText value="Usuarios" />
                </h:panelGroup>
            </f:facet>
            <rich:menuItem label="Nuevo" action="#{menuCtrl.usuariosNuevoAction}" icon="/resources/img/icon/nuevo.png" />
            <rich:menuItem label="Gestión" action="#{menuCtrl.usuariosGestionAction}" icon="/resources/img/icon/gestion.png" />                                 
        </rich:dropDownMenu>        

        <!-- Others dropDownsMenu's here ... -->            

    </rich:toolbar>
</h:form>

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为当您使用JSF @ManagedBean时会出现问题。您需要在当前流中声明表单bean变量。

我正在使用Richfaces 4.2,Spring-web-flow 2.3.0,Spring 3.1.1

<强>的formbean

@RequestScoped
@ManagedBean
public class SearchForm implements Serializable {
    private static final long serialVersionUID = 1L;

    private String pattern = "Please insert";

    public String getPattern() {
        return pattern;
    }

    public void setPattern(String pattern) {
        this.pattern = pattern;
    }
}

主-flow.xml

<var name="searchForm" class="com.inhouse.web.form.SearchForm"/>

    <view-state id="home" view="home.xhtml" model="searchForm">
        <transition on="search">
            <evaluate expression="searchController.search(requestParameters.pattern)" result="flashScope.searchResults"></evaluate>
        </transition>
</view-state>

<强> home.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:sf="http://www.springframework.org/tags/faces"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">
<ui:composition template="/WEB-INF/layouts/template.xhtml">
    <ui:define name="content">
        <h:form>
            <h:inputText value="#{searchForm.pattern}" />
            <a4j:commandButton action="search" value="Search" render="searchResult" immediate="true">
                <f:param name="pattern" value="#{searchForm.pattern}"></f:param>
            </a4j:commandButton>
        </h:form>

        <h:panelGroup id="searchResult">
            <h:outputText value="#{searchResults}" />
        </h:panelGroup>
    </ui:define>
</ui:composition>
</html>

<强>控制器

@Controller
public class SearchController {
    public String search(String pattern) {

        return "this is the search results";
    }
}