3

ページに表示されるすべてのものを準備する preRender 呼び出しを持つページがあります。関連性があるかどうかはわかりませんが、ページはエクスペリエンスに先行する index.xhtml からいくつかのパラメーターを受け取ります。

サーバー側のメソッド (正確には更新) を実行する必要がある commandButton があります。ページを更新する必要はありません。

だから私は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() と呼ばれる) が実行されると思われますが、パラメーターがないため (ビルドにはパラメーターを渡す必要があることに注意してください<f:param>)、何かバグが発生します。

結論: ボタンをクリックしたときに、何も更新したりリダイレクトしたりせずに、save メソッドを実行するだけで済みます。

アイデア?

- 編集 -

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>

契約の詳細.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);
        }
    }
}
4

1 に答える 1

2

これはうまくいきました。「表示」は、保存が成功したときに設定できるブール値です。

          <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>
于 2013-08-12T20:30:00.910 に答える