16

commandButton の問題に直面しています。タイプが送信の場合にのみ機能します。誰かが見て、その解決策があるかどうか教えてもらえますか? 以下のコードは非常にシンプルで、必要なものを説明するための提案があります。メソッド test() は実行されません。メソッド runSubmit が正常に実行されました。

元のページには送信中に実行される検証があるため、送信せずにテストメソッドを実行する必要があります.test()メソッドは、送信前の予備操作であるため、送信せずに実行する必要があります.

私は PrimeFaces 4.0、JDK 7、Tomcat 6、および JSF 2.0 (Apache) を使用していますが、Mojarra でも同様に発生していると思います。

    SESSION:

package com.andre.bean;

public class AndreBean {

public void runSubmit() {
System.out.println("Submit executed");
}

public String test() {
System.out.println("Not submit executed");
return "true";
}

}

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> 
</h:head>

<h:form id="test">
<p:commandButton id="ns" value="not submit" type="button" action="#{andreBean.test}" ajax="false"></p:commandButton>
<p:commandButton id="s" value="submit" action="#{andreBean.runSubmit}"></p:commandButton>

</h:form> 

</html>

どうもありがとうアンドレ

4

3 に答える 3

36

どうしたの?

得られるのは正しい動作です。type="button"を指定した PrimeFaces ボタンは、基本的な HTML と同じように機能します。リクエストは発生しません。PrimeFaces のユーザー ガイドには次のように書かれています。

プッシュ ボタンは、ajax/非 ajax リクエストを発生させずにカスタム JavaScript を実行するために使用されます。プッシュ ボタン セット タイプを「ボタン」として作成します。

<p:commandButton type="button" value="Alert" onclick="alert('Prime')" />

Bean と「対話」したい場合は、type="submit" (p:commandButton のデフォルト) を使用する必要があります。ただし... HTML での送信ボタンの動作とは対照的に、PrimeFaces では、そのような送信によって新しいページへのリダイレクトが強制されることはありませんが、すべての通信は基礎となる AJAX 要求によって処理されます。

したがって、2 番目のボタンのみが Bean のメソッドを実行します。

<p:commandButton id="s" value="submit" action="#{andreBean.runSubmit}" />

何を手に入れたかったのでしょうか?

すべてのフォームを Bean に送信したくない場合は、p:commandButton の「プロセス」属性で処理されるコンポーネントの範囲を制限できます。

<h:form id="test">
    <p:inputText value="#{andreBean.value}"/>
    <p:commandButton id="s" value="submit" action="#{andreBean.runSubmit}" process="@this" />
</h:form>

次の Bean を使用すると、違いがわかります。

public class AndreBean {

    private String value;

    public void runSubmit() {
        System.out.println("Submit executed");
    }

    public String getValue() {
        System.out.println("getValue");
        return value;
    }

    public void setValue(String value) {
        System.out.println("setValue: " + value);
        this.value = value;
    }

}

コンソールで実行されるコンポーネントを制限しないと、次のようになります。

getValue

setValue: foobar

Submit executed

...そして、 process="@this"のみに限定されたコンポーネントを使用すると、次のもののみが得られます。

Submit executed

それが役立つことを願っています。

于 2013-11-03T22:32:27.620 に答える
14

場合によっては、解決策が単純に addimmediate="true"であり、Bean アクションがトリガーされる JSF ライフサイクルのポイントが変更されます。

  • どのように、いつ使用するかについての記事は次のとおり です。
于 2014-09-01T11:16:20.257 に答える
-4

Bean とのバインディングを確認してください。

Bean フィールドは String または非プリミティブである必要があります。

于 2015-02-06T10:18:02.823 に答える