0

持っているフォームに問題があります。フォームを使用すると、ユーザーはいくつかのテキスト ボックスに情報を入力できます。次に、[検索] と [リセット] の 2 つのボタンがあります。

フォームコード:

<h:outputText value="Search by Author Name" styleClass="p" />

<div class="investigatorTab">

    <h:outputLabel for="firstName" rendered="true" value="First Name" />
    <h:inputText value="#{pubBacker.firstName}"></h:inputText>

    <h:outputLabel for="lastName" rendered="true" value="Last Name" />
    <h:inputText value="#{pubBacker.lastName}"></h:inputText>

</div>

<div class="buttons">
    <p:commandButton value="Submit" styleClass="submitButton" action="#{pubBacker.submit}" update="tabs" />
    <p:commandButton value="Reset" type="button" actionListener="#{pubBacker.clearEntries}" onclick="clearForm(this.form);" />
</div>

私が抱えている問題は、検索ボタンをクリックすると結果ページに移動し、検索ページに戻ると、Bean がセッションであるため、テキスト フィールドで検索したデータがまだ残っていることです。スコープ。[リセット] ボタンをクリックして、テキスト フィールドのデータをクリアできるようにしたいと考えています。

現在、以下のコードで [リセット] ボタンをクリックすると、検索ボタンが機能しなくなり、firebug コンソールでこのエラーが表示されます

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><error><error-name>class javax.faces.application.ViewExpiredException</error-name><error-message><![CDATA[viewId:/ccadmin/pubManagement.xhtml - View /ccadmin/pubManagement.xhtml could not be restored.]]></error-message></error></partial-response>

onclick="clearForm(this.form);"2 番目の からを削除するp:commandButtonと、フォームは正常に機能します。

JS 関数を呼び出すとビューが期限切れになる理由はありますか?

パブリケーション Bean:

@ManagedBean(name="pubBacker")
@SessionScoped
public class Publication {

    public Publication() {}

    public void clearEntries() {
        new Publication();
    }
}
4

1 に答える 1

1

を盲目的にループすることで、フォームのすべての要素をクリアしているようform.elementsです。このようにしjavax.faces.ViewStateて、JSFによって自動的に含まれる非表示の入力フィールドもクリアされるため、JSFは空の値を取得し、サーバー側で関連するビューステートを見つけることができなくなります。これは最終的にはになりViewExpiredExceptionます。

フォームをクリアするためにJSを使用するのではなく、JSFのみを使用することをお勧めします。フォームを表すモデルがあると簡単です。

<div class="investigatorTab">
    <h:outputLabel for="firstName" rendered="true" value="First Name" />
    <h:inputText value="#{pubBacker.pub.firstName}"></h:inputText>

    <h:outputLabel for="lastName" rendered="true" value="Last Name" />
    <h:inputText value="#{pubBacker.pub.lastName}"></h:inputText>
</div>

<div class="buttons">
    <p:commandButton value="Submit" styleClass="submitButton" action="#{pubBacker.submit}" update="tabs" />
    <p:commandButton value="Reset" action="#{pubBacker.clear}" process="@this" update="@form" />
</div>

process="@this"、これはフォームの入力値を処理しないため、それらを検証しないことに注意してください)

public void clear() {
    pub = new Pub();
}
于 2012-02-03T18:28:44.973 に答える