【问题标题】:Ajax with CommandButton [duplicate]带有命令按钮的 Ajax [重复]
【发布时间】:2013-08-11 19:58:28
【问题描述】:

我有一个页面,它有一个 preRender 调用,它准备好要在页面中显示的所有内容。我不确定它是否相关,但该页面从体验之前的 index.xhtml 中接收了一些参数。

我有一个命令按钮,我需要执行一个服务器端方法(准确地说是更新)。无需刷新页面。

所以我正在使用 ajax。这是按钮的代码

<h:commandButton value="Save">
    <f:ajax event="click" listener="#{bean.save}"/>
</h:commandButton>

到目前为止,在java端,这是bean的save方法

public void save(){
    log.debug("Save executed!");
}

我添加了一些日志记录来检查正在执行的内容。当我单击按钮时,唯一发生的事情是 preRender 方法被执行(而不是全部,只是它的一部分)。没有其他事情发生。在视觉上,页面没有刷新或任何东西。

我怀疑当我单击按钮时,页面正在刷新,因此执行了 preRender 方法(称为 Build()),但是由于没有参数(记住 Build 需要通过 &lt;f:param&gt; 传递的参数),出了点问题。

底线:我只需要在单击按钮时执行保存方法,而无需刷新或重定向任何内容。

想法?

--编辑--

INDEX.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:c="http://java.sun.com/jstl/core">
<ui:define name="body">
<h:link outcome="agreementDetail.xhtml" value="EA-15558">
                <f:param name="serviceId" value="EA-15558" />
                <f:param name="site" value="NIC" />
            </h:link>
 </ui:define>

</html>

AgreementDetail.XHTML

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <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:c="http://java.sun.com/jstl/core">

             <f:view>
                <f:event type="preRenderView" listener="#{agreement.build}"/>
            </f:view>
  <ui:define name="body">
    <f:view>
                    <h:form>
    <h:commandButton value="Save" action="#{agreement.save}">
                            <f:ajax/>
                        </h:commandButton><br/><br/>
    <h:dataTable value="#{agreement.licenseServerNames}" var="licenseServerName">
                            <h:column>
                                <h:inputText value="#{licenseServerName}"/>
                            </h:column>
                        </h:dataTable>
</h:form>
            </f:view>
  </ui:define>        


</html>

AgreementBean.java

@ManagedBean(name="agreement")
@RequestScoped
public class AgreementBean {

@ManagedProperty("#{param.serviceId}")
    private String serviceId;

    @ManagedProperty("#{param.site}")
    private String site;

private List<String> licenseServerNames; //GETTERS AND SETTERS OMITTED TO AVOID EXCESS CODE

@PostConstruct
    public void build(){
        logger.debug("START");
        methodOne();    
                logger.debug("END");        
    }

public void save(){
        logger.debug("SAVE!!!!!");
        for(String name : licenseServerNames){
            logger.debug("Servername = "+name);
        }
    }
}

【问题讨论】:

  • #{bean.save} 方法调用作为&lt;h:commandButton&gt; 的操作移动并删除&lt;f:ajax&gt; 中的所有内容,保持干净。
  • 我做到了,但没有任何改变。唯一执行的是 preRendered 方法调用,同样,该方法没有完成。记录器在 Build() 方法上有一个“开始”和一个“结束”。我得到的只是“开始”,但没有“结束”。
  • 编辑您的问题并提供SSCCE您的问题以供进一步分析
  • 添加了 SSCCE。如果你看到了什么,请告诉我。
  • 尝试将您的 bean 从 @RequestScoped 更改为 @ViewScoped 并重试。

标签: jsf jsf-2


【解决方案1】:

这对我有用。“显示”是一个布尔值,您可以在成功保存时设置。

          <h:commandButton id="ajax" value="Save" action="{agreement.save}" >
                            <f:ajax execute="@form" render="@form" />
              </h:commandButton>
            <h:outputScript rendered="#{agreement.show}">alert("save");</h:outputScript>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2021-09-26
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多